# 选项式 API @options-api 选项式 API,要求在script里编写`export default {}`,在其中定义data、methods、生命周期等选项。 ## 状态选项 ### 示例代码 @example #### data 用于声明组件初始响应式状态的函数。 示例 [详情]() ::: preview ::: #### props 用于声明一个组件的 props。 示例 [详情]() ::: preview ::: #### computed 用于声明要在组件实例上暴露的计算属性。 示例 [详情]() ::: preview ::: #### methods 用于声明要混入到组件实例中的方法。 声明的方法可以直接通过组件实例访问,或者在模板语法表达式中使用。所有的方法都会将它们的 `this` 上下文自动绑定为组件实例,即使在传递时也如此。 在声明方法时避免使用箭头函数,因为它们不能通过 `this` 访问组件实例。 [详情点击查看](./component.md#page-call-component-method) #### watch 用于声明在数据更改时调用的侦听回调。 ::: warning 注意 - `watch immediate` 第一次调用时,App-Android 平台旧值为初始值,web 平台为 null。 ::: 示例 [详情]() ::: preview ::: #### emits 用于声明由组件触发的自定义事件。 示例 [详情]() ::: preview ::: ## 渲染选项 @rendering-options ### 示例代码 @example #### template 用于声明组件的字符串模板。 示例 [详情]() ::: preview ::: #### render 用于编程式地创建组件虚拟 DOM 树的函数。 `render` 是字符串模板的一种替代,可以使你利用 JavaScript 的丰富表达力来完全编程式地声明组件最终的渲染输出。 预编译的模板,例如单文件组件中的模板,会在构建时被编译为 `render` 选项。如果一个组件中同时存在 `render` 和 `template,则` `render` 将具有更高的优先级。 示例 [详情]() ::: preview > 选项式 API > 组合式 API ::: #### slots 一个在渲染函数中以编程方式使用插槽时辅助类型推断的选项。 示例 [详情]() 作用域插槽需在组件中指定插槽数据类型 ::: preview ::: ## 生命周期选项 @lifecycle-options > [页面及组件生命周期流程图](../page.md#lifecycleflow) ### 页面生命周期 @page-lifecycle-options #### 兼容性 @page-lifecycle-compatibility [页面生命周期](../page.md#lifecycle) 示例 [详情]() ::: preview ::: ### 组件生命周期 @page-component-options #### 兼容性 @component-lifecycle-compatibility #### mounted、unmounted 使用注意事项 @mounted-unmounted-tips 目前 mounted、unmounted 可以保证当前数据已经同步到 DOM,但是由于排版和渲染是异步的的,所以 mounted、unmounted 不能保证 DOM 排版以及渲染完毕。\ 如果需要获取排版后的节点信息推荐使用 [uni.createSelectorQuery](../api/nodes-info.md) 不推荐直接使用 [Element](../dom/unielement.md) 对象。\ 在修改 DOM 后,立刻使用 [Element](../dom/unielement.md) 对象的同步接口获取 DOM 状态可能获取到的是排版之前的,而 [uni.createSelectorQuery](../api/nodes-info.md) 可以保障获取到的节点信息是排版之后的。 示例 [详情]() ::: preview ::: ## 组合选项 @options-composition ### inject 当使用 `inject` 声明从上层提供方注入的属性时,支持两种写法:字符串数组和对象。推荐使用对象写法,因为当使用数组方法时,类型会被推导为 `any | null` 类型。\ 使用对象写法时,额外增加 `type` 属性用于标记类型。如果注入的属性类型不是基础数据类型,需要通过 `PropType` 来标记类型: 示例 [详情]() ::: preview > inject 1 > inject 2 ::: ### mixins 一个包含组件选项对象的数组,这些选项都将被混入到当前组件的实例中。 `mixins` 选项接受一个 mixin 对象数组。这些 mixin 对象可以像普通的实例对象一样包含实例选项,它们将使用一定的选项合并逻辑与最终的选项进行合并。举例来说,如果你的 mixin 包含了一个 `created` 钩子,而组件自身也有一个,那么这两个函数都会被调用。 - `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 ::: preview 示例 [详情]() > mixins-web > mixins-app-page-namesake > mixins-app ::: ## 其他杂项 ### 示例代码 @example #### name 用于显式声明组件展示时的名称。 组件的名字有以下用途: - 在组件自己的模板中递归引用自己时 - 在 Vue 开发者工具中的组件树显示时 - 在组件抛出的警告追踪栈信息中显示时 示例 [详情]() ::: preview > 选项式 API > 组合式 API ::: #### inheritAttrs 用于控制是否启用默认的组件 attribute 透传行为。 默认情况下,父组件传递的,但没有被子组件解析为 props 的 attributes 绑定会被“透传”。这意味着当我们有一个单根节点的子组件时,这些绑定会被作为一个常规的 attribute 应用在子组件的根节点元素上。当你编写的组件想要在一个目标元素或其他组件外面包一层时,可能并不期望这样的行为。我们可以通过设置 `inheritAttrs` 为 `false` 来禁用这个默认行为。这些 attributes 可以通过 `$attrs` 这个实例属性来访问,并且可以通过 `v-bind` 来显式绑定在一个非根节点的元素上。 示例 [详情]() ::: preview > inheritAttrs: true > inheritAttrs: false ::: #### components 一个对象,用于注册对当前组件实例可用的组件。 示例 [详情]() ::: preview > 选项式 API > 组合式 API ::: - 参考[组件](./component.md) ## 组件实例 @component-instance ### 示例代码 @example #### $data 从 `data` 选项函数中返回的对象,会被组件赋为响应式。组件实例将会代理对其数据对象的属性访问。 ##### 使用注意事项 @options-data data内 $ 开头的属性不可直接使用 `this.$xxx`访问,需要使用 `this.$data['$xxx']` ,这是vue的规范 > 目前安卓端可以使用 this.$xxx 访问是Bug而非特性,请勿使用此特性。 示例 ```vue ``` 示例 [详情]() ::: preview ::: #### $props 表示组件当前已解析的 props 对象。 示例 [详情]() ::: preview ::: #### $el 该组件实例管理的 DOM 根节点。 示例 [详情]() ::: preview ::: #### $options 已解析的用于实例化当前组件的组件选项。 示例 [详情]() ::: preview ::: #### $parent 当前组件可能存在的父组件实例,如果当前组件是顶层组件,则为 `null`。 示例 [详情]() ::: preview ::: #### $root 当前组件树的根组件实例。如果当前实例没有父组件,那么这个值就是它自己。 示例 [详情]() ::: preview ::: #### $slots 一个表示父组件所传入插槽的对象。 示例 [详情]() ::: preview ::: #### $refs 一个包含 DOM 元素和组件实例的对象,通过模板引用注册。 示例 [详情]() ::: preview ::: #### $attrs 一个包含了组件所有透传 attributes 的对象。 示例 [详情]() ::: preview ::: #### $watch() 用于命令式地创建侦听器的 API。 示例 [详情]() ::: preview ::: #### $emit() 在当前组件触发一个自定义事件。任何额外的参数都会传递给事件监听器的回调函数。 示例 [详情]() ::: preview ::: #### $forceUpdate() 强制该组件重新渲染。 示例 [详情]() ::: preview ::: #### $nextTick() 绑定在实例上的 nextTick() 函数。 ##### 使用注意事项 @options-nextTick 目前 $nextTick 可以保证当前数据已经同步到 DOM,但是由于排版和渲染是异步的,所以 $nextTick 不能保证 DOM 排版以及渲染完毕。\ 如果需要获取排版后的节点信息推荐使用 [uni.createSelectorQuery](../api/nodes-info.md) 不推荐直接使用 [Element](../dom/unielement.md) 对象。\ 在修改 DOM 后,立刻使用 [Element](../dom/unielement.md) 对象的同步接口获取 DOM 状态可能获取到的是排版之前的,而 [uni.createSelectorQuery](../api/nodes-info.md) 可以保障获取到的节点信息是排版之后的。 示例 [详情]() ::: preview :::