@@ -32,7 +32,7 @@ console.log(count.value) // 0
32
32
33
33
## ` watchEffect `
34
34
35
- 为了根据反应状态* 自动应用* 和* 重新应用* 副作用,我们可以使用 ` watchEffect ` 方法。它立即运行一个函数,同时反应性地跟踪其依赖项,并在依赖项发生更改时重新运行它 。
35
+ 为了根据反应状态* 自动应用* 和* 重新应用* 副作用,我们可以使用 ` watchEffect ` 方法。它立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数 。
36
36
37
37
``` js
38
38
const count = ref (0 )
@@ -46,11 +46,11 @@ setTimeout(() => {
46
46
}, 100 )
47
47
```
48
48
49
- ### 阻止侦听器
49
+ ### 停止侦听
50
50
51
- 当在组件的 [ setup ()] ( composition-api-setup.html ) 函数或[ 生命周期钩子] ( composition-api-lifecycle-hooks.html ) 期间调用 ` watchEffect ` 时,侦听器链接到组件的生命周期 ,并在组件卸载时自动停止。
51
+ 当 ` watchEffect ` 在组件的 [ setup()] ( composition-api-setup.html ) 函数或[ 生命周期钩子] ( composition-api-lifecycle-hooks.html ) 被调用时,侦听器会被链接到该组件的生命周期 ,并在组件卸载时自动停止。
52
52
53
- 在其他情况下,它返回一个停止句柄,可以调用该句柄显式停止侦听器 :
53
+ 在一些情况下,也可以显式调用返回值以停止侦听 :
54
54
55
55
``` js
56
56
const stop = watchEffect (() => {
@@ -61,12 +61,12 @@ const stop = watchEffect(() => {
61
61
stop ()
62
62
```
63
63
64
- ### 副作用失效
64
+ ### 清除副作用
65
65
66
- 有时侦听效果函数会执行异步副作用,当它失效时 (即在效果完成之前状态改变) 需要清除这些副作用。effect 函数接收一个 ` onInvalidate ` 函数,该函数可用于注册无效回调。此无效回调在以下情况下调用:
66
+ 有时副作用函数会执行一些异步的副作用, 这些响应需要在其失效时清除(即完成之前状态已改变了)。所以侦听副作用传入的函数可以接收一个 ` onInvalidate ` 函数作入参, 用来注册清理失效时的回调。当以下情况发生时,这个失效回调会被触发:
67
67
68
- - 效果将重新运行
69
- - 侦听器被停止 (即,当组件卸载时, 如果在 ` setup() ` 或生命周期钩子使用了 ` watchEffect ` )
68
+ - 副作用即将重新执行时
69
+ - 侦听器被停止 (如果在 ` setup() ` 或生命周期钩子函数中使用了 ` watchEffect ` ,则在组件卸载时 )
70
70
71
71
``` js
72
72
watchEffect (onInvalidate => {
@@ -79,7 +79,9 @@ watchEffect(onInvalidate => {
79
79
})
80
80
```
81
81
82
- 我们通过传入函数注册无效回调,而不是从回调返回它,因为返回值对于异步错误处理很重要。在执行数据获取时,effect 函数通常是异步函数:
82
+ 我们之所以是通过传入一个函数去注册失效回调,而不是从回调返回它,是因为返回值对于异步错误处理很重要。
83
+
84
+ 在执行数据请求时,副作用函数往往是一个异步函数:
83
85
84
86
``` js
85
87
const data = ref (null )
@@ -89,11 +91,11 @@ watchEffect(async onInvalidate => {
89
91
})
90
92
```
91
93
92
- 异步函数隐式返回一个 Promise,但需要在 Promise 解析之前立即注册清除函数。此外 ,Vue 依赖于返回的 Promise 来自动处理 Promise 链中的潜在错误 。
94
+ 我们知道异步函数都会隐式地返回一个 Promise,但是清理函数必须要在 Promise 被 resolve 之前被注册。另外 ,Vue 依赖这个返回的 Promise 来自动处理 Promise 链上的潜在错误 。
93
95
94
- ### 效果冲刷时间
96
+ ### 副作用刷新时机
95
97
96
- Vue 的响应性系统缓冲无效的效果,并异步刷新它们,以避免在同一个 “tick”中发生许多状态转换时不必要的重复调用。在内部, 组件的 ` update ` 功能也是一种监视效果。当把用户效果加入队列时,它总是在所有组件 ` update ` 效果之后调用 :
98
+ Vue 的响应式系统会缓存副作用函数,并异步地刷新它们,这样可以避免同一个 “tick” 中多个状态改变导致的不必要的重复调用。在核心的具体实现中, 组件的 ` update ` 函数也是一个被侦听的副作用。当一个用户定义的副作用函数进入队列时, 会在所有的组件 ` update ` 后执行 :
97
99
98
100
``` html
99
101
<template >
@@ -117,12 +119,12 @@ Vue 的响应性系统缓冲无效的效果,并异步刷新它们,以避免
117
119
</script >
118
120
```
119
121
120
- 在这例子中 :
122
+ 在这个例子中 :
121
123
122
- - 计数将在首次运行时同步记录。
123
- - 当 ` count ` 发生变化时,将在 ** 组件更新后调用 ** 回调 。
124
+ - ` count ` 会在初始运行时同步打印出来
125
+ - 更改 ` count ` 时,将在组件 ** 更新后 ** 执行副作用 。
124
126
125
- 注意,第一次执行是在组件 mounted 之前的 。因此,如果你希望在侦听效果下访问 DOM (或者模版 ref ) ,请在 mounted 钩子中执行 :
127
+ 请注意,初始化运行是在组件 mounted 之前执行的 。因此,如果你希望在编写副作用函数时访问 DOM(或模板 ref) ,请在 ` onMounted ` 钩子中进行 :
126
128
127
129
``` js
128
130
onMounted (() => {
@@ -132,7 +134,7 @@ onMounted(() => {
132
134
})
133
135
```
134
136
135
- 在需要同步或在组件更新之前重新运行侦听器效果的情况下,我们可以使用 ` flush ` 选项传递一个附加的 ` options ` 对象 ( 默认为 ` post ` ) :
137
+ 如果副作用需要同步或在组件更新之前重新运行,我们可以传递一个拥有 ` flush ` 属性的对象作为 ` options ` ( 默认为 ` post ` ) :
136
138
137
139
``` js
138
140
// 同步交火
@@ -160,10 +162,10 @@ watchEffect(
160
162
161
163
` onTrack ` 和 ` onTrigger ` 选项可用于调试侦听器的行为。
162
164
163
- - 当响应式 property 或 ref 作为依赖项被跟踪时 ,将调用 ` onTrack `
164
- - 当依赖项的变化触发侦听器回调时 ,将调用 ` onTrigger `
165
+ - 当响应式 property 或 ref 作为依赖项被追踪时 ,将调用 ` onTrack `
166
+ - 当依赖项变更导致副作用被触发时 ,将调用 ` onTrigger `
165
167
166
- 两个回调都将接收一个调试器事件,其中包含有关相关依赖项的信息。建议在这些回调中放置 ` debugger ` 语句以交互方式检查依赖关系 :
168
+ 这两个回调都将接收到一个包含有关所依赖项信息的调试器事件。建议在以下回调中编写 ` debugger ` 语句来检查依赖关系 :
167
169
168
170
``` js
169
171
watchEffect (
@@ -182,15 +184,15 @@ watchEffect(
182
184
183
185
## ` watch `
184
186
185
- ` watch ` API 完全等同于组件[ 侦听 ] ( computed.html#侦听器 ) property。` watch ` 需要监视特定的数据源,并在单独的回调函数中应用副作用 。默认情况下,它也是惰性的,即只有当被监视的源发生变化时才调用回调 。
187
+ ` watch ` API 完全等同于组件[ 侦听器 ] ( computed.html#侦听器 ) property。` watch ` 需要侦听特定的数据源,并在回调函数中执行副作用 。默认情况下,它也是惰性的,即只有当被侦听的源发生变化时才执行回调 。
186
188
187
189
- 与 [ watchEffect] ( #watcheffect ) 比较,` watch ` 允许我们:
188
190
189
- - 懒性地执行副作用 ;
191
+ - 懒执行副作用 ;
190
192
- 更具体地说明什么状态应该触发侦听器重新运行;
191
- - 访问被侦听状态的先前值和当前值 。
193
+ - 访问侦听状态变化前后的值 。
192
194
193
- ### 侦听单一源
195
+ ### 侦听单个数据源
194
196
195
197
侦听器数据源可以是返回值的 getter 函数,也可以直接是 ` ref ` :
196
198
@@ -211,16 +213,16 @@ watch(count, (count, prevCount) => {
211
213
})
212
214
```
213
215
214
- ### 侦听多个源
216
+ ### 侦听多个数据源
215
217
216
- 侦听器还可以使用数组同时监视多个源 :
218
+ 侦听器还可以使用数组同时侦听多个源 :
217
219
218
220
``` js
219
221
watch ([fooRef, barRef], ([foo , bar ], [prevFoo , prevBar ]) => {
220
222
/* ... */
221
223
})
222
224
```
223
225
224
- ### 使用 ` watchEffect ` 共享行为
226
+ ### 与 ` watchEffect ` 共享的行为
225
227
226
- ` watch ` 与 [ ` watchEffect ` ] ( #watcheffect ) 共享 [ 阻止侦听器 ] ( #阻止侦听器 ) ,[ 副作用失效 ] ( #副作用失效 ) (改造将 ` onInvalidate ` 作为第三个参数传递给回调 )、[ 效果冲刷时间 ] ( #效果冲刷时间 ) 和 [ 侦听器调试] ( #侦听器调试 ) 行为。
228
+ ` watch ` 与 [ ` watchEffect ` ] ( #watcheffect ) 共享 [ 停止侦听 ] ( #停止侦听 ) ,[ 清除副作用 ] ( #清除副作用 ) (相应地 ` onInvalidate ` 会作为回调的第三个参数传入 )、[ 副作用刷新时机 ] ( #副作用刷新时机 ) 和 [ 侦听器调试] ( #侦听器调试 ) 行为。
0 commit comments