# vue uni-app x的vue规范,按照vue3规范实现,从4.0起支持组合式写法。 本文暂时只包括兼容性表格,vue功能详情另见 [vue3概述](https://uniapp.dcloud.net.cn/tutorial/vue3-basics.html#)、[Vue3 API](https://uniapp.dcloud.net.cn/tutorial/vue3-api.html)。 uni-app x中vue的用法,有单独的示例应用:[hello uvue](https://gitcode.net/dcloud/hello-uvue)。这里都是可以跑通的使用样例代码。 ## 全局 API兼容性 ### 应用实例 @app-instance **注意:** - **app.use:** `app.use` 支持通过对象字面量、函数及 `definePlugin` 方式定义插件。\ 支持传递插件参数,当传递插件参数时,`app` 的类型需要指定为 `VueApp`。 ```ts // main.uts export function createApp() { const app = createSSRApp(App) // 通过对象字面量方式注册插件 app.use({ install(app) { app.config.globalProperties.plugin1 = "plugin1" } }) // 通过函数方式注册插件 app.use(function (app) { app.config.globalProperties.plugin2 = "plugin2" }) // 通过 definePlugin + 对象字面量方式注册插件 const plugin3= definePlugin({ install(app) { app.config.globalProperties.plugin3 = "plugin3" } }) app.use(plugin3) // 通过 definePlugin + 函数方式注册插件 const plugin4= definePlugin(function (app) { app.config.globalProperties.plugin4 = "plugin4" }) app.use(plugin4) // 注册插件时传递参数 // 注意:当传递插件参数时,app 的类型需要指定为 VueApp app.use(function (app: VueApp, arg1:string, arg2:string) { app.config.globalProperties.plugin5 = `${arg1}-${arg2}` }, "arg1", "arg2"); } ``` - **app.config.globalProperties:** 请注意,`globalProperties` 是一个保留关键字,因此在项目中请勿声明名为 `globalProperties` 的变量。\ 在向 `globalProperties` 注册方法时,请使用直接函数表达式方式进行赋值。不支持先声明函数,再将其注册到 `globalProperties` 上的方式。同时,注册的函数一旦被赋值,不允许进行修改。\ `globalProperties` 在编译时处理,因此确保你的操作在编译时是可知的。例如,将变量赋值给 `globalProperties` 时,这个变量在编译时必须是已知的,而不能是在运行时才能确定的变量。 ### 通用 #### nextTick 使用注意事项 目前 nextTick 可以保证当前数据已经同步到 DOM,但是由于排版和渲染是异步的的,所以 nextTick 不能保证 DOM 排版以及渲染完毕。如果需要获取排版后的节点信息推荐使用 [uni.createSelectorQuery](../api/nodes-info.md) 不推荐直接使用 [Element](../dom/element.md) 对象。在修改 DOM 后,立刻使用 [Element](../dom/element.md) 对象的同步接口获取 DOM 状态可能获取到的是排版之前的,而 [uni.createSelectorQuery](../api/nodes-info.md) 可以保障获取到的节点信息是排版之后的。 ## 组合式 API @composition-api **注意:** - 暂不支持 ` ``` ## [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` 类型绑定。 ```html ``` ### CSS Modules |App|Web| |:-:|:-:| |x |4.0| 一个 ` ``` 得出的 class 将被哈希化以避免冲突,实现了同样的将 CSS 仅作用于当前组件的效果。 **自定义注入名称** 你可以通过给 `module` attribute 一个值来自定义注入 class 对象的属性名: ```html ``` **与组合式 API 一同使用** 可以通过 `useCssModule` API 在 `setup()` 和 ` ``` 这个语法同样也适用于 ` ``` ## 应用生命周期 uni-app x 新增了 [onLastPageBackPress](../collocation/App.md#applifecycle) 和 [onExit](../collocation/App.md#applifecycle) 应用级生命周期,Android退出应用逻辑写在app.uvue里,新建项目的模板自动包含相关代码。如需修改退出逻辑,请直接修改相关代码。 ## 组件 @component - [props](../component/README.md#props) - [自定义事件](../component/README.md#自定义事件) - [计算属性和侦听器](../component/README.md#计算属性和侦听器) - [作用域插槽的类型](../component/README.md#作用域插槽的类型) - [监听页面生命周期](../component/README.md#监听页面生命周期) - [vue 与 uvue 不同文件后缀的优先级](../component/README.md#priority) ::: warning 注意 1. App 端,如需页面级滚动,根节点必须是 `scroll-view` 标签。 ::: ### 特殊元素 @special-elements #### script #### template #### slot #### style #### keep-alive #### component #### transition #### transition-group #### teleport **注意:** - App-Android 平台暂不支持动态修改 `to` 属性。 ### 特殊 Attributes @special-attributes ### 生命周期选项 @lifecycle-options #### mounted、unmounted 使用注意事项 目前 mounted、unmounted 可以保证当前数据已经同步到 DOM,但是由于排版和渲染是异步的的,所以 mounted、unmounted 不能保证 DOM 排版以及渲染完毕。如果需要获取排版后的节点信息推荐使用 [uni.createSelectorQuery](../api/nodes-info.md) 不推荐直接使用 [Element](../dom/element.md) 对象。在修改 DOM 后,立刻使用 [Element](../dom/element.md) 对象的同步接口获取 DOM 状态可能获取到的是排版之前的,而 [uni.createSelectorQuery](../api/nodes-info.md) 可以保障获取到的节点信息是排版之后的。 ## 插件 暂不支持vue插件,比如pinia、vuex、i18n、router。简单的状态管理可以参考文档[全局变量和状态管理](../tutorial/store.md)。 ## 选项式 API兼容性 @options-api-compatibility ### 状态选项 **注意:** - `watch immediate` 第一次调用时,App-Android 平台旧值为初始值,web 平台为 null。 ### 渲染选项 @rendering-options ### 组合选项 @composition-options **注意:** - **inject:** 当使用 `inject` 声明从上层提供方注入的属性时,支持两种写法:字符串数组和对象。推荐使用对象写法,因为当使用数组方法时,类型会被推导为 `any | null` 类型。\ 使用对象写法时,额外增加 `type` 属性用于标记类型。如果注入的属性类型不是基础数据类型,需要通过 `PropType` 来标记类型。 ```ts export default { inject: { provideString: { type: String, default: 'default provide string value' }, provideObject: { type: Object as PropType }, provideMap: { type: Object as PropType>, default: (): Map => { return new Map([['key', 'default provide map value']]) } } } } ``` - **mixins:** `mixins` 仅支持通过字面量对象方式和 `defineMixin` 函数方式定义。 ```ts const mixin1 = defineMixin({ onLoad() { console.log('mixin1 onLoad') } }) export default { mixins: [ mixin1, { data() { return { mixin2: 'mixin2' } } } ] } ``` 同名属性会被覆盖,同名生命周期会依次执行。 同名属性的优先级如下: - 在 `app.mixin` 内嵌入的 mixin < 在 `app.mixin` 中声明的 mixin < 在 `page.mixin` 内嵌入的 mixin < 在 `page.mixin` 中声明的 mixin < 在 `component.mixin` 内嵌入的 mixin < 在 `component.mixin` 中声明的 mixin 同名生命周期的执行顺序如下: 1. 在 `app.mixin` 内嵌入的 mixin 2. 在 `app.mixin` 中声明的 mixin 3. 在 `page.mixin` 内嵌入的 mixin 4. 在 `page.mixin` 中声明的 mixin 5. 在 `component.mixin` 内嵌入的 mixin 6. 在 `component.mixin` 中声明的 mixin ### 其他杂项 ### 组件实例 @component-instance #### $nextTick 使用注意事项 目前 $nextTick 可以保证当前数据已经同步到 DOM,但是由于排版和渲染是异步的的,所以 $nextTick 不能保证 DOM 排版以及渲染完毕。如果需要获取排版后的节点信息推荐使用 [uni.createSelectorQuery](../api/nodes-info.md) 不推荐直接使用 [Element](../dom/element.md) 对象。在修改 DOM 后,立刻使用 [Element](../dom/element.md) 对象的同步接口获取 DOM 状态可能获取到的是排版之前的,而 [uni.createSelectorQuery](../api/nodes-info.md) 可以保障获取到的节点信息是排版之后的。 #### $data 使用注意事项 data内$开头的属性不可直接使用`this.$xxx`访问,需要使用`this.$data['$xxx']`,这是vue的规范。目前安卓端可以使用this.$xxx访问是Bug而非特性,请勿使用此特性。 示例 ```vue ``` ## 进阶 API兼容性 ### 渲染函数 ## 单文件组件兼容性 ### \ ``` ## 其他vue特性 ### 递归组件 实现递归组件时不要使用组件import自身的写法,直接在模板内使用组件名即可。 ```vue // component-a.uvue ``` ## 其他示例 - [嵌套组件通讯](https://gitcode.net/dcloud/hello-uvue/-/tree/master/pages/examples/nested-component-communication) - [自定义组件中使用 class 定制另一个自定义组件根节点样式](https://gitcode.net/dcloud/hello-uvue/-/tree/master/pages/examples/set-custom-child-component-root-node-class)