В недавнем бета-обновлении Vue 3 Composition API обе библиотеки Vue 3 и 3vue-next, или для перехода Vue 2@vue/composition-apiВ библиотеке один обновляется синхронноuseCSSModuleФункции — используются для поддержки синтаксиса модулей CSS в экземплярах Vue с использованием Composition API.
Сначала давайте посмотрим, что такое CSS-модули:
CSS Modules
CSS Modules — это система модульности и компоновки для CSS. vue-loader интегрирует модули CSS в качестве альтернативы эмуляции CSS с ограниченной областью действия.
Включить CSS-модули
Если это проект, созданный с помощью vue cli, эта функция должна быть включена по умолчанию; если проект необходимо включить вручную, установите ее следующим образом:
// webpack.config.js
{
module: {
rules: [
// ... 其它规则省略
{
test: /\.css$/,
use: [
'vue-style-loader',
{
loader: 'css-loader',
options: {
// 开启 CSS Modules
modules: true,
// 自定义生成的类名
localIdentName: '[local]_[hash:base64:8]'
}
}
]
}
]
}
}
Или используйте с другими препроцессорами:
// webpack.config.js -> module.rules
{
test: /\.scss$/,
use: [
'vue-style-loader',
{
loader: 'css-loader',
options: { modules: true }
},
'sass-loader'
]
}
затем в компоненте<style>Добавьте функцию модуля в:
<style module>
.red {
color: red;
}
.bold {
font-weight: bold;
}
</style>
Доступ к модулям CSS в компонентах
существует<style>После добавления модуля к вышеуказанному вычисляемое свойство с именем $style будет автоматически внедрено в компонент.
<template>
<div>
<p :class="$style.red">
hello red!
</p>
</div>
</template>
Поскольку это вычисляемое свойство, синтаксис объект/массив :class также поддерживается:
<template>
<div>
<p :class="{ [$style.red]: isRed }">
Am I red?
</p>
<p :class="[$style.red, $style.bold]">
Red and bold
</p>
</div>
</template>
Также доступно через JavaScript:
<script>
export default {
created () {
console.log(this.$style.red)
}
}
</script>
Традиционное использование Vue 2.x
В компоненте API опций:
<template>
<span :class="$style.span1">hello 111 - {{ text }}</span>
</template>
<script>
export default {
props: {
text: {
type: String,
default: ''
}
}
};
</script>
<style lang="scss" module>
.span1 {
color: red;
font-size: 50px;
}
</style>
Для компонентов JSX, поскольку нет возможности использовать стили с ограниченной областью действия, CSS-модули являются хорошим выбором:
<script>
export default {
props: {
text: {
type: String,
default: ''
}
},
render(h) {
return <span class={this.$style.span1}>hello 222 - {this.text}</span>;
}
};
</script>
<style lang="scss" module>
.span1 {
color: blue;
font-size: 40px;
}
</style>
USECSSModule в Vue 3.x
С введением функции useCSSModule появилось стандартное решение для использования модулей CSS в компонентах API композиции:
<template>
<span :class="$style.span1">hello 333 - {{ text }}</span>
</template>
<script>
import { useCSSModule } from '@vue/composition-api';
export default {
props: {
text: {
type: String,
default: ''
}
},
setup(props, context) {
const $style = useCSSModule();
return {
$style
};
}
};
</script>
<style lang="scss" module>
.span1 {
color: green;
font-size: 30px;
}
</style>
Реализация его исходного кода также очень проста, просто возьмите this.$style:
export const useCSSModule = (name = '$style'): Record<string, string> => {
const instance = getCurrentInstance()
if (!instance) {
__DEV__ && warn(`useCSSModule must be called inside setup()`)
return EMPTY_OBJ
}
const mod = (instance as any)[name]
if (!mod) {
__DEV__ &&
warn(`Current instance does not have CSS module named "${name}".`)
return EMPTY_OBJ
}
return mod as Record<string, string>
}
Пользовательское имя внедрения модулей CSS
Наблюдая за исходным кодом useCSSModule, кажется, что имя модуля CSS может быть чем-то большим, чем просто$style; действительно, в файле .vue может быть определено более одного<style module>, чего можно добиться, установив значение атрибута модуля:
<style module="a">
/* 注入标识符 a */
</style>
<style module="b">
/* 注入标识符 b */
</style>
--End--
Посмотреть больше хороших статей о внешнем интерфейсе
Пожалуйста, найдите немного жизни и подпишитесь на публичный номер
Пожалуйста, укажите источник