@@ -33,7 +33,7 @@ function Example() {
33
33
}
34
34
```
35
35
36
- 这段代码是基于[ 上一页中的计数器示例] ( /docs/hooks-state.html ) 修改的,我们为计数器增加了一个小功能:将 document 的 title 设置为一句包含了点击次数的消息
36
+ 这段代码是基于[ 上一页中的计数器示例] ( /docs/hooks-state.html ) 修改的,我们为计数器增加了一个小功能:将 document 的 title 设置为一句包含了点击次数的消息。
37
37
38
38
数据获取,设置订阅以及手动更改 React 组件中的 DOM 都是副作用的示例。无论你知不知道这些操作还有"副作用"这个名字,应该都已经在组件中使用过它们了。
39
39
@@ -83,7 +83,7 @@ class Example extends React.Component {
83
83
}
84
84
```
85
85
86
- 注意,** 在这个 class 中我们需要在两个生命周期函数中写重复的代码 **
86
+ 注意,** 在这个 class 中,我们需要在两个生命周期函数中编写重复的代码。 **
87
87
88
88
这是因为很多情况下我们希望在组件加载和更新时执行同样的操作。从概念上说,我们希望它在每次渲染之后执行 —— 但 React 的 class 组件没有提供这样的方法。即使我们提取出一个方法,我们还是要在两个地方调用它。
89
89
@@ -147,7 +147,7 @@ function Example() {
147
147
148
148
### 使用 Class 的示例 {#example-using-classes-1}
149
149
150
- 在 React class 中,你通常会在 ` componentDidMount` 中设置订阅,并在 ` componentWillUnmount` 中清理它。 例如,假设我们有一个 ` ChatAPI` 模块,它允许我们订阅好友的在线状态。以下是我们如何使用 class 订阅和显示该状态:
150
+ 在 React class 中,你通常会在 ` componentDidMount` 中设置订阅,并在 ` componentWillUnmount` 中清理它。例如,假设我们有一个 ` ChatAPI` 模块,它允许我们订阅好友的在线状态。以下是我们如何使用 class 订阅和显示该状态:
151
151
152
152
` ` ` js{8 - 26 }
153
153
class FriendStatus extends React .Component {
@@ -186,17 +186,17 @@ class FriendStatus extends React.Component {
186
186
}
187
187
` ` `
188
188
189
- 你会注意到 ` componentDidMount` 和 ` componentWillUnmount` 之间相互依赖。生命周期函数让我们只能拆分这些逻辑,即使他们中的代码都是服务于同一个功能 。
189
+ 你会注意到 ` componentDidMount` 和 ` componentWillUnmount` 之间相互对应。生命周期函数迫使我们拆分这些逻辑代码,即使这两部分代码都作用于相同的副作用 。
190
190
191
191
>注意
192
192
>
193
- >眼尖的读者可能已经注意到了,这个示例还需要一个 ` componentDidUpdate` 方法才是完全正确的 。我们先暂时忽略这一点,并在本页的[后面一部分 ](#explanation-why-effects-run-on-each-update)再关注它 。
193
+ >眼尖的读者可能已经注意到了,这个示例还需要编写 ` componentDidUpdate` 方法才能保证完全正确 。我们先暂时忽略这一点,本页的[后续部分 ](#explanation-why-effects-run-on-each-update)会继续介绍它 。
194
194
195
195
### 使用 Hook 的示例
196
196
197
- 让我们看看我们如何用 Hook 编写这个组件。
197
+ 如何使用 Hook 编写这个组件。
198
198
199
- 您可能认为我们需要单独的 effect 来执行清理工作。但因为添加和删除订阅的代码是如此紧密相关,所以 ` useEffect` 的设计是让他们保持在同一个地方。如果你的 effect 返回了一个函数, React 将会在清理的时候执行它。
199
+ 你可能认为我们需要单独的 effect 来执行清理工作。但因为添加和删除订阅的代码是如此紧密相关,所以 ` useEffect` 的设计是让他们保持在同一个地方。如果你的 effect 返回了一个函数, React 将会在清理的时候执行它。
200
200
201
201
` ` ` js{6 - 16 }
202
202
import React , { useState , useEffect } from ' react' ;
@@ -225,7 +225,7 @@ function FriendStatus(props) {
225
225
226
226
**为什么我们要在 effect 中返回一个函数?**这是 effect 可选的清理机制。每一个 effect 都可以返回一个它的清理函数。这让我们可以将添加和移除订阅的逻辑放在一起。他们都是同一个 effect 的一部分。
227
227
228
- **React 什么时候清理一个 effect?**React 在组件卸载的时候执行清理。正如我们之前学到的, effect 在每次渲染的时候都会执行。这就是为什么 React *还会*在执行 effect 之前对上一个 effect 进行清理。我们稍后将讨论[为什么这有助于避免 bug](#explanation-why-effects-run-on-each-update)以及[如何在发生性能问题时选择跳过此行为](#tip-optimizing-performance-by-skipping-effects)。
228
+ **React 什么时候清理一个 effect?**React 在组件卸载的时候执行清理。正如我们之前学到的,effect 在每次渲染的时候都会执行。这就是为什么 React *还会*在执行 effect 之前对上一个 effect 进行清理。我们稍后将讨论[为什么这有助于避免 bug](#explanation-why-effects-run-on-each-update)以及[如何在发生性能问题时选择跳过此行为](#tip-optimizing-performance-by-skipping-effects)。
229
229
230
230
>注意
231
231
>
@@ -390,7 +390,7 @@ function FriendStatusWithCounter(props) {
390
390
}
391
391
` ` `
392
392
393
- 忘记正确地处理 ` componentDidUpdate` 是 React 应用中一个常见的错误来源 。
393
+ 忘记正确地处理 ` componentDidUpdate` 是 React 应用中一个常见的 bug 来源 。
394
394
395
395
现在看一下使用 Hook 的这个版本:
396
396
@@ -481,7 +481,7 @@ useEffect(() => {
481
481
482
482
## 下一步 {#next-steps}
483
483
484
- 恭喜你!这是一个很长的页面,希望最后你关于 effect 的大多数问题都得到了解答。你已经学习了 State Hook 和 Effect Hook,将它们结合起来你可以做很多事情了。它们涵盖了大多数使用 class 的用例 - 如果没有,您可能须要 [其他的 Hook](/docs/hooks-reference.html)。
484
+ 恭喜你!这是一个很长的页面,希望最后你关于 effect 的大多数问题都得到了解答。你已经学习了 State Hook 和 Effect Hook,将它们结合起来你可以做很多事情了。它们涵盖了大多数使用 class 的用例 —— 如果没有,你可以查看 [其他的 Hook](/docs/hooks-reference.html)。
485
485
486
486
我们也看到了 Hook 如何解决[动机](/docs/hooks-intro.html#motivation)中提到的问题。我们看到 effect 的清理机制如何避免了 ` componentDidUpdate` 和 ` componentWillUnmount` 中的重复,同时让相关的代码关联更加紧密,帮助我们避免一些 bug。我们还看到了我们如何根据 effect 的功能分隔他们,这是在 class 中无法做到的。
487
487
0 commit comments