# uvue组件概述 uni-app x支持的组件包括: - 内置基础组件 - 自定义vue组件 - uts组件插件 除了微信小程序,其他平台不支持的小程序wxml组件。 支持[easycom](https://uniapp.dcloud.net.cn/component/index.html#easycom)。 内置组件比较简单,扩展组件的2种方式详细介绍下 - 自定义vue组件 在components目录新建一个uvue/vue文件,按vue组件规范编写代码。 组件界面通过uvue构造,script使用uts编写。 返回的类型是组件实例[ComponentPublicInstance](../vue/)。 - uts组件插件 `uts组件插件`的名称可能有点拗口,这是因为是相对于另一个分类`uts api插件`。 它们同属于`uts插件`,是[uni_modules](https://uniapp.dcloud.net.cn/plugin/uni_modules.html)。api插件指能力扩展,比如蓝牙api。而组件插件指界面元素扩展,比如video、map、lottie动画等。 uts组件插件,指把原生的、需要在界面上显示的、内嵌于页面中整体排版的组件,编写uts代码调用原生sdk,通过uni_modules插件的方式集成到uni-app项目中。比如 * lottie组件,使用uts调用原生的lottie sdk来开发组件,再引入页面中。[详见](https://ext.dcloud.net.cn/plugin?name=uni-animation-view) * video组件,其实官方的video,也是用uts组件插件实现的。[详见](https://gitcode.net/dcloud/uni-component/-/tree/master/uni_modules/uni-video) uts组件插件,主要用于原生sdk涉及界面时,将其封装为界面组件。当然uts组件也是全端支持的。上述lottie组件也支持web端。 在app端,它的内部界面是由原生sdk绘制的,而不是uvue代码绘制的。通过封装嵌入到uvue/nvue页面中。 一个uts插件都是可以同时兼容uni-app x和uni-app js引擎版的。目前js引擎版仅支持内嵌于nvue页面中。所以上述lottie组件也是可以在app-nvue页面中使用的。 uts组件的返回类型是dom元素[Element](../dom/element.md) uts组件插件的开发教程,[详见](https://uniapp.dcloud.net.cn/plugin/uts-component.html) **vue组件兼容性及注意事项:** ## props - 支持[对象方式](https://cn.vuejs.org/guide/components/props.html#props-declaration)声明。从4.0+ 支持字符串数组方式声明。使用字符串数组方式声明时,所有 prop 类型均为 any | null。 - 仅支持直接在 `export default` 内部声明,不支持其他位置定义后,在 `export default` 中引用。 - 复杂数据类型需要通过 `PropType` 标记类型,[详见](https://cn.vuejs.org/guide/typescript/options-api.html#typing-component-props)。 - `type` 不支持使用自定义的构造函数。 ```ts export default { // 字符串数组方式声明,所有 prop 类型均为 any | null props: ['num', 'str', 'obj', 'arr'] } ``` ```ts type Obj = { a: number } export default { props: { num: { type: Number, required: true }, str: { type: String, default: 'str', validator(value: string): boolean { return value.length > 0 } }, obj: { type: Object as PropType, default: (): Obj => ({ a: 1 } as Obj) }, arr: { type: Array as PropType, default: (): number[] => [1, 2, 3] } } } ``` ## 自定义组件 v-model 绑定复杂表达式 @v-model-complex-expression 自定义组件 `v-model` 绑定复杂表达式时,需要通过 `as` 指定类型。 ```ts ``` ## 自定义事件 - [v-model](https://uniapp.dcloud.io/tutorial/vue3-components.html#v-model-modifiers) 暂不支持 `capitalize` 修饰符。 ## 计算属性和侦听器 - [watch deep](https://uniapp.dcloud.net.cn/tutorial/vue3-basics.html#%E9%80%89%E9%A1%B9-deep) 不支持 - [监听对象中单个属性](https://uniapp.dcloud.net.cn/tutorial/vue3-basics.html#%E7%9B%91%E5%90%AC%E5%AF%B9%E8%B1%A1%E4%B8%AD%E5%8D%95%E4%B8%AA%E5%B1%9E%E6%80%A7) 不支持 ## 作用域插槽的类型 作用域插槽需在组件中指定插槽数据类型 ```ts // components/Foo.uvue import { SlotsType } from 'vue' export default { slots: Object as SlotsType<{ default: { msg: string } }> } // page.uvue ``` ## ref 在 `uni-app js 引擎版`中,非 `Web端` 只能用于获取自定义组件,不能用于获取内置组件实例(如:`view`、`text`)。\ 在 `uni-app x` 中,内置组件会返回组件根节点的引用,自定义组件会返回组件实例。 **注意事项:** - 如果多个节点或自定义组件绑定相同 `ref` 属性,将获取到最后一个节点或组件实例的引用。 - 在 `v-for` 循环时,绑定 `ref` 属性会获取到节点或组件实例的集合。 - 在 `uni-app x` 中,要访问 `$refs` 中的属性,需要使用索引方式。 ::: preview > uni-app js 引擎版 ```ts ``` > uni-app x ```ts ``` ::: ## 监听页面生命周期 目前暂不支持在组件内监听页面生命周期,待后续支持组合式 API 后,可通过组合式 API 实现。 ## vue 与 uvue 不同文件后缀的优先级 @priority 新建组件时,默认组件的后缀名为.uvue,但也支持.vue。 .vue里面写uvue的语法,可以正常被.uvue页面引用和编译。 .vue里写条件编译,可以制作同时满足uni-app和uni-app x的组件。 当你手动import或easycom手动配置规则,可以指定文件名后缀。比如`import PageHead from '@/components/page-head.uvue'` 但如果未明确指定组件后缀名的情况,且同一个组件目录下即存在.vue文件、又存在.uvue文件, 此时 `vue` 组件和 `uvue` 组件的优先级如下: - 在 `uni-app x` 中,优先使用 `uvue` 组件,如果不存在 `uvue` 组件,则使用 `vue` 组件。 - 在 `uni-app` 中,只支持使用 `vue` 组件。 ## 调用组件方法@methods 需要把组件分为 内置组件、easycom组件、非easycom组件,这3种组件有不同的方法调用方式。 ### 内置组件的方法调用或设置属性 > 3.93+ 支持 使用 `this.$refs` 获取组件并as转换为组件对应的element类型,通过 `.`操作符 调用组件方法或设置属性。 **语法** ```(this.$refs['组件ref属性值'] as Uni[xxx]Element).foo();``` **内置组件的element类型规范** Uni`组件名(驼峰)`Element 如: `