Vue3 新特性
CSS Modules
一个 <style module>
标签会被编译为 CSS Modules 并且将生成的 CSS class 作为 $style
对象暴露给组件:
vue
<template>
<p :class="$style.red">This should be red</p>
</template>
<style module>
.red {
color: red;
}
</style>
得出的 class
将被哈希化以避免冲突,实现了同样的将 CSS 仅作用于当前组件的效果。
自定义注入名称
你可以通过给 module attribute 一个值来自定义注入 class 对象的属性名:
vue
<template>
<p :class="classes.red">red</p>
</template>
<style module="classes">
.red {
color: red;
}
</style>
与组合式 API 一同使用
可以通过 useCssModule
API 在 setup()
和 <script setup>
中访问注入的 class。对于使用了自定义注入名称的 <style module>
块,useCssModule
接收一个匹配的 module attribute 值作为第一个参数:
ts
import { useCssModule } from 'vue'
// 在 setup() 作用域中...
// 默认情况下,返回 <style module> 的 class
useCssModule()
// 具名情况下,返回 <style module="classes"> 的 class
useCssModule('classes')
示例:
vue
<script setup lang="ts">
import { useCssModule } from 'vue'
const classes = useCssModule()
</script>
<template>
<p :class="classes.red">red</p>
</template>
<style module>
.red {
color: red;
}
</style>
CSS 中的 v-bind()
单文件组件的 <style>
标签支持使用 v-bind
CSS 函数将 CSS 的值链接到动态的组件状态:
vue
<script setup>
import { ref } from 'vue'
const theme = ref({
color: 'red',
})
</script>
<template>
<p>hello</p>
</template>
<style scoped>
p {
color: v-bind('theme.color');
}
</style>
实际的值会被编译成哈希化的 CSS 自定义属性,因此 CSS 本身仍然是静态的。自定义属性会通过内联样式的方式应用到组件的根元素上,并且在源值变更的时候响应式地更新。