# 单文件组件 @single-file-component ## \ ``` ### 单文件组件中方法兼容性 @single-file-component-script-methods #### defineProps 仅支持数组字面量、对象字面量定义(等同于 `options` 中的 `props`规则)及使用纯类型参数的方式来声明。 ```ts // 数组字面量 defineProps(['str', 'num', 'bool', 'arr', 'obj', 'fn']) // 对象字面量 defineProps({ str: String, num: Number, bool: { type: Boolean, default: true }, arr: { type: Array as PropType, default: () : string[] => [] as string[] }, obj: { type: Object as PropType, default: () : UTSJSONObject => ({ a: 1 }) }, fn: { type: Function as PropType<() => string>, default: () : string => '' } }) // 纯类型参数 defineProps<{ str : String, num : Number, bool : Boolean, arr : PropType, obj : PropType, fn : PropType<() => string> }>() ``` - `defineEmits` 仅支持数组字面量和纯类型参数的方式来声明。 ```ts // 数组字面量 const emit = defineEmits(['change']) // 纯类型参数 const emit = defineEmits<{ (e : 'change', id : number) : void }>() const emit = defineEmits<{ // 具名元组语法 change : [id: number] }>() ``` #### defineOptions 仅支持对象字面量方式定义。 ```ts defineOptions({ data() { return { count: 0, price: 10, total: 0 } }, computed: { doubleCount() : number { return this.count * 2 }, }, watch: { count() { this.total = this.price * this.count }, }, methods: { increment() { this.count++ } } }) ``` #### defineExpose 仅支持对象字面量方式定义,导出的变量或方法,必须是 `setup` 中定义的,暂不支持外部定义。 ```ts ``` ## CSS 功能 @css ### style 标签 @style ```vue ``` ### Class 与 Style 绑定 @class-style - [参见](https://uniapp.dcloud.net.cn/tutorial/vue3-basics.html#class-%E4%B8%8E-style-%E7%BB%91%E5%AE%9A) - `uni-app x` 支持绑定 `UTSJSONObject` 和 `Map` 类型数据。 - 在App-Android平台上 `Map` 的性能高于 `UTSJSONObject` 数据类型。从 `uni-app x 4.01` 起,Web平台也支持了 `Map` 类型绑定。 ### 深度选择器 @scoped > 处于 `scoped` 样式中的选择器如果想要做更“深度”的选择,也即:影响到子组件,可以使用 `:deep()` 这个伪类: ```vue ``` ### CSS Modules @css-module 一个 ` ``` 得出的 class 将被哈希化以避免冲突,实现了同样的将 CSS 仅作用于当前组件的效果。 #### CSS Modules 自定义注入名称 @css-module-custom-injection 你可以通过给 `module` attribute 一个值来自定义注入 class 对象的属性名: ```vue ``` #### CSS Modules 与组合式 API 一同使用 @css-module-composition-api 可以通过 `useCssModule` API 在 `setup()` 和 ` ``` 这个语法同样也适用于 ` ```