Skip to content

Commit 3bfe77d

Browse files
Merge branch 'master' of https://github.com/reactjs/reactjs.org into sync-8803c637
2 parents 2d07e70 + 8803c63 commit 3bfe77d

File tree

3 files changed

+57
-49
lines changed

3 files changed

+57
-49
lines changed

Diff for: content/docs/code-splitting.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ import("./math").then(math => {
102102
103103
When Webpack comes across this syntax, it automatically starts code-splitting
104104
your app. If you're using Create React App, this is already configured for you
105-
and you can [start using it](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#code-splitting) immediately. It's also supported
105+
and you can [start using it](https://facebook.github.io/create-react-app/docs/code-splitting) immediately. It's also supported
106106
out of the box in [Next.js](https://github.com/zeit/next.js/#dynamic-import).
107107

108108
If you're setting up Webpack yourself, you'll probably want to read Webpack's

Diff for: content/languages.yml

+34-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Status enums indicate what percentage of "core" content has been translated:
2-
# 0: Incomplete (049%)
3-
# 1: Partially complete (50–94%)
4-
# 2: Complete (95–100%)
2+
# 0: Incomplete (0-49%)
3+
# 1: Partially complete (50-99%)
4+
# 2: Complete (100%)
55

66
- name: English
77
translated_name: English
@@ -27,6 +27,10 @@
2727
translated_name: Deutsch
2828
code: de
2929
status: 0
30+
- name: Greek
31+
translated_name: Ελληνικά
32+
code: el
33+
status: 0
3034
- name: Spanish
3135
translated_name: Español
3236
code: es
@@ -38,6 +42,10 @@
3842
- name: French
3943
translated_name: Français
4044
code: fr
45+
status: 1
46+
- name: Gujarati
47+
translated_name: ગુજરાતી
48+
code: gu
4149
status: 0
4250
- name: Hebrew
4351
translated_name: עברית
@@ -62,11 +70,23 @@
6270
- name: Japanese
6371
translated_name: 日本語
6472
code: ja
65-
status: 1
73+
status: 2
74+
- name: Central Khmer
75+
translated_name: ភាសាខ្មែរ
76+
code: km
77+
status: 0
6678
- name: Korean
6779
translated_name: 한국어
6880
code: ko
6981
status: 0
82+
- name: Kurdish
83+
translated_name: کوردی‎
84+
code: ku
85+
status: 0
86+
- name: Lithuanian
87+
translated_name: Lietuvių kalba
88+
code: lt
89+
status: 0
7090
- name: Malayalam
7191
translated_name: മലയാളം
7292
code: ml
@@ -98,7 +118,7 @@
98118
- name: Russian
99119
translated_name: Русский
100120
code: ru
101-
status: 0
121+
status: 1
102122
- name: Sinhala
103123
translated_name: සිංහල
104124
code: si
@@ -107,13 +127,21 @@
107127
translated_name: தமிழ்
108128
code: ta
109129
status: 0
130+
- name: Telugu
131+
translated_name: తెలుగు
132+
code: te
133+
status: 0
110134
- name: Turkish
111135
translated_name: Türkçe
112136
code: tr
113137
status: 0
114138
- name: Ukrainian
115139
translated_name: Українська
116140
code: uk
141+
status: 1
142+
- name: Urdu
143+
translated_name: اردو
144+
code: ur
117145
status: 0
118146
- name: Uzbek
119147
translated_name: Oʻzbekcha
@@ -126,7 +154,7 @@
126154
- name: Simplified Chinese
127155
translated_name: 简体中文
128156
code: zh-hans
129-
status: 0
157+
status: 1
130158
- name: Traditional Chinese
131159
translated_name: 繁體中文
132160
code: zh-hant

Diff for: content/tutorial/tutorial.md

+22-42
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ The tutorial is divided into several sections:
3131

3232
You don't have to complete all of the sections at once to get the value out of this tutorial. Try to get as far as you can -- even if it's one or two sections.
3333

34-
It's fine to copy and paste code as you're following along the tutorial, but we recommend to type it by hand. This will help you develop a muscle memory and a stronger understanding.
35-
3634
### What Are We Building? {#what-are-we-building}
3735

3836
In this tutorial, we'll show how to build an interactive tic-tac-toe game with React.
@@ -188,7 +186,9 @@ The Square component renders a single `<button>` and the Board renders 9 squares
188186

189187
### Passing Data Through Props {#passing-data-through-props}
190188

191-
Just to get our feet wet, let's try passing some data from our Board component to our Square component.
189+
To get our feet wet, let's try passing some data from our Board component to our Square component.
190+
191+
We strongly recommend typing code by hand as you're working through the tutorial and not using copy/paste. This will help you develop muscle memory and a stronger understanding.
192192

193193
In Board's `renderSquare` method, change the code to pass a prop called `value` to the Square:
194194

@@ -242,7 +242,7 @@ class Square extends React.Component {
242242
}
243243
```
244244

245-
If we click on a Square now, we should get an alert in our browser.
245+
If you click on a Square now, you should see an alert in your browser.
246246

247247
>Note
248248
>
@@ -260,7 +260,7 @@ If we click on a Square now, we should get an alert in our browser.
260260
>}
261261
>```
262262
>
263-
>Notice how with `onClick={() => alert('click')}`, we're passing *a function* as the `onClick` prop. It only fires after a click. Forgetting `() =>` and writing `onClick={alert('click')}` is a common mistake, and would fire the alert every time the component re-renders.
263+
>Notice how with `onClick={() => alert('click')}`, we're passing *a function* as the `onClick` prop. React will only call this function after a click. Forgetting `() =>` and writing `onClick={alert('click')}` is a common mistake, and would fire the alert every time the component re-renders.
264264
265265
As a next step, we want the Square component to "remember" that it got clicked, and fill it with an "X" mark. To "remember" things, components use **state**.
266266
@@ -294,7 +294,7 @@ class Square extends React.Component {
294294
Now we'll change the Square's `render` method to display the current state's value when clicked:
295295

296296
* Replace `this.props.value` with `this.state.value` inside the `<button>` tag.
297-
* Replace the `() => alert()` event handler with `() => this.setState({value: 'X'})`.
297+
* Replace the `onClick={...}` event handler with `onClick={() => this.setState({value: 'X'})}`.
298298
* Put the `className` and `onClick` props on separate lines for better readability.
299299

300300
After these changes, the `<button>` tag that is returned by the Square's `render` method looks like this:
@@ -356,7 +356,9 @@ We may think that Board should just ask each Square for the Square's state. Alth
356356

357357
**To collect data from multiple children, or to have two child components communicate with each other, you need to declare the shared state in their parent component instead. The parent component can pass the state back down to the children by using props; this keeps the child components in sync with each other and with the parent component.**
358358

359-
Lifting state into a parent component is common when React components are refactored -- let's take this opportunity to try it out. We'll add a constructor to the Board and set the Board's initial state to contain an array with 9 nulls. These 9 nulls correspond to the 9 squares:
359+
Lifting state into a parent component is common when React components are refactored -- let's take this opportunity to try it out.
360+
361+
Add a constructor to the Board and set the Board's initial state to contain an array of 9 nulls corresponding to the 9 squares:
360362

361363
```javascript{2-7}
362364
class Board extends React.Component {
@@ -370,35 +372,9 @@ class Board extends React.Component {
370372
renderSquare(i) {
371373
return <Square value={i} />;
372374
}
373-
374-
render() {
375-
const status = 'Next player: X';
376-
377-
return (
378-
<div>
379-
<div className="status">{status}</div>
380-
<div className="board-row">
381-
{this.renderSquare(0)}
382-
{this.renderSquare(1)}
383-
{this.renderSquare(2)}
384-
</div>
385-
<div className="board-row">
386-
{this.renderSquare(3)}
387-
{this.renderSquare(4)}
388-
{this.renderSquare(5)}
389-
</div>
390-
<div className="board-row">
391-
{this.renderSquare(6)}
392-
{this.renderSquare(7)}
393-
{this.renderSquare(8)}
394-
</div>
395-
</div>
396-
);
397-
}
398-
}
399375
```
400376

401-
When we fill the board in later, the board will look something like this:
377+
When we fill the board in later, the `this.state.squares` array will look something like this:
402378

403379
```javascript
404380
[
@@ -432,7 +408,7 @@ Each Square will now receive a `value` prop that will either be `'X'`, `'O'`, or
432408

433409
Next, we need to change what happens when a Square is clicked. The Board component now maintains which squares are filled. We need to create a way for the Square to update the Board's state. Since state is considered to be private to a component that defines it, we cannot update the Board's state directly from Square.
434410

435-
To maintain the Board's state's privacy, we'll pass down a function from the Board to the Square. This function will get called when a Square is clicked. We'll change the `renderSquare` method in Board to:
411+
Instead, we'll pass down a function from the Board to the Square, and we'll have Square call that function when a square is clicked. We'll change the `renderSquare` method in Board to:
436412

437413
```javascript{5}
438414
renderSquare(i) {
@@ -478,11 +454,11 @@ When a Square is clicked, the `onClick` function provided by the Board is called
478454
2. When the button is clicked, React will call the `onClick` event handler that is defined in Square's `render()` method.
479455
3. This event handler calls `this.props.onClick()`. The Square's `onClick` prop was specified by the Board.
480456
4. Since the Board passed `onClick={() => this.handleClick(i)}` to Square, the Square calls `this.handleClick(i)` when clicked.
481-
5. We have not defined the `handleClick()` method yet, so our code crashes.
457+
5. We have not defined the `handleClick()` method yet, so our code crashes. If you click a square now, you should see a red error screen saying something like "this.handleClick is not a function".
482458

483459
>Note
484460
>
485-
>The DOM `<button>` element's `onClick` attribute has a special meaning to React because it is a built-in component. For custom components like Square, the naming is up to you. We could name the Square's `onClick` prop or Board's `handleClick` method differently. In React, however, it is a convention to use `on[Event]` names for props which represent events and `handle[Event]` for the methods which handle the events.
461+
>The DOM `<button>` element's `onClick` attribute has a special meaning to React because it is a built-in component. For custom components like Square, the naming is up to you. We could give any name to the Square's `onClick` prop or Board's `handleClick` method, and the code would work the same. In React, it's conventional to use `on[Event]` names for props which represent events and `handle[Event]` for the methods which handle the events.
486462
487463
When we try to click a Square, we should get an error because we haven't defined `handleClick` yet. We'll now add `handleClick` to the Board class:
488464

@@ -539,7 +515,7 @@ class Board extends React.Component {
539515

540516
**[View the full code at this point](https://codepen.io/gaearon/pen/ybbQJX?editors=0010)**
541517

542-
After these changes, we're again able to click on the Squares to fill them. However, now the state is stored in the Board component instead of the individual Square components. When the Board's state changes, the Square components re-render automatically. Keeping the state of all squares in the Board component will allow it to determine the winner in the future.
518+
After these changes, we're again able to click on the Squares to fill them, the same as we had before. However, now the state is stored in the Board component instead of the individual Square components. When the Board's state changes, the Square components re-render automatically. Keeping the state of all squares in the Board component will allow it to determine the winner in the future.
543519

544520
Since the Square components no longer maintain state, the Square components receive values from the Board component and inform the Board component when they're clicked. In React terms, the Square components are now **controlled components**. The Board has full control over them.
545521

@@ -581,7 +557,7 @@ Detecting changes in mutable objects is difficult because they are modified dire
581557

582558
Detecting changes in immutable objects is considerably easier. If the immutable object that is being referenced is different than the previous one, then the object has changed.
583559

584-
#### Determining When to Re-render in React {#determining-when-to-re-render-in-react}
560+
#### Determining When to Re-Render in React {#determining-when-to-re-render-in-react}
585561

586562
The main benefit of immutability is that it helps you build _pure components_ in React. Immutable data can easily determine if changes have been made which helps to determine when a component requires re-rendering.
587563

@@ -611,7 +587,7 @@ We have changed `this.props` to `props` both times it appears.
611587

612588
>Note
613589
>
614-
>When we modified the Square to be a function component, we also changed `onClick={() => this.props.onClick()}` to a shorter `onClick={props.onClick}` (note the lack of parentheses on *both* sides). In a class, we used an arrow function to access the correct `this` value, but in a function component we don't need to worry about `this`.
590+
>When we modified the Square to be a function component, we also changed `onClick={() => this.props.onClick()}` to a shorter `onClick={props.onClick}` (note the lack of parentheses on *both* sides).
615591
616592
### Taking Turns {#taking-turns}
617593

@@ -643,7 +619,9 @@ Each time a player moves, `xIsNext` (a boolean) will be flipped to determine whi
643619
}
644620
```
645621

646-
With this change, "X"s and "O"s can take turns. Let's also change the "status" text in Board's `render` so that it displays which player has the next turn:
622+
With this change, "X"s and "O"s can take turns. Try it!
623+
624+
Let's also change the "status" text in Board's `render` so that it displays which player has the next turn:
647625

648626
```javascript{2}
649627
render() {
@@ -714,7 +692,7 @@ class Board extends React.Component {
714692

715693
### Declaring a Winner {#declaring-a-winner}
716694

717-
Now that we show which player's turn is next, we should also show when the game is won and there are no more turns to make. We can determine a winner by adding this helper function to the end of the file:
695+
Now that we show which player's turn is next, we should also show when the game is won and there are no more turns to make. Copy this helper function and paste it at the end of the file:
718696

719697
```javascript
720698
function calculateWinner(squares) {
@@ -738,6 +716,8 @@ function calculateWinner(squares) {
738716
}
739717
```
740718

719+
Given an array of 9 squares, this function will check for a winner and return `'X'`, `'O'`, or `null` as appropriate.
720+
741721
We will call `calculateWinner(squares)` in the Board's `render` function to check if a player has won. If a player has won, we can display text such as "Winner: X" or "Winner: O". We'll replace the `status` declaration in Board's `render` function with this code:
742722

743723
```javascript{2-8}

0 commit comments

Comments
 (0)