# 单文件组件 @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
red
```
#### CSS Modules 与组合式 API 一同使用 @css-module-composition-api
可以通过 `useCssModule` API 在 `setup()` 和 `
```
这个语法同样也适用于 `
hello
```