Skip to content

Commit

Permalink
Update Russian translation (#1168)
Browse files Browse the repository at this point in the history
* Update ru/guide/v10/typescript.md

* Update config.json

* Update ru/guide/v10/web-components.md

* Update ru/guide/v10/forms.md

* Update content/ru/guide/v10/web-components.md

Co-authored-by: Ryan Christian <33403762+rschristian@users.noreply.github.com>

---------

Co-authored-by: Ryan Christian <33403762+rschristian@users.noreply.github.com>
  • Loading branch information
dragomano and rschristian authored Jul 18, 2024
1 parent 54bc153 commit 5422be4
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 8 deletions.
48 changes: 41 additions & 7 deletions content/ru/guide/v10/forms.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,55 @@ description: 'Как создавать потрясающие формы в Pre

## Контролируемые и неконтролируемые компоненты

Говоря об элементах управления формы, часто можно встретить слова «контролируемый компонент» и «неконтролируемый компонент». Описание относится к тому, как обрабатывается поток данных. DOM имеет двунаправленный поток данных, поскольку каждый элемент управления формой будет сам управлять вводом данных пользователем. Простой текстовый ввод всегда будет обновлять свое значение, когда пользователь введет в него текст.
Говоря об элементах управления формы, часто можно встретить слова «контролируемый компонент» и «неконтролируемый компонент». Описание относится к тому, как обрабатывается поток данных.

Фреймворк типа Preact, напротив, имеет однонаправленный поток данных. Компонент управляет там не самим значением, а чем-то другим, расположенным выше в дереве компонентов.
DOM имеет двунаправленный поток данных, поскольку каждый элемент управления формой будет сам управлять вводом данных пользователем. Простой текстовый ввод всегда будет обновлять свое значение, когда пользователь введет в него текст. Напротив, такая среда, как Preact, обычно имеет однонаправленный поток данных; компонент там управляет не самим значением, а чем-то другим, расположенным выше в дереве компонентов.

Как правило, вам следует стараться использовать _неконтролируемые_ компоненты, когда это возможно, DOM полностью способен обрабатывать состояние `<input>`:

```jsx
// Неконтролируемый, так как Preact не устанавливает значение
<input onInput={myEventHandler} />;

// Контролируемый, так как Preact теперь управляет значением входа
<input value={someValue} onInput={myEventHandler} />;
```

Как правило, следует стараться всегда использовать _контролируемые_ компоненты. Однако при создании автономных компонентов или обёртке сторонних библиотек пользовательского интерфейса может оказаться полезным просто использовать свой компонент в качестве точки монтирования для функциональности, не связанной с Preact. В этих случаях «неконтролируемые» компоненты прекрасно справляются с поставленной задачей.
Однако бывают ситуации, когда вам может потребоваться более жёсткий контроль над входным значением, и в этом случае можно использовать _контролируемые_ компоненты.

Чтобы использовать контролируемые компоненты в Preact, вам нужно будет использовать [`refs`](/guide/v10/refs), чтобы преодолеть естественный разрыв между состоянием DOM и состоянием VDOM/Preact. Вот пример того, как вы можете использовать управляемый компонент для ограничения количества символов в поле ввода:

```jsx
// --repl
import { render } from "preact";
import { useState, useRef } from "preact/hooks";
// --repl-before
const Input = () => {
const [value, setValue] = useState('')
const inputRef = useRef()

const onInput = (e) => {
if (e.currentTarget.value.length <= 3) {
setValue(e.currentTarget.value)
} else {
const start = inputRef.current.selectionStart
const end = inputRef.current.selectionEnd
const diffLength = Math.abs(e.currentTarget.value.length - value.length)
inputRef.current.value = value
// Восстанавливаем выделение
inputRef.current.setSelectionRange(start - diffLength, end - diffLength)
}
}

return (
<>
<label>Этот ввод ограничен 3 символами: </label>
<input ref={inputRef} value={value} onInput={onInput} />
</>
);
}
// --repl-after
render(<Input />, document.getElementById("app"));
```

> Одна загвоздка заключается в том, что при установке значения `undefined` или `null` оно, по сути, станет неуправляемым.
> Дополнительную информацию об управляемых компонентах в Preact см. в статье [Контролируемые элементы ввода](https://www.jovidecroock.com/blog/control-inputs) Джови Де Крука.
## Создание простой формы

Expand Down
55 changes: 55 additions & 0 deletions content/ru/guide/v10/typescript.md
Original file line number Diff line number Diff line change
Expand Up @@ -494,3 +494,58 @@ function Counter({ initialCount = 0 }) {
```
Единственная необходимая аннотация находится в самой функции редуктора. Типы `useReducer` также гарантируют, что возвращаемое значение функции редуктора имеет тип `StateType`.
## Расширение встроенных типов JSX
У вас могут быть [пользовательские элементы](/guide/v10/web-components), которые вы хотели бы использовать в JSX, или вы можете добавить дополнительные атрибуты ко всем элементам HTML для работы с определённой библиотекой. Для этого вам нужно расширить интерфейсы `IntrinsicElements` или `HTMLAttributes` соответственно, чтобы TypeScript знал об этом и мог предоставить корректную информацию о типе.
### Расширение `IntrinsicElements`
```tsx
function MyComponent() {
return <loading-bar showing={true}></loading-bar>;
// ~~~~~~~~~~~
// 💥 Ошибка! Свойство 'loading-bar' не существует для типа 'JSX.IntrinsicElements'.
}
```
```tsx
// global.d.ts

declare global {
namespace preact.JSX {
interface IntrinsicElements {
'loading-bar': { showing: boolean };
}
}
}

// Этот пустой экспорт очень важен! Это говорит TS, что нужно рассматривать это как модуль
export {}
```
### Расширение `HTMLAttributes`
```tsx
function MyComponent() {
return <div custom="foo"></div>;
// ~~~~~~
// 💥 Ошибка! Тип '{ custom: string; }' не может быть присвоен типу 'DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>'.
// Свойство 'custom' не существует для типа 'DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>'.
}
```
```tsx
// global.d.ts

declare global {
namespace preact.JSX {
interface HTMLAttributes {
custom?: string | undefined;
}
}
}

// Этот пустой экспорт очень важен! Это говорит TS, что нужно рассматривать это как модуль
export {}
```
2 changes: 2 additions & 0 deletions content/ru/guide/v10/web-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ function Foo() {
}
```

> **Примечание:** Preact не делает никаких предположений относительно схем именования и не пытается навязать имена, в JSX или иным образом, свойствам DOM. Если у пользовательского элемента есть свойство с именем `someProperty`, его нужно задать с помощью `someProperty=...`, а не `some-property=...`.
При рендеринге статического HTML с использованием `preact-render-to-string` («SSR») сложные значения свойств, такие как объект выше, не сериализуются автоматически. Они применяются после гидратации статического HTML на клиенте.

### Доступ к методам экземпляра
Expand Down
3 changes: 2 additions & 1 deletion src/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@
"ru": "Помощь"
},
"solve": {
"en": "Solve"
"en": "Solve",
"ru": "Решить"
}
}
},
Expand Down

0 comments on commit 5422be4

Please sign in to comment.