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
Copy file name to clipboardExpand all lines: src/content/learn/state-as-a-snapshot.md
+25-25
Original file line number
Diff line number
Diff line change
@@ -21,7 +21,7 @@ title: Состояние как снимок
21
21
22
22
Вы можете думать, что события, которые появляются от взаимодействия пользователя с интерфейсом (например, после нажатия кнопки), должны моментально изменять UI. На самом деле, в React это работает немного по-другому. На предыдущей странице вы видели, что [изменение состояния запрашивает повторный рендер](/learn/render-and-commit#step-1-trigger-a-render). Это значит, чтобы интерфейс смог отреагировать на событие, необходимо *обновить состояние*.
23
23
24
-
Рассмотрим пример кода ниже. Когда вы нажимаете на кнопку "Send", `setIsSent(true)` сообщает React о необходимости повторного рендера UI:
24
+
Рассмотрим пример кода ниже. Когда вы нажимаете на кнопку "Отправить", `setIsSent(true)` сообщает React о необходимости повторного рендера UI:
25
25
26
26
<Sandpack>
27
27
@@ -30,9 +30,9 @@ import { useState } from 'react';
30
30
31
31
exportdefaultfunctionForm() {
32
32
const [isSent, setIsSent] =useState(false);
33
-
const [message, setMessage] =useState('Hi!');
33
+
const [message, setMessage] =useState('Привет!');
34
34
if (isSent) {
35
-
return<h1>Your message is on its way!</h1>
35
+
return<h1>Ваше сообщение уже в пути!</h1>
36
36
}
37
37
return (
38
38
<form onSubmit={(e) => {
@@ -45,7 +45,7 @@ export default function Form() {
45
45
value={message}
46
46
onChange={e=>setMessage(e.target.value)}
47
47
/>
48
-
<button type="submit">Send</button>
48
+
<button type="submit">Отправить</button>
49
49
</form>
50
50
);
51
51
}
@@ -256,44 +256,44 @@ setTimeout(() => {
256
256
257
257
Рассмотрим пример, как это правило делает обработчики событий более устойчивыми к ошибкам синхронизации. Ниже представлена форма, которая отправляет сообщение с задержкой в 5 секунд. Представьте себе сценарий:
258
258
259
-
1. Вы нажимаете на кнопку "Send", отправляя "Hello" для Alice.
260
-
2. До того, как истечёт пятисекундный таймер, вы успеете поменять значение поля "To" на "Bob".
259
+
1. Вы нажимаете на кнопку "Отправить", отправляя "Привет" для Элис.
260
+
2. До того, как истечёт пятисекундный таймер, вы успеете поменять значение поля "Кому" на "Бобу".
261
261
262
-
Какой результат вы ожидаете увидеть в `alert`? Будет отображено "You said Hello to Alice" или же "You said Hello to Bob"? Попробуйте предположить, опираясь на знания, которые вы получили ранее, после запустите пример и посмотрите результат:
262
+
Какой результат вы ожидаете увидеть в `alert`? Будет отображено "Вы сказали Привет Элис" или же "Вы сказали Привет Бобу"? Попробуйте предположить, опираясь на знания, которые вы получили ранее, после запустите пример и посмотрите результат:
263
263
264
264
<Sandpack>
265
265
266
266
```js
267
267
import { useState } from'react';
268
268
269
269
exportdefaultfunctionForm() {
270
-
const [to, setTo] =useState('Alice');
271
-
const [message, setMessage] =useState('Hello');
270
+
const [to, setTo] =useState('Элис');
271
+
const [message, setMessage] =useState('Привет');
272
272
273
273
functionhandleSubmit(e) {
274
274
e.preventDefault();
275
275
setTimeout(() => {
276
-
alert(`You said${message} to${to}`);
276
+
alert(`Вы сказали${message}${to}`);
277
277
}, 5000);
278
278
}
279
279
280
280
return (
281
281
<form onSubmit={handleSubmit}>
282
282
<label>
283
-
To:{''}
283
+
Кому:{''}
284
284
<select
285
285
value={to}
286
286
onChange={e=>setTo(e.target.value)}>
287
-
<option value="Alice">Alice</option>
288
-
<option value="Bob">Bob</option>
287
+
<option value="Элис">Элис</option>
288
+
<option value="Бобу">Бобу</option>
289
289
</select>
290
290
</label>
291
291
<textarea
292
292
placeholder="Message"
293
293
value={message}
294
294
onChange={e=>setMessage(e.target.value)}
295
295
/>
296
-
<button type="submit">Send</button>
296
+
<button type="submit">Отправить</button>
297
297
</form>
298
298
);
299
299
}
@@ -344,12 +344,12 @@ export default function TrafficLight() {
344
344
return (
345
345
<>
346
346
<button onClick={handleClick}>
347
-
Change to {walk ?'Stop':'Walk'}
347
+
Изменить на {walk ?'Стоп':'Можно идти'}
348
348
</button>
349
349
<h1 style={{
350
350
color: walk ?'darkgreen':'darkred'
351
351
}}>
352
-
{walk ?'Walk':'Stop'}
352
+
{walk ?'Можно идти':'Стоп'}
353
353
</h1>
354
354
</>
355
355
);
@@ -362,7 +362,7 @@ h1 { margin-top: 20px; }
362
362
363
363
</Sandpack>
364
364
365
-
Вам необходимо добавить `alert` в обработчик кликов. Когда загорается зелёный свет и появляется текст "Walk", должно быть оповещение "Stop is next". Когда свет красный и текст "Stop", должно быть оповещение "Walk is next".
365
+
Вам необходимо добавить `alert` в обработчик кликов. Когда загорается зелёный свет и появляется текст "Можно идти", должно быть оповещение "Дальше Стоп". Когда свет красный и текст "Стоп", должно быть оповещение "Дальше Можно идти".
366
366
367
367
Имеет ли значение, помещаете ли вы `alert` до или после вызова `setWalk`?
368
368
@@ -380,18 +380,18 @@ export default function TrafficLight() {
380
380
381
381
functionhandleClick() {
382
382
setWalk(!walk);
383
-
alert(walk ?'Stop is next':'Walk is next');
383
+
alert(walk ?'Дальше Стоп':'Дальше Можно идти');
384
384
}
385
385
386
386
return (
387
387
<>
388
388
<button onClick={handleClick}>
389
-
Change to {walk ?'Stop':'Walk'}
389
+
Изменить на {walk ?'Стоп':'Можно идти'}
390
390
</button>
391
391
<h1 style={{
392
392
color: walk ?'darkgreen':'darkred'
393
393
}}>
394
-
{walk ?'Walk':'Stop'}
394
+
{walk ?'Можно идти':'Стоп'}
395
395
</h1>
396
396
</>
397
397
);
@@ -409,26 +409,26 @@ h1 { margin-top: 20px; }
409
409
Эта строка может показаться на первый взгляд нелогичной:
410
410
411
411
```js
412
-
alert(walk ?'Stop is next':'Walk is next');
412
+
alert(walk ?'Дальше Стоп':'Дальше Можно идти');
413
413
```
414
414
415
-
В ней появится смысл, если читать её так: "Если светофор показывает 'Walk now', в сообщении должно быть 'Stop is next', иначе 'Walk is next'". Значение переменной `walk` внутри вашего обработчика событий соответствует значению `walk` этого рендера и не изменяется.
415
+
В ней появится смысл, если читать её так: "Если светофор показывает 'Можно идти', в сообщении должно быть 'Дальше Стоп', иначе 'Дальше Можно идти'". Значение переменной `walk` внутри вашего обработчика событий соответствует значению `walk` этого рендера и не изменяется.
416
416
417
417
Вы можете убедиться в этом и провести подстановку необходимых значений. Когда `walk` равно `true`, вы получаете:
418
418
419
419
```js
420
420
<button onClick={() => {
421
421
setWalk(false);
422
-
alert('Stop is next');
422
+
alert('Дальше Стоп');
423
423
}}>
424
-
Change to Stop
424
+
Изменить на Стоп
425
425
</button>
426
426
<h1 style={{color:'darkgreen'}}>
427
427
Walk
428
428
</h1>
429
429
```
430
430
431
-
Таким образом, нажатие на "Change to Stop" ставит в очередь рендер с `walk` равным `false` и оповещением "Stop is next".
431
+
Таким образом, нажатие на "Изменить на Стоп" ставит в очередь рендер с `walk` равным `false` и оповещением "Дальше Стоп".
0 commit comments