You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
*Hooks* are a new addition in React 16.8. They let you use state and other React features without writing a class.
9
+
*Hook* 是 React 16.8 中新增的功能。它让你不用写 class 也可以使用 state 和其他 React 特性。
10
10
11
-
The [previous page](/docs/hooks-intro.html) introduced Hooks with this example:
11
+
[上一章节](/docs/hooks-intro.html)用下面的例子介绍了 Hook:
12
12
13
13
```js{4-5}
14
14
import React, { useState } from 'react';
15
15
16
16
function Example() {
17
-
// Declare a new state variable, which we'll call "count"
17
+
// 声明一个叫 "count" 的 state 变量
18
18
const [count, setCount] = useState(0);
19
19
20
20
return (
@@ -28,11 +28,11 @@ function Example() {
28
28
}
29
29
```
30
30
31
-
We'll start learning about Hooks by comparing this code to an equivalent class example.
31
+
我们将通过将这段代码与一个等价的 class 示例进行比较来开始学习有关 Hook 的知识。
32
32
33
-
## Equivalent Class Example {#equivalent-class-example}
33
+
## 等价的 class 示例 {#equivalent-class-example}
34
34
35
-
If you used classes in React before, this code should look familiar:
35
+
如果你之前在 React 中使用过 class,这段代码看起来应该很熟悉:
36
36
37
37
```js
38
38
classExampleextendsReact.Component {
@@ -56,39 +56,39 @@ class Example extends React.Component {
56
56
}
57
57
```
58
58
59
-
The state starts as `{ count: 0 }`, and we increment `state.count` when the user clicks a button by calling `this.setState()`. We'll use snippets from this class throughout the page.
59
+
state 初始值为 `{ count: 0 }` ,当用户点击按钮后,我们通过调用 `this.setState()` 来增加 `state.count`。后文中我们将使用这个 class 的代码片段做范例。
60
60
61
-
>Note
61
+
>注意
62
62
>
63
-
>You might be wondering why we're using a counter here instead of a more realistic example. This is to help us focus on the API while we're still making our first steps with Hooks.
63
+
>你可能想知道为什么我们在这里使用一个计数器例子而不一个更实际的示例。因为我们还只是初步接触 Hook ,这可以帮助我们将注意力集中到 API 本身。
64
64
65
-
## Hooks and Function Components {#hooks-and-function-components}
65
+
## Hook 和函数定义组件 {#hooks-and-function-components}
66
66
67
-
As a reminder, function components in React look like this:
67
+
复习一下, React 的函数定义组件是这样的:
68
68
69
69
```js
70
70
constExample= (props) => {
71
-
//You can use Hooks here!
71
+
//你可以在这使用 Hooks
72
72
return<div />;
73
73
}
74
74
```
75
75
76
-
or this:
76
+
或是这样:
77
77
78
78
```js
79
79
functionExample(props) {
80
-
//You can use Hooks here!
80
+
//你可以在这使用 Hooks
81
81
return<div />;
82
82
}
83
83
```
84
84
85
-
You might have previously known these as "stateless components". We're now introducing the ability to use React state from these, so we prefer the name "function components".
85
+
你之前可能把它们叫做“无状态组件”。但现在我们为它们引入了使用 React state 的能力,所以我们更喜欢叫它"函数定义组件"。
86
86
87
-
Hooks **don't** work inside classes. But you can use them instead of writing classes.
87
+
Hook 在 class 内部是**不**起作用的。但你可以使用它们来取代 class 。
88
88
89
-
## What's a Hook? {#whats-a-hook}
89
+
## Hook 是什么? {#whats-a-hook}
90
90
91
-
Our new example starts by importing the `useState` Hook from React:
91
+
我们的新示例首先从 React 导入 `useState` Hook
92
92
93
93
```js{1}
94
94
import React, { useState } from 'react';
@@ -98,17 +98,17 @@ function Example() {
98
98
}
99
99
```
100
100
101
-
**What is a Hook?**A Hook is a special function that lets you "hook into" React features. For example, `useState`is a Hook that lets you add React state to function components. We'll learn other Hooks later.
**When would I use a Hook?**If you write a function component and realize you need to add some state to it, previously you had to convert it to a class. Now you can use a Hook inside the existing function component. We're going to do that right now!
>There are some special rules about where you can and can't use Hooks within a component. We'll learn them in [Rules of Hooks](/docs/hooks-rules.html).
## Declaring a State Variable {#declaring-a-state-variable}
109
+
## 声明 State 变量 {#declaring-a-state-variable}
110
110
111
-
In a class, we initialize the `count` state to `0` by setting `this.state`to`{ count: 0 }`in the constructor:
111
+
在 class 中,我们通过在构造函数中设置 `this.state`为`{ count: 0 }`来初始化 `count` state 为 `0`:
112
112
113
113
```js{4-6}
114
114
class Example extends React.Component {
@@ -120,76 +120,76 @@ class Example extends React.Component {
120
120
}
121
121
```
122
122
123
-
In a function component, we have no `this`, so we can't assign or read `this.state`. Instead, we call the `useState` Hook directly inside our component:
// Declare a new state variable, which we'll call "count"
129
+
// 声明一个叫 “count” 的 state 变量
130
130
const [count, setCount] = useState(0);
131
131
```
132
132
133
-
**What does calling `useState`do?**It declares a "state variable". Our variable is called `count` but we could call it anything else, like `banana`. This is a way to "preserve" some values between the function calls —`useState`is a new way to use the exact same capabilities that `this.state`provides in a class. Normally, variables "disappear" when the function exits but state variables are preserved by React.
133
+
**`useState`方法做了什么?**它定义一个 “state 变量”。我们的变量叫 `count`, 但我们可以把它叫做任意的东西,像 `banana`。这是一种在函数调用之间保存一些值的方式——`useState`是一种新方法,它和 class 里面的 `this.state`提供的功能完全相同。一般来说,在函数退出后变量就就会"消失",但 state 变量会被 React 保留。
134
134
135
-
**What do we pass to `useState` as an argument?**The only argument to the `useState()`Hook is the initial state. Unlike with classes, the state doesn't have to be an object. We can keep a number or a string if that's all we need. In our example, we just want a number for how many times the user clicked, so pass `0`as initial state for our variable. (If we wanted to store two different values in state, we would call `useState()` twice.)
135
+
**我们应该传递哪些参数给 `useState`?**`useState()`方法里面唯一的参数就是初始 state。不用于 class,我们可以按照需要使用数字或字符串,而不一定是要一个对象。在我们示例中,只要一个数字来记录用户点击次数,所以我们传了 `0`作为变量的初始 state。(如果我们想要在 state 中存储两个不同的变量,只需调用 `useState()`两次即可。)
136
136
137
-
**What does `useState`return?**It returns a pair of values: the current state and a function that updates it. This is why we write `const [count, setCount] = useState()`. This is similar to `this.state.count`and`this.setState`in a class, except you get them in a pair. If you're not familiar with the syntax we used, we'll come back to it [at the bottom of this page](/docs/hooks-state.html#tip-what-do-square-brackets-mean).
137
+
**`useState`方法的返回值是什么?**它返回一对值:当前 state 和一个更新 state 的函数。这就是我们写 `const [count, setCount] = useState()` 的原因。这跟 class 里面 `this.state.count`和`this.setState`类似,唯一区别就是你可以成对的获取它们。如果你不熟悉我们使用的语法,我们会在[这页的底部](/docs/hooks-state.html#tip-what-do-square-brackets-mean)介绍它。
138
138
139
-
Now that we know what the `useState`Hook does, our example should make more sense:
139
+
既然我们知道了 `useState`的作用,我们的示例应该更容易理解了:
140
140
141
141
```js{4,5}
142
142
import React, { useState } from 'react';
143
143
144
144
function Example() {
145
-
// Declare a new state variable, which we'll call "count"
145
+
// 声明一个叫 "count" 的 state 变量
146
146
const [count, setCount] = useState(0);
147
147
```
148
148
149
-
We declare a state variable called `count`, and set it to `0`. React will remember its current value between re-renders, and provide the most recent one to our function. If we want to update the current `count`, we can call `setCount`.
149
+
我们声明了一个叫 `count` 的 state 变量,然后把它设为 `0`。React 会在重复渲染时记住它当前的值,并且提供最新的值给我们的函数。我们可以通过调用 `setCount` 来更新当前的 `count`。
150
150
151
-
>Note
151
+
>注意
152
152
>
153
-
>You might be wondering: why is `useState`not named `createState` instead?
153
+
>你可能想知道:为什么叫 `useState`而不叫 `createState`?
154
154
>
155
-
>"Create" wouldn't be quite accurate because the state is only created the first time our component renders. During the next renders, `useState`gives us the current state. Otherwise it wouldn't be "state" at all! There's also a reason why Hook names *always* start with `use`. We'll learn why later in the [Rules of Hooks](/docs/hooks-rules.html).
In a function, we already have `setCount`and`count`as variables so we don't need`this`:
182
+
在函数中,我们已经有了 `setCount`和`count`变量,所以我们不需要`this`:
183
183
184
184
```js{1}
185
185
<button onClick={() => setCount(count + 1)}>
186
186
Click me
187
187
</button>
188
188
```
189
189
190
-
## Recap {#recap}
190
+
## 总结 {#recap}
191
191
192
-
Let's now **recap what we learned line by line** and check our understanding.
192
+
现在让我们来**仔细回顾一下学到的知识**,看下我们是否真正理解了。
193
193
194
194
<!--
195
195
I'm not proud of this line markup. Please somebody fix this.
@@ -212,69 +212,69 @@ Let's now **recap what we learned line by line** and check our understanding.
212
212
14: }
213
213
```
214
214
215
-
***Line 1:**We import the`useState` Hook from React. It lets us keep local state in a function component.
216
-
***Line 4:**Inside the `Example`component, we declare a new state variable by calling the `useState` Hook. It returns a pair of values, to which we give names. We're calling our variable `count` because it holds the number of button clicks. We initialize it to zero by passing `0`as the only `useState`argument. The second returned item is itself a function. It lets us update the `count`so we'll name it `setCount`.
217
-
***Line 9:**When the user clicks, we call `setCount` with a new value. React will then re-render the `Example`component, passing the new `count`value to it.
This might seem like a lot to take in at first. Don't rush it! If you're lost in the explanation, look at the code above again and try to read it from top to bottom. We promise that once you try to "forget" how state works in classes, and look at this code with fresh eyes, it will make sense.
219
+
乍一看这似乎有点太多了。不要急于求成!如果你有不理解的地方,请再次查看以上代码并从头到尾阅读。我们保证一旦你试着"忘记" class 里面 state 是如何工作的,并用新的眼光看这段代码,就容易理解了。
220
220
221
-
### Tip: What Do Square Brackets Mean? {#tip-what-do-square-brackets-mean}
You might have noticed the square brackets when we declare a state variable:
223
+
你可能注意到我们用方括号定义了一个 state 变量
224
224
225
225
```js
226
226
const [count, setCount] =useState(0);
227
227
```
228
228
229
-
The names on the left aren't a part of the React API. You can name your own state variables:
229
+
等号左边名字并不是 React API 的部分,你可以自己取名字:
230
230
231
231
```js
232
232
const [fruit, setFruit] =useState('banana');
233
233
```
234
234
235
-
This JavaScript syntax is called ["array destructuring"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Array_destructuring). It means that we're making two new variables `fruit`and`setFruit`, where `fruit`is set to the first value returned by `useState`, and `setFruit`is the second. It is equivalent to this code:
var fruitStateVariable =useState('banana'); //Returns a pair
239
-
var fruit = fruitStateVariable[0]; //First item in a pair
240
-
var setFruit = fruitStateVariable[1]; //Second item in a pair
238
+
var fruitStateVariable =useState('banana'); //返回一个有两个元素的数组
239
+
var fruit = fruitStateVariable[0]; //数组里的第一个值
240
+
var setFruit = fruitStateVariable[1]; //数组里的第二个值
241
241
```
242
242
243
-
When we declare a state variable with `useState`, it returns a pair — an array with two items. The first item is the current value, and the second is a function that lets us update it. Using `[0]`and`[1]`to access them is a bit confusing because they have a specific meaning. This is why we use array destructuring instead.
243
+
当我们使用 `useSatate` 定义 一个 state 变量时候,它返回一个有两个值的数组。第一个值是当前的 state,第二个值是更新 state 的函数。使用 `[0]`和`[1]`来访问有点令人困惑,因为它们有特定的含义。这就是我们使用数组解构的原因。
244
244
245
-
>Note
245
+
>注意
246
246
>
247
-
>You might be curious how React knows which component `useState`corresponds to since we're not passing anything like `this`back to React. We'll answer [this question](/docs/hooks-faq.html#how-does-react-associate-hook-calls-with-components) and many others in the FAQ section.
### Tip: Using Multiple State Variables {#tip-using-multiple-state-variables}
249
+
### 提示:使用多个 state 变量 {#tip-using-multiple-state-variables}
250
250
251
-
Declaring state variables as a pair of `[something, setSomething]`is also handy because it lets us give *different* names to different state variables if we want to use more than one:
251
+
将 state 变量声明为一对 `[something, setSomething]`也很方便,因为如果我们想使用多个 state 变量,它允许我们给不同的 state 变量取不同的名称:
You **don't have to** use many state variables. State variables can hold objects and arrays just fine, so you can still group related data together. However, unlike `this.setState` in a class, updating a state variable always *replaces* it instead of merging it.
270
+
你**不必**使用多个 state 变量。State 变量可以很好的存储对象和数组,因此,你仍然可以将相关数据分为一组。然而,不像 class 中的 `this.setState`,更新 state 变量总是*替换*它而不是合并它。
271
271
272
-
We provide more recommendations on splitting independent state variables [in the FAQ](/docs/hooks-faq.html#should-i-use-one-or-many-state-variables).
272
+
我们[在 FAQ 中](/docs/hooks-faq.html#should-i-use-one-or-many-state-variables)提供了更多关于分离独立 state 变量的建议。
273
273
274
-
## Next Steps {#next-steps}
274
+
## 下一步 {#next-steps}
275
275
276
-
On this page we've learned about one of the Hooks provided by React, called`useState`. We're also sometimes going to refer to it as the "State Hook". It lets us add local state to React function components -- which we did for the first time ever!
We also learned a little bit more about what Hooks are. Hooks are functions that let you "hook into" React features from function components. Their names always start with `use`, and there are more Hooks we haven't seen yet.
**Now let's continue by [learning the next Hook: `useEffect`.](/docs/hooks-effect.html)** It lets you perform side effects in components, and is similar to lifecycle methods in classes.
280
+
**现在我们继续下一章[学习下一个 Hook: `useEffect`](/docs/hooks-effect.html)。** 它让你能在组件中产生副作用,并且它跟 class 里面的生命周期函数很类似。
0 commit comments