Skip to content

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 本身仍然是静态的。自定义属性会通过内联样式的方式应用到组件的根元素上,并且在源值变更的时候响应式地更新。

v-memo 指令