Skip to content

Commit be9de0a

Browse files
authored
docs: Update Russian translation (#1226)
* Update ru/guide/v10/api-reference.md * Update ru/guide/v10/context.md * Update ru/guide/v10/differences-to-react.md * Update ru/guide/v10/forms.md * Update ru/guide/v10/hooks.md * Update ru/guide/v10/no-build-workflows.md * Update ru/guide/v10/refs.md * Update config.json
1 parent f2bdc36 commit be9de0a

8 files changed

+687
-203
lines changed

content/ru/guide/v10/api-reference.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ render(
201201

202202
Предоставляет способ ссылки на элемент или компонент после его визуализации.
203203

204-
Дополнительную информацию см. в [документации по ссылкам](/guide/v10/refs#createref).
204+
Дополнительную информацию см. в [документации по рефам](/guide/v10/refs#создание-рефа).
205205

206206
## Fragment
207207

content/ru/guide/v10/context.md

+139-33
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,184 @@
11
---
22
name: Контекст
3-
description: 'Контекст позволяет передавать параметры через промежуточные компоненты. В этом документе описывается как новый, так и старый API'
3+
description: 'Контекст позволяет передавать параметры через промежуточные компоненты. В этой документации описывается как новый, так и старый API'
44
---
55

66
# Контекст
77

8-
Контекст позволяет передавать значение дочернему компоненту в глубине дерева, не пропуская его через все последующие компоненты с помощью `props`. Очень популярным вариантом такого использования является тематическое оформление. В двух словах контекст можно представить как способ выполнения обновлений в стиле `pub-sub` в Preact.
8+
Контекст — это способ передачи данных через дерево компонентов без необходимости передавать их через каждый промежуточный компонент с помощью пропсов. Проще говоря, он позволяет компонентам в любой части иерархии подписываться на значение и получать уведомления о его изменениях, обеспечивая обновления в стиле pub-sub для Preact.
99

10-
Существует два различных способа использования контекста: Через новый API `createContext` и старый API контекста. Разница между ними заключается в том, что старый вариант не может обновить дочерний компонент, когда компонент между ними прерывает рендеринг через `shouldComponentUpdate`. Поэтому мы настоятельно рекомендуем всегда использовать `createContext`.
10+
Не редкость сталкиваться с ситуациями, когда значение из компонента-прародителя (или выше) нужно передать дочернему компоненту, часто без необходимости в промежуточном компоненте. Этот процесс передачи пропсов часто называют «проп-дриллингом», и он может быть громоздким, подверженным ошибкам и просто утомительным, особенно по мере роста приложения и необходимости передавать больше значений через большее количество слоёв. Это одна из ключевых проблем, которую контекст стремится решить, предоставляя способ для дочернего компонента подписаться на значение, находящееся выше в дереве компонентов, получая доступ к значению без его передачи в качестве пропса.
11+
12+
В Preact есть два способа использования контекста: через новый API `createContext` и устаревший context API. В настоящее время существует очень мало причин использовать устаревший API, но он документирован здесь для полноты.
1113

1214
---
1315

1416
<div><toc></toc></div>
1517

1618
---
1719

18-
## createContext
20+
## Современный Context API
21+
22+
### Создание контекста
23+
24+
Чтобы создать новый контекст, мы используем функцию `createContext`. Эта функция принимает начальное состояние в качестве аргумента и возвращает объект с двумя свойствами компонентов: `Provider`, чтобы сделать контекст доступным для потомков, и `Consumer`, чтобы получить доступ к значению контекста (в основном в классовых компонентах).
25+
26+
```jsx
27+
import { createContext } from "preact";
28+
29+
export const Theme = createContext("light");
30+
export const User = createContext({ name: "Guest" });
31+
export const Locale = createContext(null);
32+
```
33+
34+
### Настройка провайдера
35+
36+
После того как мы создали контекст, мы должны сделать его доступным для потомков, используя компонент `Provider`. Провайдеру необходимо передать пропс `value`, представляющий начальное значение контекста.
37+
38+
> Начальное значение, установленное с помощью `createContext`, используется только в отсутствие `Provider` выше потребителя в дереве. Это может быть полезно для тестирования компонентов в изоляции, так как позволяет избежать необходимости создания обёртки `Provider` вокруг вашего компонента.
39+
40+
```jsx
41+
import { createContext } from "preact";
42+
43+
export const Theme = createContext("light");
44+
45+
function App() {
46+
return (
47+
<Theme.Provider value="dark">
48+
<SomeComponent />
49+
</Theme.Provider>
50+
);
51+
}
52+
```
53+
54+
> **Совет:** Вы можете иметь несколько провайдеров одного и того же контекста в вашем приложении, но будет использоваться только ближайший к потребителю.
55+
56+
### Использование контекста
1957

20-
Сначала нам необходимо создать объект контекста, который мы сможем передавать по кругу. Это делается с помощью функции `createContext(initialValue)`. Он возвращает компонент `Provider`, который используется для установки значения контекста, и компонент `Consumer`, который извлекает значение из контекста.
58+
Существует два способа потребления контекста, в значительной степени в зависимости от предпочитаемого вами стиля компонентов: `Consumer` (классовые компоненты) и хук `useContext` (функциональные компоненты/хуки).
2159

22-
Аргумент `initialValue` используется только в том случае, если у контекста нет соответствующего `Provider` над ним в дереве. Это может быть полезно для изолированного тестирования компонентов, поскольку позволяет избежать необходимости создания оборачивающего `Provider`.
60+
<tab-group tabstring="Consumer, useContext">
2361

2462
```jsx
2563
// --repl
26-
import { render, createContext } from 'preact';
64+
import { render, createContext } from "preact";
2765

28-
const SomeComponent = (props) => props.children;
66+
const SomeComponent = props => props.children;
2967
// --repl-before
30-
const Theme = createContext('light');
68+
const ThemePrimary = createContext("#673ab8");
3169

32-
function ThemedButton(props) {
70+
function ThemedButton() {
3371
return (
34-
<Theme.Consumer>
35-
{(theme) => {
36-
return (
37-
<button {...props} class={'btn ' + theme}>
38-
Переключить тему
39-
</button>
40-
);
41-
}}
42-
</Theme.Consumer>
72+
<ThemePrimary.Consumer>
73+
{theme => <button style={{ background: theme }}>Переключить тему</button>}
74+
</ThemePrimary.Consumer>
4375
);
4476
}
4577

4678
function App() {
4779
return (
48-
<Theme.Provider value='dark'>
80+
<ThemePrimary.Provider value="#8f61e1">
4981
<SomeComponent>
5082
<ThemedButton />
5183
</SomeComponent>
52-
</Theme.Provider>
84+
</ThemePrimary.Provider>
85+
);
86+
}
87+
// --repl-after
88+
render(<App />, document.getElementById("app"));
89+
```
90+
91+
```jsx
92+
// --repl
93+
import { render, createContext } from "preact";
94+
import { useContext } from "preact/hooks";
95+
96+
const SomeComponent = props => props.children;
97+
// --repl-before
98+
const ThemePrimary = createContext("#673ab8");
99+
100+
function ThemedButton() {
101+
const theme = useContext(ThemePrimary);
102+
return <button style={{ background: theme }}>Переключить тему</button>;
103+
}
104+
105+
function App() {
106+
return (
107+
<ThemePrimary.Provider value="#8f61e1">
108+
<SomeComponent>
109+
<ThemedButton />
110+
</SomeComponent>
111+
</ThemePrimary.Provider>
112+
);
113+
}
114+
// --repl-after
115+
render(<App />, document.getElementById("app"));
116+
```
117+
118+
</tab-group>
119+
120+
### Обновление контекста
121+
122+
Статические значения могут быть полезны, но чаще всего мы хотим иметь возможность динамически обновлять значение контекста. Для этого мы используем стандартные механизмы состояния компонентов:
123+
124+
```jsx
125+
// --repl
126+
import { render, createContext } from "preact";
127+
import { useContext, useState } from "preact/hooks";
128+
129+
const SomeComponent = props => props.children;
130+
// --repl-before
131+
const ThemePrimary = createContext(null);
132+
133+
function ThemedButton() {
134+
const { theme } = useContext(ThemePrimary);
135+
return <button style={{ background: theme }}>Переключить тему</button>;
136+
}
137+
138+
function ThemePicker() {
139+
const { theme, setTheme } = useContext(ThemePrimary);
140+
return (
141+
<input
142+
type="color"
143+
value={theme}
144+
onChange={e => setTheme(e.currentTarget.value)}
145+
/>
146+
);
147+
}
148+
149+
function App() {
150+
const [theme, setTheme] = useState("#673ab8");
151+
return (
152+
<ThemePrimary.Provider value={{ theme, setTheme }}>
153+
<SomeComponent>
154+
<ThemedButton />
155+
{" - "}
156+
<ThemePicker />
157+
</SomeComponent>
158+
</ThemePrimary.Provider>
53159
);
54160
}
55161
// --repl-after
56-
render(<App />, document.getElementById('app'));
162+
render(<App />, document.getElementById("app"));
57163
```
58164

59-
> Более простой способ использовать контекст — использовать хук [useContext](/guide/v10/hooks#usecontext).
165+
## Устаревший Context API
60166

61-
## Устаревший API контекста
167+
Этот API считается устаревшим и должен быть избегаем в новом коде, так как у него есть известные проблемы, и он существует только для обеспечения обратной совместимости.
62168

63-
Мы включаем устаревший API в основном из соображений обратной совместимости. Он был заменен API `createContext`. У устаревшего API есть известные проблемы, такие как блокировка обновлений, если между ними есть компоненты, которые возвращают false в `shouldComponentUpdate`. Если вам всё же нужно его использовать, продолжайте читать.
169+
Одно из ключевых отличий этого API от нового заключается в том, что этот API не может обновить дочерний компонент, когда компонент между дочерним компонентом и провайдером отменяет рендеринг с помощью `shouldComponentUpdate`. Когда это происходит, дочерний компонент **не получит** обновлённое значение контекста, что часто приводит к разрыву (часть интерфейса использует новое значение, а часть — старое).
64170

65-
Чтобы передать пользовательскую переменную через контекст, компонент должен иметь метод `getChildContext`. Там вы возвращаете новые значения, которые хотите сохранить в контексте. Доступ к контексту можно получить через второй аргумент в функциональных компонентах или через `this.context` в компоненте на основе класса.
171+
Чтобы передать значение через контекст, компонент должен иметь метод `getChildContext`, возвращающий предполагаемое значение контекста. Потомки могут получить доступ к контексту через второй аргумент в функциональных компонентах или `this.context` в классовых компонентах.
66172

67173
```jsx
68174
// --repl
69-
import { render } from 'preact';
175+
import { render } from "preact";
70176

71-
const SomeOtherComponent = (props) => props.children;
177+
const SomeOtherComponent = props => props.children;
72178
// --repl-before
73-
function ThemedButton(props, context) {
179+
function ThemedButton(_props, context) {
74180
return (
75-
<button {...props} class={'btn ' + context.theme}>
181+
<button style={{ background: context.theme }}>
76182
Переключить тему
77183
</button>
78184
);
@@ -81,8 +187,8 @@ function ThemedButton(props, context) {
81187
class App extends Component {
82188
getChildContext() {
83189
return {
84-
theme: 'light',
85-
};
190+
theme: "#673ab8"
191+
}
86192
}
87193

88194
render() {
@@ -96,5 +202,5 @@ class App extends Component {
96202
}
97203
}
98204
// --repl-after
99-
render(<App />, document.getElementById('app'));
205+
render(<App />, document.getElementById("app"));
100206
```

content/ru/guide/v10/differences-to-react.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Preact не претендует на то, чтобы быть повторно
3333

3434
Как для preact, так и для [preact/compat] совместимость версий измеряется по отношению к _текущим_ и _предыдущим_ основным выпускам React. Когда команда React анонсирует новые функции, они могут быть добавлены в ядро ​​Preact, если это имеет смысл с учетом [целей проекта][Project Goals]. Это довольно демократичный процесс, постоянно развивающийся посредством дискуссий и решений, принимаемых открыто, с использованием вопросов и запросов на включение.
3535

36-
> Таким образом, веб-сайт и документация отражают React от «15.x» до «17.x» при обсуждении совместимости или сравнении.
36+
> Таким образом, сайт и документация отражают версии React с `15.x` по `17.x`, с некоторыми дополнениями из `18.x` и `19.x`, когда речь идет о совместимости или сравнении.
3737
3838
## Отладочные сообщения и ошибки
3939

0 commit comments

Comments
 (0)