# UTS 组件开发 本文旨在帮助开发者,使用UTS开发Uni-App平台组件功能。 ## 前置条件 继续阅读文档前,开发者需要了解以下前置条件: + HBuilderX 3.6.15 及之后版本 + 了解Vue 组件基本概念 + 目前仅支持nvue ## UTS组件简介 #### 为什么使用组件 组件是一种独立,可复用的UI单元,用于单独封装和承担一定的代码逻辑,组件化可以降低项目的工程复杂度,提升可维护性 组件与插件的区别在于:前者倾向于以标签的形式 对外提供UI封装,后者倾向于以函数/类 的形式 对外提供功能封装。如果你的需求更倾向于封装能力,请移步 [UTS插件开发](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html) 组件一般适用于组件非全屏的场景,如果需要封装的UI始终是全屏,那么可以考虑通过开发原生实现 #### 为什么使用UTS开发组件 UTS组件,即:使用UTS语言在uni平台进行组件开发的技术。 UTS组件的优势在于,它秉承了UTS的跨平台特性,统一的UTS语法,各终端不同的本地产出物。 在Android平台会被编译为会被渲染为Android原生View实例,IOS或其他终端平台也是如此。 | |uts组件 |uni原生组件 |Vue组件 | |:------ |:-------- |:-------- |:------- | |开发语言 |uts |java/object-c |js/ts | |组件载体 |系统原生View对象 |系统原生View对象 |WebView内部标签 | 为了降低前端开发者的开发门槛,UTS组件结构采用了类Vue组件的语法,[关于Vue组件](https://cn.vuejs.org/guide/essentials/component-basics.html),但是具体的函数上会有定制,我们会在下一个章节详细介绍 ## 3 如何开发UTS组件 >本章节提到全部示例源码可以在Hello UTS 中找到 #### 3.1 创建UTS组件 HBuilderX 3.6.16 版本之后,支持一键创建 选中 项目目录/uni_modules 右键 新建组件 TODO #### 3.2 UTS组件目录结构 ![目录结构](https://native-res.dcloud.net.cn/images/uts/component/image1.png) 组件的入口文件是index.vue,具体规范会在下一个章节介绍 另外 组件允许存在入口文件:index.uts 对外提供函数能力,具体参考 UTS 插件介绍 #### 3.2 编写UTS组件代码 下面是一个组件源码 index.vue 完整示例: ```ts export default { /** * 组件名称,也就是开发者使用的标签 */ name: "xxx-view", /** * 组件涉及的事件声明,只有声明过的事件,才能被正常发送 */ emits: ['bindended'], /** * 属性声明,组件的使用者会传递这些属性值到组件 */ props: { /** * 字符串类型 属性:path 默认值:"" */ "path": { type: String, default: "" }, }, /** * 组件内部变量声明 */ data() { return { } }, /** * 属性变化监听器实现 */ watch: { "path": { handler(newPath: string) { // 这里处理属性newPath 的更新逻辑 }, //创建时是否通过此方法更新属性,默认值为false immediate: false }, }, /** * 规则:如果没有配置expose,则methods中的方法均对外暴露,如果配置了expose,则以expose的配置为准向外暴露 * ['publicMethod'] 含义为:只有 `publicMethod` 在实例上可用 */ expose: ['publicMethod'], methods: { /** * 对外公开的组件方法 */ publicMethod() { doSth(paramA: string) { // 这是组件的自定义方法 } }, /** * 内部使用的组件方法 */ privateMethod() { doSthInner(paramA: string) { // 这是组件的自定义方法 } } }, /** * 组件被创建,组件第一个生命周期, * 在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑 * [可选实现] */ created() { }, /** * 对应平台的view载体即将被创建,对应前端beforeMount * [可选实现] */ NVBeforeLoad() { }, /** * 创建原生View,必须定义返回值类型 * 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型 * (Android需要明确知道View类型,需特殊校验) * todo 补充IOS平台限制 * [必须实现] */ NVLoad(): View { let viewInstance = new View($androidContext) return aView }, /** * 原生View已创建 * [可选实现] */ NVLoaded() { }, /** * 原生View布局完成 * [可选实现] */ NVLayouted() { }, /** * 原生View将释放 * [可选实现] */ NVBeforeUnload() { }, /** * 原生View已释放,这里可以做释放View之后的操作 * [可选实现] */ NVUnloaded() { }, /** * 组件销毁 * [可选实现] */ unmounted() { } /** * 自定组件布局尺寸 * [可选实现] */ doMeasure(size: UTSSize): UTSSize { size.width = 120.0.toFloat() size.height = 800.0.toFloat() return size } } ``` index.vue可以分为以下几类: + 配置: name:组件的使用标签,可以省略,若省略则默认为组件名称 emits:组件允许的消息事件名称,如果没有组件消息,不需要配置 + 属性: props:需要由组件的使用者提供,比如一个Image组件,会需要一个path属性作为图像路径来源 watch:属性的监听实现,用来监听属性数据更新。 + 数据: data:组件内部数据定义,用于组件内部逻辑处理,不对外暴露 + 方法: methods:组件方法定义,可以通过与expose组合使用,区分对内方法和对外方法 expose:与methods 字段配合使用,用以区分组件对内方法和对外方法 + 生命周期: 组件需要重点处理 内存创建/销毁,View载体创建/销毁 过程中的资源管理,具体参考3.4章节 + 内置对象: 为了方便组件开发者,UTS组件内置了部分变量与函数,具体参考3.5章节 #### 3.4 生命周期 组件开发者需要重点关注生命周期 ![生命周期](https://native-res.dcloud.net.cn/images/uts/component/image2.png) + created: 组件被创建,组件第一个生命周期,在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑 + NVBeforeLoad: 组件对应平台的view载体 即将被创建 + NVLoad: [必须实现] 组件 view载体的创建实现 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型 + NVLayouted: 组件对应平台的view载体,布局完成 + NVBeforeUnload: view载体即将被卸载 资源回收 + NVUnloaded: view载体已经被卸载 资源回收 + unmounted: view载体被回收 资源回收 + doMeasure: doMeasure 用于告诉排版系统,组件自身需要的宽高,具体的调用时机由排版系统决定。 一般情况下,组件的宽高应该是由终端系统的排版引擎决定,组件开发者不需要实现此函数。 但是部分场景下,组件开发者需要自己维护宽高,则需要开发者重写此函数 #### 3.5 内置对象和函数 为了方便组件开发者使用,UTS 组件内部内置了下列对象: |变量名 |类型 |简介 |平台限制 | |:------- |:-------- |:-------- |:--- | |$el |对象 |当前View实例对象 |全部平台 | |$androidContext|对象 |当前组件上下文 |仅android | |emit("event") |函数 |发送已注册的事件 |全部平台 | ## 4 使用组件 #### 4.1 注意事项: 1. 需要自定义基座方能使用 2 不需要引用,直接使用自定义标签 ```js ``` #### 4.2 属性 组件的开发者,声明属性 ``` props: { /** * 属性A:propA 需要声明属性类型和默认值 */ "propA": { type: String, default: "" }, }, ``` 组件使用者,使用属性 ```js ``` #### 4.3 方法 组件的开发者,定义公开方法 ``` methods: { publicMethod() { doSth(paramA: string) { // 这是组件的自定义方法 } } } ``` 组件使用者,使用方法 ```js // 布局代码 // 调用代码 this.$refs["customTag"].doSth('参数') ``` ## 5 快速体验 开发者可以使用[Hello UTS](https://gitcode.net/dcloud/hello-uts) 快速体验UTS 组件开发 使用HX 3.6.16 版本 - 选择 Hello UTS - 自定义基座包。 查看:三方SDK-Lottie动画示例,对应的源码实现:~/uni_modules/uts-animation-view ## 常见问题