data-bind.md 4.6 KB
Newer Older
D
DCloud_LXH 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 数据绑定模型

## 声明响应式状态 @declaring-reactive-state

### 选项式 API @options-api

选用选项式 API 时,会用 `data` 选项来声明组件的响应式状态。此选项的值应为返回一个对象的函数。Vue 将在创建新组件实例的时候调用此函数,并将函数返回的对象用响应式系统进行包装。此对象的所有顶层属性都会被代理到组件实例 (即方法和生命周期钩子中的 `this`) 上。

示例 [详情](<!-- 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 -->
:::

### 组合式 API @composition-api

D
DCloud_LXH 已提交
17
选用组合式 API 时,会用 `ref``reactive` 来声明组件的响应式状态。
D
DCloud_LXH 已提交
18 19 20 21 22 23 24

#### ref

在组合式 API 中,推荐使用 `ref()` 函数来声明响应式状态。需要给 `ref` 标注类型,如:`ref<string>()`

`ref()` 接收参数,并将其包裹在一个带有 `.value` 属性的 `ref` 对象中返回

D
DCloud_LXH 已提交
25
**注意**:在模板中使用 ref 时,我们不需要附加 `.value`(为了方便起见,当在模板中使用时,ref 会自动解包)。
D
DCloud_LXH 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

示例 [详情](<!-- VUEJSON.E_reactivity.core_ref_ref.gitUrl -->)

::: preview <!-- VUEJSON.E_reactivity.core_ref_ref.webUrl -->
<!-- VUEJSON.E_reactivity.core_ref_ref.code -->
:::

#### reactive

还有另一种声明响应式状态的方式,即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同,reactive() 将使对象本身具有响应性,还可以使用 `readOnly` 来禁止修改

值得注意的是,reactive() 返回的是一个原始对象的 Proxy,它和原始对象是不相等的

只有代理对象是响应式的,更改原始对象不会触发更新。因此,使用 Vue 的响应式系统的最佳实践是仅使用你声明对象的代理版本。

示例 [详情](<!-- VUEJSON.E_reactivity.core_readonly_readonly.gitUrl -->)

::: preview <!-- VUEJSON.E_reactivity.core_readonly_readonly.webUrl -->
<!-- VUEJSON.E_reactivity.core_readonly_readonly.code -->
:::

#### defineExpose

使用 `<script setup>` 的组件是**默认关闭**的——即通过模板引用或者 `$parent` 链获取到的组件的公开实例,**不会**暴露任何在 `<script setup>` 中声明的绑定。

可以通过 `defineExpose` 编译器宏来显式指定在 `<script setup>` 组件中要暴露出去的属性:

> 在示例中,使用 `defineExpose` 导出一个方法供自动化测试使用

示例 [详情](<!-- VUEJSON.E_component-instance.define-expose_define-expose.gitUrl -->)

::: preview <!-- VUEJSON.E_component-instance.define-expose_define-expose.webUrl -->
<!-- VUEJSON.E_component-instance.define-expose_define-expose.code -->
:::

## 绑定变量 @bind-data

### 在模板里绑定 @bind-template-data

当使用 `Options API` `data``Composition API``ref``reactive` 定义了响应式数据后,可以在模板中使用 `{{}}` 语法绑定数据

可以在模板中使用以下任一指令一起:

- `v-bind``:`(简写)
- `v-if``v-else-if``v-else`
- `v-for`

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

D
DCloud_LXH 已提交
75
::: preview <!-- VUEJSON.E_built-in.special-elements_template_template-options.webUrl -->
D
DCloud_LXH 已提交
76 77

> 选项式 API
D
DCloud_LXH 已提交
78
<!-- VUEJSON.E_built-in.special-elements_template_template-options.code -->
D
DCloud_LXH 已提交
79 80

> 组合式 API
D
DCloud_LXH 已提交
81
<!-- VUEJSON.E_built-in.special-elements_template_template-composition.code -->
D
DCloud_LXH 已提交
82 83
:::

D
DCloud_LXH 已提交
84 85 86 87 88 89 90 91 92
### 在样式里绑定 @v-bind-css-data

|App|Web|
|:-:|:-:|
|x  |4.13+  |

单文件组件的 `<style>` 标签支持使用 `v-bind` CSS 函数将 CSS 的值链接到动态的组件状态

这个语法同样也适用于 `<script setup>`,且支持 UTS 表达式 (需要用引号包裹起来)
D
DCloud_LXH 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

`v-bind` 也可在样式中使用,可以很方便的在 uts 中改变样式,如下所示:

示例 [详情](<!-- VUEJSON.E_directive.v-bind_v-bind-options.gitUrl -->)

::: preview <!-- VUEJSON.E_directive.v-bind_v-bind-options.webUrl -->

> 选项式 API
<!-- VUEJSON.E_directive.v-bind_v-bind-options.code -->

> 组合式 API
<!-- VUEJSON.E_directive.v-bind_v-bind-composition.code -->
:::

## 定义方法 @methods

使用选项式 API 时可以在 `methods` 选项中定义方法,这些方法可以在模板中使用\
而使用组合式 API 时,可以直接在 `<script setup lang="uts">` 中定义方法

定义方法之后,可以传递给子组件,子组件使用 `emit` 调用,也可以在 `script` 中直接使用

D
DCloud_LXH 已提交
114
示例 [详情](<!-- VUEJSON.E_reactivity.core_ref_ref.gitUrl -->)
D
DCloud_LXH 已提交
115

D
DCloud_LXH 已提交
116 117
::: preview <!-- VUEJSON.E_reactivity.core_ref_ref.webUrl -->
<!-- VUEJSON.E_reactivity.core_ref_ref.code -->
D
DCloud_LXH 已提交
118
:::