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

385
385
386
386
Vizuri! Sasa unahitaji tu kunakili na kubandika mara kadhaa ili kuongeza mraba tisa na...
387
387
388
388

389
389
390
-
Hapana! Miraba yote ziko katika mstari mmoja tu, si katika gridi kama inavyohitajika kwa bodi yetu. Ili kutatua hili, utahitaji kundi la mraba zako katika safu na `div`s na kuongeza baadhi ya madarasa ya CSS. Wakati huo huo, utampa kila mraba nambari ili kuhakikisha unajua kila mraba unapoonyeshwa.
390
+
La hasha! Miraba yote iko katika mstari mmoja tu, si katika gridi kama inavyohitajika kwa bodi yetu. Ili kutatua hili, utahitaji kundi la mraba zako katika safu na `div`s na kuongeza baadhi ya madarasa ya CSS. Wakati huo huo, utampa kila mraba nambari ili kuhakikisha unajua kila mraba unapoonyeshwa.
391
391
392
392
Katika faili ya `App.js`, sasisha kiungo cha `Square` ili kiwe kama hiki:
393
393
@@ -508,7 +508,7 @@ Psssst... Kuna ni mengi ya kuandika! Ni sawa kunakili na kubandika msimbo kutoka
508
508
509
509
</Note>
510
510
511
-
### Kupitisha data kupitia props {/*passing-data-through-props*/}
511
+
### Kupitisha data kupitia kwa props {/*passing-data-through-props*/}
512
512
513
513
Ifuatayo, utataka kubadili thamani ya mraba kutoka tupu hadi "X" wakati mtumiaji anabofya kwenye mraba. Kwa jinsi ulivyounda bodi hadi sasa, itabidi unakili na kubandika msimbo unaosasisha mraba mara tisa (moja kwa kila mraba ulionao)! Badala ya kunakili na kubandika, usanifu wa viungo vya React unakuwezesha kuunda kiungo kinachoweza kutumika tena ili kuepuka msimbo unaojirudia.
514
514
@@ -557,7 +557,7 @@ Hebu tuangalie:
557
557
558
558

559
559
560
-
Hapana! Ulipoteza mraba yenye nambari ulizokuwa nazo awali. Sasa kila mraba inasema "1". Ili kutatua hili, utatumia *props* kupitisha thamani ambayo kila mraba inapaswa kuwa nayo kutoka kwa kiungo cha mzazi (`Board`) hadi kwa mtoto wake (`Square`).
560
+
La hasha! Ulipoteza mraba yenye nambari ulizokuwa nazo awali. Sasa kila mraba inasema "1". Ili kutatua hili, utatumia *props* kupitisha thamani ambayo kila mraba inapaswa kuwa nayo kutoka kwa kiungo cha mzazi (`Board`) hadi kwa mtoto wake (`Square`).
561
561
562
562
Sasasisha kiungo cha `Square` ili kisome prop ya `value` ambayo utapitia kutoka kwa `Board`:
563
563
@@ -567,7 +567,7 @@ function Square({ value }) {
567
567
}
568
568
```
569
569
570
-
`function Square({ value })` inaonyesha kuwa kiungo cha Square kinaweza kupitishiwa prop iitwayo `value`.
570
+
`function Square({ value })` inaonyesha kuwa kiungo cha Mraba kinaweza kupitishiwa prop iitwayo `value`.
571
571
572
572
Sasa unataka kuonyesha hiyo `value` badala ya `1` ndani ya kila mraba. Jaribu kufanya hivyo kama hivi:
Hebu tujaze kipengele cha `Square` na `X` unapoibofya. Tangaza kazi (function) iitwayo `handleClick` ndani ya `Square`. Kisha, ongeza `onClick` kwenye props za kipengele cha button kilichorejeshwa kutoka kwa `Square`:
708
708
@@ -897,7 +897,7 @@ body {
897
897
898
898
</Sandpack>
899
899
900
-
### Zana za Watengenezaji wa React {/*react-developer-tools*/}
900
+
### React Developer Tools za {/*react-developer-tools*/}
901
901
902
902
React DevTools hukuruhusu kuangalia *props* na *state* za vipengele vyako vya React. Unaweza kupata kichupo cha React DevTools chini ya sehemu ya *browser* katika CodeSandbox:
903
903
@@ -909,7 +909,7 @@ Ili kuchunguza kipengele fulani kwenye skrini, tumia kitufe kilicho kwenye kona
909
909
910
910
<Note>
911
911
912
-
Kwa maendeleo ya ndani (*local development*), React DevTools inapatikana kama [Chrome](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en), [Firefox](https://addons.mozilla.org/en-US/firefox/addon/react-devtools/), na [Edge](https://microsoftedge.microsoft.com/addons/detail/react-developer-tools/gpphkfbcpidddadnkolkpfckpihlkkil) *browser extension*. Isakinishe, na kichupo cha *Components* kitaonekana kwenye Zana za Watengenezaji wa kivinjari chako kwa tovuti zinazotumia React.
912
+
Kwa maendeleo ya ndani (local development), React DevTools inapatikana kama [Chrome](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en), [Firefox](https://addons.mozilla.org/en-US/firefox/addon/react-devtools/), na [Edge](https://microsoftedge.microsoft.com/addons/detail/react-developer-tools/gpphkfbcpidddadnkolkpfckpihlkkil) *browser extension*. Isakinishe, na kichupo cha *Components* kitaonekana kwenye Zana za Watengenezaji wa kivinjari chako kwa tovuti zinazotumia React.
913
913
914
914
</Note>
915
915
@@ -1133,7 +1133,7 @@ Kuita kazi ya `setSquares` kunamwambia React kwamba hali ya sehemu imebadilika.
1133
1133
1134
1134
<Note>
1135
1135
1136
-
JavaScript inaunga mkono [closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures) ambayo inamaanisha kazi ya ndani (mfano, `handleClick`) ina ufikiaji wa vigezo na kazi zilizofafanuliwa katika kazi ya nje (mfano, `Board`). Kazi ya `handleClick` inaweza kusoma hali ya `squares` na kuita mbinu ya `setSquares` kwa sababu zote zipo ndani ya kazi ya `Board`.
1136
+
JavaScript inawezesha [closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures) ambayo inamaanisha kazi ya ndani (mfano, `handleClick`) ina ufikiaji wa vigezo na kazi zilizofafanuliwa katika kazi ya nje (mfano, `Board`). Kazi ya `handleClick` inaweza kusoma hali ya `squares` na kuita mbinu ya `setSquares` kwa sababu zote zipo ndani ya kazi ya `Board`.
1137
1137
1138
1138
</Note>
1139
1139
@@ -1321,7 +1321,7 @@ Sasa kwamba usimamizi wa hali yako uko kwenye sehemu ya `Board`, sehemu ya mzazi
1321
1321
1322
1322
Hebu tuangalie tena kinachotokea wakati mtumiaji anapobonyeza square ya juu kushoto kwenye ubao wako ili kuongeza `X`:
1323
1323
1324
-
1. Kubonyeza square ya juu kushoto huendesha kazi ambayo `button` ilipokea kama sifa yake ya `onClick` kutoka kwa `Square`. Sehemu ya `Square` ilipokea kazi hiyo kama sifa yake ya `onSquareClick` kutoka kwa `Board`. Sehemu ya `Board` ilifafanua kazi hiyo moja kwa moja ndani ya JSX. Inaita `handleClick` ikiwa na hoja ya `0`.
1324
+
1. Kubonyeza mraba wa juu kushoto huendesha kazi ambayo `button` ilipokea kama sifa yake ya `onClick` kutoka kwa `Square`. Sehemu ya `Square` ilipokea kazi hiyo kama sifa yake ya `onSquareClick` kutoka kwa `Board`. Sehemu ya `Board` ilifafanua kazi hiyo moja kwa moja ndani ya JSX. Inaita `handleClick` ikiwa na hoja ya `0`.
1325
1325
2. `handleClick` hutumia hoja (`0`) kuboresha kipengele cha kwanza cha safu ya `squares` kutoka `null` hadi `X`.
1326
1326
3. Hali ya `squares` ya sehemu ya `Board` ilisasishwa, hivyo `Board` na watoto wake wote hujirejesha. Hii husababisha sifa ya `value` ya sehemu ya `Square` yenye index `0` kubadilika kutoka `null` hadi `X`.
1327
1327
@@ -1816,6 +1816,54 @@ export default function Game() {
1816
1816
}
1817
1817
```
1818
1818
1819
+
Ili kufanya kipengele cha `Board` kijitegemee kikamilifu kwa props kinachopokea, badilisha kipengele cha `Board` ili kichukue props tatu: `xIsNext`, `squares`, na kazi mpya ya `onPlay` ambayo `Board` inaweza kuitumia na orodha mpya ya viwanja (`squares`) wakati mchezaji anafanya harakati. Kisha, ondoa mistari miwili ya kwanza ya kazi ya `Board` inayoitwa `useState`:
1820
+
1821
+
```js {1}
1822
+
functionBoard({ xIsNext, squares, onPlay }) {
1823
+
functionhandleClick(i) {
1824
+
//...
1825
+
}
1826
+
// ...
1827
+
}
1828
+
```
1829
+
1830
+
Sasa badilisha miito ya `setSquares` na `setXIsNext` katika `handleClick` kwenye kipengele cha `Board` kwa wito mmoja wa kazi yako mpya ya `onPlay` ili kipengele cha `Game` kiweze kusasisha `Board` wakati mtumiaji anabofya mraba:
1831
+
1832
+
```js {12}
1833
+
functionBoard({ xIsNext, squares, onPlay }) {
1834
+
functionhandleClick(i) {
1835
+
if (calculateWinner(squares) || squares[i]) {
1836
+
return;
1837
+
}
1838
+
constnextSquares=squares.slice();
1839
+
if (xIsNext) {
1840
+
nextSquares[i] ="X";
1841
+
} else {
1842
+
nextSquares[i] ="O";
1843
+
}
1844
+
onPlay(nextSquares);
1845
+
}
1846
+
//...
1847
+
}
1848
+
```
1849
+
1850
+
Kipengele cha `Board` sasa kimejitegemea kikamilifu kwa props kinachopokelewa kutoka kwa kipengele cha `Game`. Unahitaji kutekeleza kazi ya `handlePlay` ndani ya kipengele cha `Game` ili kufanya mchezo kufanya kazi tena.
1851
+
1852
+
Kazi ya `handlePlay` inapaswa kufanya nini inapoitishwa? Kumbuka kwamba `Board` ilitumia kuita `setSquares` na orodha mpya; sasa inapitisha orodha ya `squares` iliyosasishwa kwa `onPlay`.
1853
+
1854
+
Kazi ya `handlePlay` inahitaji kusasisha hali ya `Game` ili kuamsha upya, lakini sasa huna kazi ya `setSquares` ambayo unaweza kuitumia tena--unatumia sasa kipengele cha `history` kuhifadhi habari hii. Utahitaji kusasisha `history` kwa kuongeza orodha iliyosasishwa ya `squares` kama kipengele kipya cha historia. Pia unataka kubadilisha `xIsNext`, kama vile `Board` ilivyofanya awali:
1855
+
1856
+
```js {4-5}
1857
+
exportdefaultfunctionGame() {
1858
+
//...
1859
+
functionhandlePlay(nextSquares) {
1860
+
setHistory([...history, nextSquares]);
1861
+
setXIsNext(!xIsNext);
1862
+
}
1863
+
//...
1864
+
}
1865
+
```
1866
+
1819
1867
Hapa, `[...history, nextSquares]` inaunda orodha mpya inayojumuisha vitu vyote katika `history`, ikifuatiwa na `nextSquares`. (Unaweza kusoma `...history` kama "orodhesha vitu vyote vilivyomo ndani ya `history`".)
1820
1868
1821
1869
Kwa mfano, ikiwa `history` ni `[[null,null,null], ["X",null,null]]` na `nextSquares` ni `["X",null,"O"]`, basi orodha mpya `[...history, nextSquares]` itakuwa `[[null,null,null], ["X",null,null], ["X",null,"O"]]`.
@@ -1969,7 +2017,7 @@ body {
1969
2017
1970
2018
</Sandpack>
1971
2019
1972
-
### Kuonyesha harakati za zamani {/*kuonyesha-harakati-za-zamani*/}
2020
+
### Kuonyesha moves za awali {/*showing-the-past-moves*/}
1973
2021
1974
2022
Kwa sababu unarekodi historia ya mchezo wa tic-tac-toe, sasa unaweza kuonyesha orodha ya harakati za zamani kwa mchezaji.
1975
2023
@@ -2001,9 +2049,9 @@ export default function Game() {
2001
2049
constmoves=history.map((squares, move) => {
2002
2050
let description;
2003
2051
if (move >0) {
2004
-
description ='Endelea hadi harakati #'+ move;
2052
+
description ='Go to move #'+ move;
2005
2053
} else {
2006
-
description ='Rudi mwanzo wa mchezo';
2054
+
description ='Go to game start';
2007
2055
}
2008
2056
return (
2009
2057
<li>
@@ -2024,6 +2072,7 @@ export default function Game() {
2024
2072
);
2025
2073
}
2026
2074
```
2075
+
2027
2076
Unaweza kuona jinsi kanuni yako inavyopaswa kuonekana hapa chini. Kumbuka kwamba unapaswa kuona hitilafu katika koni ya zana za mende inayosema:
2028
2077
2029
2078
<ConsoleBlock level="warning">
@@ -2204,9 +2253,9 @@ Kwa kila harakati katika historia ya mchezo wa tic-tac-toe, unaunda kipengele ch
2204
2253
2205
2254
Kwa sasa, unapaswa kuona orodha ya harakati zilizotokea katika mchezo na hitilafu katika koni ya zana za mende. Hebu tujadili maana ya hitilafu ya "key."
Unapohonyesha orodha, React huhifadhi baadhi ya habari kuhusu kila kipengele cha orodha kilichohonyeshwa. Unaposasisha orodha, React inahitaji kubaini kile kilichobadilika. Huenda umeongeza, kuondoa, kubadilisha, au kupanga upya vipengele vya orodha.
2258
+
Unapo-render orodha, React huhifadhi baadhi ya habari kuhusu kila kipengele cha orodha kilichohonyeshwa. Unaposasisha orodha, React inahitaji kubaini kile kilichobadilika. Huenda umeongeza, kuondoa, kubadilisha, au kupanga upya vipengele vya orodha.
2210
2259
2211
2260
Fikiria unapohama kutoka
2212
2261
@@ -2243,7 +2292,7 @@ Ikiwa hakuna kipeperushi kilichotolewa, React itaripoti hitilafu na kutumia kias
2243
2292
2244
2293
Funguo hazihitaji kuwa za kipekee duniani; zinahitaji tu kuwa za kipekee kati ya vipengele na ndugu zao.
2245
2294
2246
-
### Kutekeleza safari ya wakati `{/*implementing-time-travel*/}` {/*kutekeleza-safari-ya-wakati-implementing-time-travel*/}
2295
+
### Kutekeleza safari ya wakati {/*implementing-time-travel*/}
2247
2296
2248
2297
Katika historia ya mchezo wa tic-tac-toe, kila harakati ya zamani ina ID ya kipekee inayohusishwa nayo: ni nambari mfuatano ya harakati. Harakati hazitabadilishwa, kuondolewa, au kuingizwa katikati, hivyo ni salama kutumia kiashiria cha harakati kama kipeperushi.
2249
2298
@@ -2650,7 +2699,7 @@ body {
2650
2699
2651
2700
</Sandpack>
2652
2701
2653
-
### Kusafisha Mwisho `{/*final-cleanup*/}` {/*kusafisha-mwisho-final-cleanup*/}
2702
+
### Kusafisha Mwisho {/*final-cleanup*/}
2654
2703
2655
2704
Ukichunguza kwa makini kanuni, utaona kuwa `xIsNext ===true` wakati `currentMove` ni nambari yenye uwiano wa mbili na `xIsNext ===false` wakati `currentMove` ni nambari isiyo na uwiano wa mbili. Kwa maneno mengine, ikiwa unajua thamani ya `currentMove`, basi unaweza daima kujua kile kinachopaswa kuwa `xIsNext`.
2656
2705
@@ -2678,7 +2727,7 @@ export default function Game() {
2678
2727
2679
2728
Sasa, huna tena haja ya tangazo la hali ya `xIsNext` au miito ya `setXIsNext`. Sasa, hakuna nafasi kwa `xIsNext` kutoka nje ya mfululizo na `currentMove`, hata kama utatengeneza makosa wakati wa kuandika vipengele.
@@ -2866,4 +2915,4 @@ Ikiwa una muda wa ziada au unataka kujitolea kuboresha ujuzi wako wa React, hapa
2866
2915
1. Wakati mtu anashinda, angazia viwanja vitatu vilivyopunguza ushindi (na wakati hakuna anayeshinda, onyesha ujumbe kuhusu matokeo kuwa sare).
2867
2916
1. Onyesha eneo la kila harakati kwa muundo (mstari, nguzo) kwenye orodha ya historia ya harakati.
2868
2917
2869
-
Katika mafunzo haya, umejifunza dhana za React ikiwemo vipengele, sehemu, props, na hali. Sasa kwamba umeona jinsi dhana hizi zinavyofanya kazi wakati wa kujenga mchezo, angalia [Thinking in React](/learn/thinking-in-react) kuona jinsi dhana hizo za React zinavyofanya kazi wakati wa kujenga UI ya programu.
2918
+
Katika mafunzo haya, umejifunza dhana za React ikiwemo vipengele, sehemu, props, na hali. Sasa kwamba umeona jinsi dhana hizi zinavyofanya kazi wakati wa kujenga mchezo, angalia [Kuwaza katika React](/learn/thinking-in-react) kuona jinsi dhana hizo za React zinavyofanya kazi wakati wa kujenga UI ya programu.
0 commit comments