options-api.md 15.1 KB
Newer Older
D
DCloud_LXH 已提交
1 2
# 选项式 API @options-api

W
wanganxp 已提交
3 4
选项式 API,要求在script里编写`export default {}`,在其中定义data、methods、生命周期等选项。

D
DCloud_LXH 已提交
5 6 7 8
## 状态选项

<!-- VUEJSON.options_state.compatibility -->

D
DCloud_LXH 已提交
9
### 示例代码 @example
D
DCloud_LXH 已提交
10 11 12

#### data

D
DCloud_LXH 已提交
13 14
用于声明组件初始响应式状态的函数。

D
DCloud_LXH 已提交
15 16 17 18 19 20
示例 [详情](<!-- VUEJSON.E_component-instance.data_data-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.data_data-options.webUrl -->
<!-- VUEJSON.E_component-instance.data_data-options.code -->
:::

D
DCloud_LXH 已提交
21
#### props
D
DCloud_LXH 已提交
22

D
DCloud_LXH 已提交
23 24
用于声明一个组件的 props。

D
DCloud_LXH 已提交
25 26 27 28 29 30 31 32
示例 [详情](<!-- VUEJSON.E_component-instance.props_props-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.props_props-options.webUrl -->
<!-- VUEJSON.E_component-instance.props_props-options.code -->
:::

#### computed

D
DCloud_LXH 已提交
33 34
用于声明要在组件实例上暴露的计算属性。

D
DCloud_LXH 已提交
35 36 37 38 39 40 41 42 43 44
示例 [详情](<!-- VUEJSON.E_reactivity.core_computed_computed-options.gitUrl -->)

::: preview <!-- VUEJSON.E_reactivity.core_computed_computed-options.webUrl -->

<!-- VUEJSON.E_reactivity.core_computed_computed-options.code -->

:::

#### methods

D
DCloud_LXH 已提交
45 46 47 48 49 50
用于声明要混入到组件实例中的方法。

声明的方法可以直接通过组件实例访问,或者在模板语法表达式中使用。所有的方法都会将它们的 `this` 上下文自动绑定为组件实例,即使在传递时也如此。

在声明方法时避免使用箭头函数,因为它们不能通过 `this` 访问组件实例。

D
DCloud_LXH 已提交
51 52 53 54
[详情点击查看](./component.md#page-call-component-method)

#### watch

D
DCloud_LXH 已提交
55 56 57 58 59 60
用于声明在数据更改时调用的侦听回调。

::: warning 注意
- `watch immediate` 第一次调用时,App-Android 平台旧值为初始值,web 平台为 null。
:::

D
DCloud_LXH 已提交
61 62 63 64 65 66 67 68 69 70
示例 [详情](<!-- VUEJSON.E_reactivity.core_watch_watch-options.gitUrl -->)

::: preview <!-- VUEJSON.E_reactivity.core_watch_watch-options.webUrl -->

<!-- VUEJSON.E_reactivity.core_watch_watch-options.code -->

:::

#### emits

D
DCloud_LXH 已提交
71 72 73
用于声明由组件触发的自定义事件。

示例 [详情](<!-- VUEJSON.E_component-instance.emit-function_emit-function-options.gitUrl -->)
D
DCloud_LXH 已提交
74

D
DCloud_LXH 已提交
75
::: preview <!-- VUEJSON.E_component-instance.emit-function_emit-function-options.webUrl -->
D
DCloud_LXH 已提交
76 77 78 79 80 81 82 83 84

<!-- VUEJSON.E_component-instance.emit-function_child-options.code -->

:::

## 渲染选项 @rendering-options

<!-- VUEJSON.options_rendering.compatibility -->

D
DCloud_LXH 已提交
85
### 示例代码 @example
D
DCloud_LXH 已提交
86 87 88

#### template

D
DCloud_LXH 已提交
89 90
用于声明组件的字符串模板。

D
DCloud_LXH 已提交
91
示例 [详情](<!-- VUEJSON.E_built-in.special-elements_template_template-options.gitUrl -->)
D
DCloud_LXH 已提交
92

D
DCloud_LXH 已提交
93 94
::: preview <!-- VUEJSON.E_built-in.special-elements_template_template-options.webUrl -->
<!-- VUEJSON.E_built-in.special-elements_template_template-options.code -->
D
DCloud_LXH 已提交
95 96 97 98
:::

#### render

D
DCloud_LXH 已提交
99 100 101 102 103 104
用于编程式地创建组件虚拟 DOM 树的函数。

`render` 是字符串模板的一种替代,可以使你利用 JavaScript 的丰富表达力来完全编程式地声明组件最终的渲染输出。

预编译的模板,例如单文件组件中的模板,会在构建时被编译为 `render` 选项。如果一个组件中同时存在 `render``template,则` `render` 将具有更高的优先级。

105
示例 [详情](<!-- VUEJSON.E_render-function.render_render-options.gitUrl -->)
D
DCloud_LXH 已提交
106

107
::: preview <!-- VUEJSON.E_render-function.render_render-options.webUrl -->
108
<!-- VUEJSON.E_render-function.render_render-options.code -->
D
DCloud_LXH 已提交
109 110 111 112
:::

#### slots

D
DCloud_LXH 已提交
113 114
一个在渲染函数中以编程方式使用插槽时辅助类型推断的选项。

D
DCloud_LXH 已提交
115 116 117 118 119 120 121 122 123 124 125
示例 [详情](<!-- VUEJSON.E_component-instance.slots_slots-options.gitUrl -->)

作用域插槽需在组件中指定插槽数据类型
::: preview <!-- VUEJSON.E_component-instance.slots_slots-options.webUrl -->

<!-- VUEJSON.E_component-instance.slots_slots-options.code -->

:::

## 生命周期选项 @lifecycle-options

D
DCloud_LXH 已提交
126
> [页面及组件生命周期流程图](../page.md#lifecycleflow)
D
DCloud_LXH 已提交
127

D
DCloud_LXH 已提交
128
### 页面生命周期 @page-lifecycle-options
D
DCloud_LXH 已提交
129

D
DCloud_LXH 已提交
130
#### 兼容性 @page-lifecycle-compatibility
D
DCloud_LXH 已提交
131

D
DCloud_LXH 已提交
132
[页面生命周期](../page.md#lifecycle)
D
DCloud_LXH 已提交
133 134 135 136 137 138 139 140 141

示例 [详情](<!-- VUEJSON.E_lifecycle.page_page-options.gitUrl -->)

::: preview <!-- VUEJSON.E_lifecycle.page_page-options.webUrl -->

<!-- VUEJSON.E_lifecycle.page_page-options.code -->

:::

D
DCloud_LXH 已提交
142 143 144 145
### 组件生命周期 @page-component-options

#### 兼容性 @component-lifecycle-compatibility

D
DCloud_LXH 已提交
146
<!-- VUEJSON.options_lifecycle.compatibility -->
D
DCloud_LXH 已提交
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161

#### 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) 可以保障获取到的节点信息是排版之后的。

示例 [详情](<!-- VUEJSON.E_lifecycle.component_ChildComponentOptions.gitUrl -->)

::: preview <!-- VUEJSON.E_lifecycle.component_ChildComponentOptions.webUrl -->

<!-- VUEJSON.E_lifecycle.component_ChildComponentOptions.code -->

:::

D
DCloud_LXH 已提交
162 163 164 165 166 167 168 169 170 171 172 173

## 组合选项 @options-composition

<!-- VUEJSON.options_composition.compatibility -->

### inject

当使用 `inject` 声明从上层提供方注入的属性时,支持两种写法:字符串数组和对象。推荐使用对象写法,因为当使用数组方法时,类型会被推导为 `any | null` 类型。\
使用对象写法时,额外增加 `type` 属性用于标记类型。如果注入的属性类型不是基础数据类型,需要通过 `PropType` 来标记类型:

示例 [详情](<!-- VUEJSON.E_component-instance.inject_inject-options-1.gitUrl -->)

D
DCloud_LXH 已提交
174
::: preview <!-- VUEJSON.E_component-instance.provide_provide-options-1.webUrl -->
D
DCloud_LXH 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188

> inject 1

<!-- VUEJSON.E_component-instance.inject_inject-options-1.code -->

> inject 2

<!-- VUEJSON.E_component-instance.inject_inject-options-2.code -->

:::


### mixins

D
DCloud_LXH 已提交
189 190 191 192
一个包含组件选项对象的数组,这些选项都将被混入到当前组件的实例中。

`mixins` 选项接受一个 mixin 对象数组。这些 mixin 对象可以像普通的实例对象一样包含实例选项,它们将使用一定的选项合并逻辑与最终的选项进行合并。举例来说,如果你的 mixin 包含了一个 `created` 钩子,而组件自身也有一个,那么这两个函数都会被调用。

193 194
- `mixins` 仅支持通过字面量对象方式和 `defineMixin` 函数方式定义。
- 在 app-Android 平台, `App.uvue` 不支持 `mixins`, 全局 mixins 也不会对 `App.uvue` 生效。
D
DCloud_LXH 已提交
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
  ```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

D
DCloud_LXH 已提交
224
::: preview <!-- VUEJSON.E_component-instance.mixins_mixins-web.webUrl -->
D
DCloud_LXH 已提交
225 226 227

示例 [详情](<!-- VUEJSON.E_component-instance.mixins-app-page-namesake.gitUrl -->)

D
DCloud_LXH 已提交
228
> mixins-web
D
DCloud_LXH 已提交
229

D
DCloud_LXH 已提交
230
<!-- VUEJSON.E_component-instance.mixins_mixins-web.code -->
D
DCloud_LXH 已提交
231

D
DCloud_LXH 已提交
232
> mixins-app-page-namesake
D
DCloud_LXH 已提交
233

D
DCloud_LXH 已提交
234
<!-- VUEJSON.E_component-instance.mixins_mixins-app-page-namesake.code -->
D
DCloud_LXH 已提交
235

D
DCloud_LXH 已提交
236
> mixins-app
D
DCloud_LXH 已提交
237

D
DCloud_LXH 已提交
238
<!-- VUEJSON.E_component-instance.mixins_mixins-app.code -->
D
DCloud_LXH 已提交
239 240 241 242 243 244 245 246 247

:::


## 其他杂项

<!-- VUEJSON.options_misc.compatibility -->
<!-- VUEJSON.options_misc.example -->

D
DCloud_LXH 已提交
248
### 示例代码 @example
D
DCloud_LXH 已提交
249 250 251

#### name

D
DCloud_LXH 已提交
252 253 254 255 256 257 258
用于显式声明组件展示时的名称。

组件的名字有以下用途:

- 在组件自己的模板中递归引用自己时
- 在 Vue 开发者工具中的组件树显示时
- 在组件抛出的警告追踪栈信息中显示时
D
DCloud_LXH 已提交
259

260
示例 [详情](<!-- VUEJSON.E_component-instance.circular-reference_circular-reference-options.gitUrl -->)
D
DCloud_LXH 已提交
261

262
::: preview <!-- VUEJSON.E_component-instance.circular-reference_circular-reference-options.webUrl -->
D
DCloud_LXH 已提交
263

264 265 266

<!-- VUEJSON.E_component-instance.circular-reference_circular-reference-options.code -->

D
DCloud_LXH 已提交
267 268 269 270
:::

#### inheritAttrs

D
DCloud_LXH 已提交
271 272 273
用于控制是否启用默认的组件 attribute 透传行为。

默认情况下,父组件传递的,但没有被子组件解析为 props 的 attributes 绑定会被“透传”。这意味着当我们有一个单根节点的子组件时,这些绑定会被作为一个常规的 attribute 应用在子组件的根节点元素上。当你编写的组件想要在一个目标元素或其他组件外面包一层时,可能并不期望这样的行为。我们可以通过设置 `inheritAttrs``false` 来禁用这个默认行为。这些 attributes 可以通过 `$attrs` 这个实例属性来访问,并且可以通过 `v-bind` 来显式绑定在一个非根节点的元素上。
D
DCloud_LXH 已提交
274

D
DCloud_LXH 已提交
275 276 277
示例 [详情](<!-- VUEJSON.E_component-instance.mixins_mixins-web.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.mixins_mixins-web.webUrl -->
D
DCloud_LXH 已提交
278 279 280 281 282 283 284 285 286 287 288 289 290

> inheritAttrs: true

<!-- VUEJSON.E_component-instance.mixins_components_Comp1.code -->

> inheritAttrs: false

<!-- VUEJSON.E_component-instance.mixins_components_Comp2.code -->

:::

#### components

D
DCloud_LXH 已提交
291 292
一个对象,用于注册对当前组件实例可用的组件。

293
示例 [详情](<!-- VUEJSON.E_component-instance.attrs_attrs-options.gitUrl -->)
D
DCloud_LXH 已提交
294

295
::: preview <!-- VUEJSON.E_component-instance.attrs_attrs-options.webUrl -->
D
DCloud_LXH 已提交
296

297 298
<!-- VUEJSON.E_component-instance.attrs_attrs-options.code -->

D
DCloud_LXH 已提交
299 300
:::

D
DCloud_LXH 已提交
301 302
- 参考[组件](./component.md)

D
DCloud_LXH 已提交
303 304 305
## 组件实例 @component-instance

<!-- VUEJSON.component_instance.compatibility -->
D
DCloud_LXH 已提交
306 307 308 309 310 311 312

### 示例代码 @example

#### $data

`data` 选项函数中返回的对象,会被组件赋为响应式。组件实例将会代理对其数据对象的属性访问。

D
DCloud_LXH 已提交
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
##### 使用注意事项 @options-data

data内 $ 开头的属性不可直接使用 `this.$xxx`访问,需要使用 `this.$data['$xxx']` ,这是vue的规范

> 目前安卓端可以使用 this.$xxx 访问是Bug而非特性,请勿使用此特性。

示例

```vue
<template>
  <view></view>
</template>
<script>
export default {
  data() {
    return {
      $a: 1
    }
  },
  onReady() {
    console.log(this.$data['$a'] as number) // 1
  }
}
</script>
```


D
DCloud_LXH 已提交
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
示例 [详情](<!-- VUEJSON.E_component-instance.data_data-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.data_data-options.webUrl -->
<!-- VUEJSON.E_component-instance.data_data-options.code -->
:::

#### $props

表示组件当前已解析的 props 对象。

示例 [详情](<!-- VUEJSON.E_component-instance.props_props-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.props_props-options.webUrl -->
<!-- VUEJSON.E_component-instance.props_props-options.code -->
:::

#### $el

该组件实例管理的 DOM 根节点。

示例 [详情](<!-- VUEJSON.E_component-instance.el_el-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.el_el-options.webUrl -->
<!-- VUEJSON.E_component-instance.el_el-options.code -->
:::

#### $options

已解析的用于实例化当前组件的组件选项。

示例 [详情](<!-- VUEJSON.E_component-instance.options_options-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.options_options-options.webUrl -->
<!-- VUEJSON.E_component-instance.options_options-options.code -->
:::

#### $parent

当前组件可能存在的父组件实例,如果当前组件是顶层组件,则为 `null`

示例 [详情](<!-- VUEJSON.E_component-instance.parent_parent-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.parent_parent-options.webUrl -->
<!-- VUEJSON.E_component-instance.parent_parent-options.code -->
:::


#### $root

当前组件树的根组件实例。如果当前实例没有父组件,那么这个值就是它自己。

示例 [详情](<!-- VUEJSON.E_component-instance.root_root-options.gitUrl -->)

::: preview
<!-- VUEJSON.E_component-instance.root_root-options.code -->
:::


#### $slots

一个表示父组件所传入插槽的对象。

示例 [详情](<!-- VUEJSON.E_component-instance.slots_slots-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.slots_slots-options.webUrl -->
<!-- VUEJSON.E_component-instance.slots_slots-options.code -->
:::


#### $refs

一个包含 DOM 元素和组件实例的对象,通过模板引用注册。

示例 [详情](<!-- VUEJSON.E_component-instance.refs_refs-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.refs_refs-options.webUrl -->
<!-- VUEJSON.E_component-instance.refs_refs-options.code -->
:::


#### $attrs

一个包含了组件所有透传 attributes 的对象。

示例 [详情](<!-- VUEJSON.E_component-instance.attrs_attrs-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.attrs_attrs-options.webUrl -->
<!-- VUEJSON.E_component-instance.attrs_attrs-options.code -->
:::


#### $watch()

用于命令式地创建侦听器的 API。

D
DCloud_LXH 已提交
435
示例 [详情](<!-- VUEJSON.E_reactivity.core_watch_watch-options.gitUrl -->)
D
DCloud_LXH 已提交
436

D
DCloud_LXH 已提交
437 438
::: preview <!-- VUEJSON.E_reactivity.core_watch_watch-options.webUrl -->
<!-- VUEJSON.E_reactivity.core_watch_watch-options.code -->
D
DCloud_LXH 已提交
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
:::


#### $emit()

在当前组件触发一个自定义事件。任何额外的参数都会传递给事件监听器的回调函数。

示例 [详情](<!-- VUEJSON.E_component-instance.emit-function_emit-function-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.emit-function_emit-function-options.webUrl -->
<!-- VUEJSON.E_component-instance.emit-function_emit-function-options.code -->
:::


#### $forceUpdate()

强制该组件重新渲染。

示例 [详情](<!-- VUEJSON.E_component-instance.force-update_force-update-options.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.force-update_force-update-options.webUrl -->
<!-- VUEJSON.E_component-instance.force-update_force-update-options.code -->
:::


#### $nextTick()

绑定在实例上的 nextTick() 函数。

D
DCloud_LXH 已提交
468
##### 使用注意事项 @options-nextTick
D
DCloud_LXH 已提交
469 470 471 472 473 474

目前 $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) 可以保障获取到的节点信息是排版之后的。


D
DCloud_LXH 已提交
475
示例 [详情](<!-- VUEJSON.E_component-instance.nextTick_nextTick-options.gitUrl -->)
D
DCloud_LXH 已提交
476

D
DCloud_LXH 已提交
477 478 479
::: preview <!-- VUEJSON.E_component-instance.nextTick_nextTick-options.webUrl -->
<!-- VUEJSON.E_component-instance.nextTick_nextTick-options.code -->
:::