Skip to content

Commit ade75ee

Browse files
authored
Merge pull request #41 from reactjs/sync-8803c637
Sync with reactjs.org @ 8803c63
2 parents 4171c3b + fa51463 commit ade75ee

File tree

3 files changed

+53
-47
lines changed

3 files changed

+53
-47
lines changed

content/docs/code-splitting.md

Lines changed: 1 addition & 1 deletion
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

content/languages.yml

Lines changed: 34 additions & 6 deletions
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

content/tutorial/tutorial.md

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,8 @@ Samouczek podzieliliśmy na kilka części:
3131

3232
Nie musisz wcale przechodzić przez wszystkie części samouczka naraz, żeby wynieść z niego cokolwiek. Spróbuj jednak dojść najdalej jak możesz - nawet jeśli będą to tylko dwa rozdziały.
3333

34-
W trakcie wykonywania poleceń możesz kopiować kod do edytora, ale zalecamy pisanie go samodzielnie. Pozwoli ci to bardziej skupić się na poszczególnych zagadnieniach, dzięki czemu lepiej je sobie przyswoisz i zrozumiesz.
35-
3634
### Co będziemy budować? {#what-are-we-building}
3735

38-
W tym samouczku pokażemy, jak przy pomocy Reacta zbudować interaktywną grę w "kółko i krzyżyk".
39-
4036
Na koniec nasz kod będzie wyglądał tak: **[Efekt końcowy](https://codepen.io/gaearon/pen/gWWZgR?editors=0010)**. Być może w tej chwili kod wygląda bez sensu albo nie rozumiesz jego składni, ale bez obaw! Celem tego samouczka jest właśnie pomóc ci zrozumieć Reacta i jego składnię.
4137

4238
Zanim przystąpisz do dalszej lektury, zachęcamy cię do uruchomienia gry w "kółko i krzyżyk". Zwróć uwagę, że jedną z funkcjonalności tej aplikacji jest, znajdująca się na prawo od planszy, numerowana lista. Wyświetla ona na bieżąco wszystkie wykonywane w danej rozgrywce ruchy.
@@ -190,6 +186,8 @@ Komponent `Square` (pole) renderuje pojedynczy element `<button>`, a `Board` (pl
190186

191187
Na dobry początek, spróbujmy przekazać jakieś dane z komponentu `Board` do `Square`.
192188

189+
W trakcie wykonywania poleceń zalecamy pisanie kodu samodzielnie. Pozwoli ci to bardziej skupić się na poszczególnych zagadnieniach, dzięki czemu lepiej je sobie przyswoisz i zrozumiesz.
190+
193191
W metodzie `renderSquare` komponentu `Board` przekaż komponentowi `Square` atrybut o nazwie `value` (pol. *wartość*):
194192

195193
```js{3}
@@ -242,7 +240,7 @@ class Square extends React.Component {
242240
}
243241
```
244242

245-
Teraz gdy klikniemy na polu, przeglądarka wyświetli wiadomość w oknie dialogowym.
243+
Teraz gdy klikniesz na polu, przeglądarka wyświetli wiadomość w oknie dialogowym.
246244

247245
>Uwaga
248246
>
@@ -260,7 +258,7 @@ Teraz gdy klikniemy na polu, przeglądarka wyświetli wiadomość w oknie dialog
260258
>}
261259
>```
262260
>
263-
>Zauważ, że za pomocą `onClick={() => alert('kliknięto w przycisk')}` pod atrybutem `onClick` przekazujemy *funkcję*. Zostanie ona wywołana dopiero po kliknięciu w przycisk. Częstym błędem jest zapominanie o `() =>` i pisanie `onClick={alert('kliknięto w przycisk')}`, co powoduje wyświetlenie wiadomości w momencie renderowania komponentu.
261+
>Zauważ, że za pomocą `onClick={() => alert('kliknięto w przycisk')}` pod atrybutem `onClick` przekazujemy *funkcję*. React wywoła ją dopiero po kliknięciu w przycisk. Częstym błędem jest zapominanie o `() =>` i pisanie `onClick={alert('kliknięto w przycisk')}`, co powoduje wyświetlenie wiadomości w momencie renderowania komponentu.
264262
265263
W następnym kroku sprawimy, by komponent `Square` "pamiętał", że został kliknięty, i wyświetlał literę "X". Komponenty mogą "pamiętać" o różnych rzeczach dzięki **stanowi** (ang. *state*).
266264
@@ -294,7 +292,7 @@ class Square extends React.Component {
294292
Teraz zmienimy kod w metodzie `render` komponentu `Square` tak, aby po kliknięciu wyświetlał wartość aktualnego stanu:
295293

296294
* zamień `this.props.value` na `this.state.value` wewnątrz znacznika `<button>`,
297-
* zamień procedurę obsługi zdarzenia `() => alert()` na `() => this.setState({value: 'X'})`,
295+
* zamień procedurę obsługi zdarzenia `onClick={...}` na `onClick={() => this.setState({value: 'X'})}`,
298296
* umieść atrybuty `className` i `onClick` w osobnych liniach dla lepszej czytelności kodu.
299297

300298
Po wprowadzeniu powyższych zmian, element `<button>`, zwracany przez komponent `Square`, powinien wyglądać następująco:
@@ -356,7 +354,9 @@ Być może przeszło ci przez myśl, że to komponent `Board` powinien "pytać"
356354

357355
**Aby móc zebrać dane z wielu komponentów potomnych lub umożliwić dwóm potomkom komunikowanie się ze sobą, należy zadeklarować ich wspólny stan w rodzicu. Taki rodzic może wtedy przekazać poszczególne wartości potomkom poprzez atrybuty; dzięki temu potomkowie będą zsynchronizowani zarówno ze sobą nawzajem, jak i z rodzicem.**
358356

359-
Wynoszenie stanu w górę struktury to dość częsty zabieg podczas refaktoryzacji (ang. *refactoring*) kodu. Wykorzystajmy zatem okazję do wypróbowania tego schematu. Dodajmy konstruktor do komponentu `Board` i ustawmy w nim stan przechowujący tablicę dziewięciu wartości `null`. Każdy z elementów tej tablicy będzie odpowiadał jednemu polu na planszy:
357+
Wynoszenie stanu w górę struktury to dość częsty zabieg podczas refaktoryzacji (ang. *refactoring*) kodu. Wykorzystajmy zatem okazję do wypróbowania tego schematu.
358+
359+
Dodaj konstruktor do komponentu `Board` i ustaw w nim stan przechowujący tablicę dziewięciu wartości `null`. Każdy z elementów tej tablicy będzie odpowiadał jednemu polu na planszy:
360360

361361
```javascript{2-7}
362362
class Board extends React.Component {
@@ -370,35 +370,9 @@ class Board extends React.Component {
370370
renderSquare(i) {
371371
return <Square value={i} />;
372372
}
373-
374-
render() {
375-
const status = 'Następny gracz: 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-
}
399373
```
400374

401-
Gdy później wypełnimy planszę wartościami, tablica będzie wyglądała mniej więcej tak:
375+
Gdy później wypełnimy planszę wartościami, tablica `this.state.squares` będzie wyglądała mniej więcej tak:
402376

403377
```javascript
404378
[
@@ -432,7 +406,7 @@ Każde pole otrzyma poprzez atrybut `value` odpowiednio: `"X"`, `"O"` lub `null`
432406

433407
Następnie musimy zmienić zachowanie komponentu `Square` po kliknięciu na nim, ponieważ teraz to `Board` decyduje, które pola są wypełnione. Musimy zatem określić sposób, w jaki komponent `Square` może aktualizować stan swojego rodzica. Jako że stan komponentu `Board` należy tylko do niego, nie możemy tak po prostu nadpisać jego wartości z poziomu potomka `Square`.
434408

435-
Aby zapewnić komponentowi `Board` wyłączność na własność jego stanu, do komponentu `Square` przekażemy odpowiednią funkcję za pomocą atrybutów. Funkcja ta będzie wywoływana za każdym razem, gdy ktoś kliknie na pole. Zmieńmy więc metodę `renderSquare` w następujący sposób:
409+
Zamiast tego, do komponentu `Square` przekażemy odpowiednią funkcję za pomocą atrybutów i sprawimy, by `Square` wywoływał ją za każdym razem, gdy ktoś kliknie na pole. Zmieńmy więc metodę `renderSquare` w następujący sposób:
436410

437411
```javascript{5}
438412
renderSquare(i) {
@@ -478,11 +452,11 @@ Gdy użytkownik kliknie na pole, zostanie wywołana funkcja `onClick` dostarczon
478452
2. Gdy użytkownik kliknie na przycisk, React wywoła procedurę obsługi zdarzenia `onClick` zdefiniowaną w metodzie `render()` komponentu `Square`.
479453
3. Procedura ta wywoła funkcję `this.props.onClick()`, czyli atrybut przekazany przez komponent `Board`.
480454
4. Ponieważ komponent `Board` przekazał swojemu potomkowi atrybut `onClick={() => this.handleClick(i)}`, kliknięcie w `Square` spowoduje w konsekwencji wywołanie `this.handleClick(i)` wewnątrz komponentu `Board`.
481-
5. Nie zdefiniowaliśmy jeszcze metody `handleClick()`, dlatego aplikacja w tym momencie przestanie działać.
455+
5. Nie zdefiniowaliśmy jeszcze metody `handleClick()`, dlatego aplikacja w tym momencie przestanie działać. Jeśli klikniesz na dowolne pole, zobaczysz błąd na czerwonym tle, mówiący coś w stylu: "this.handleClick is not a function" (pol. *this.handleClick nie jest funkcją*).
482456

483457
>Uwaga
484458
>
485-
>Atrybut `onClick` elementu DOM `<button>` ma dla Reacta specjalne znaczenie, ponieważ jest to wbudowany komponent. W przypadku własny komponentów, jak `Square`, nazwa tego atrybutu może być dowolna. Moglibyśmy nazwać inaczej zarówno atrybut `onClick` w `Square`, jak i `handleClick` w `Board`. Przyjęło się jednak określać atrybuty odpowiedzialne za wywołanie zdarzenia jako `on[Event]`, a procedury obsługi zdarzeń jako `handle[Event]`.
459+
>Atrybut `onClick` elementu DOM `<button>` ma dla Reacta specjalne znaczenie, ponieważ jest to wbudowany komponent. W przypadku własny komponentów, jak `Square`, nazwa tego atrybutu może być dowolna. Moglibyśmy nazwać inaczej zarówno atrybut `onClick` w `Square`, jak i `handleClick` w `Board`, a kod nadal działałby w taki sam sposób. Przyjęło się jednak określać atrybuty odpowiedzialne za wywołanie zdarzenia jako `on[Event]`, a procedury obsługi zdarzeń jako `handle[Event]`.
486460
487461
Jeśli teraz klikniemy na polę planszy, otrzymamy błąd, ponieważ nie zdefiniowaliśmy jeszcze metody `handleClick`. Dodajmy ją zatem:
488462

@@ -643,7 +617,9 @@ Za każdym razem, gdy użytkownik wykona ruch, zmienna `xIsNext` (typu zerojedyn
643617
}
644618
```
645619

646-
Po tej modyfikacji "krzyżyki" i "kółka" będą wykonywać ruchy na zmianę. Zaktualizujmy teraz wartość `status` w metodzie `render`, aby poprawnie wyświetlała, który gracz jest następny:
620+
Po tej modyfikacji "krzyżyki" i "kółka" będą wykonywać ruchy na zmianę. Spróbuj zagrać!
621+
622+
Zaktualizujmy teraz wartość `status` w metodzie `render`, aby poprawnie wyświetlała, który gracz jest następny:
647623

648624
```javascript{2}
649625
render() {
@@ -714,7 +690,7 @@ class Board extends React.Component {
714690

715691
### Ogłaszanie zwycięzcy {#declaring-a-winner}
716692

717-
Teraz gdy już wyświetlamy, który z graczy będzie wykonywał następny ruch, powinniśmy również ogłaszać zwycięzcę lub wyświetlać informację o braku możliwych ruchów. Do wyłaniania zwycięzcy posłuży nam następujące funkcja pomocnicza, którą należy dodać na końcu pliku:
693+
Teraz gdy już wyświetlamy, który z graczy będzie wykonywał następny ruch, powinniśmy również ogłaszać zwycięzcę lub wyświetlać informację o braku możliwych ruchów. Do wyłaniania zwycięzcy posłuży nam następująca funkcja pomocnicza, którą należy dodać na końcu pliku:
718694

719695
```javascript
720696
function calculateWinner(squares) {
@@ -738,6 +714,8 @@ function calculateWinner(squares) {
738714
}
739715
```
740716

717+
Dla dowolnej tablicy z dziewięcioma polami sprawdzi ona, który z graczy wygrał, a następnie zwróci odpowiednio: `'X'`, `'O'` lub `null`.
718+
741719
Funkcję `calculateWinner(squares)` wywołamy w metodzie `render` komponentu `Board`, sprawdzając w ten sposób, czy gracz aktualnie wykonujący ruch jest zwycięzcą. Jeśli odpowiedź będzie pozytywna, możemy wyświetlić tekst w stylu "Wygrywa: X" lub "Wygrywa: O". Podmieńmy `status` w metodzie `render` na:
742720

743721
```javascript{2-8}

0 commit comments

Comments
 (0)