# 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` 不支持使用自定义的构造函数。 ::: preview > 选项式 API ```ts ``` > 组合式 API ```ts ``` ::: ::: preview > 选项式 API ```ts ``` > 组合式 API ```ts ``` ::: ## 自定义组件 v-model 绑定复杂表达式 @v-model-complex-expression 自定义组件 `v-model` 绑定复杂表达式时,需要通过 `as` 指定类型(仅App-Android 平台)。 ::: preview > 选项式 API ```ts ``` > 组合式 API ```ts ``` ::: ## 作用域插槽的类型 作用域插槽需在组件中指定插槽数据类型 ::: preview > 选项式 API ```ts // components/Foo.uvue // page.uvue ``` > 组合式 API ```ts // components/Foo.uvue // 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 ``` ::: ## 监听页面生命周期 `4.0` 起可通过组合式 API 实现组件中监听页面生命周期,[示例代码](https://gitcode.net/dcloud/hello-uvue/-/blob/alpha/pages/composition-api/lifecycle/component-lifecycle/component-lifecycle.uvue)。 ## 调用组件方法@methods 需要把组件分为 内置组件、easycom组件、非easycom组件,这3种组件有不同的方法调用方式。 ### 内置组件的方法调用或设置属性 > 3.93+ 支持 使用 `this.$refs` 获取组件并as转换为组件对应的element类型,通过 `.`操作符 调用组件方法或设置属性。 **语法** ```(this.$refs['组件ref属性值'] as Uni[xxx]Element).foo();``` **内置组件的element类型规范** Uni`组件名(驼峰)`Element 如: `