From eb53fbd968abe4d9a2edea36eeba01b21ea88db4 Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Tue, 25 Apr 2023 08:55:14 +0300 Subject: [PATCH 01/13] Initial stuff for Quick Start in Russian --- src/content/learn/index.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index b57655bc4..60e7b774f 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -4,36 +4,35 @@ title: Quick Start -Welcome to the React documentation! This page will give you an introduction to the 80% of React concepts that you will use on a daily basis. - +Добро пожаловать в документацию React! Эта страница послужит вам введением в 80% концептов React, которые вы будете использовать каждый день. -- How to create and nest components -- How to add markup and styles -- How to display data -- How to render conditions and lists -- How to respond to events and update the screen -- How to share data between components +- Как создавать и вкладывать компоненты +- Как добавлять разметку и стили +- Как отображать данные +- Как отрисовывать условия и списки +- Как реагировать на события и обновлять экран +- Как обмениваться данными между компонентами ## Creating and nesting components {/*components*/} -React apps are made out of *components*. A component is a piece of the UI (user interface) that has its own logic and appearance. A component can be as small as a button, or as large as an entire page. +Приложения на React собираются из *компонентов*. Компонент — это часть пользовательского интерфейса, у которой есть свои логика и внешность. Компоненты в размерах разнятся от мелких кнопок до больших цельных страниц. -React components are JavaScript functions that return markup: +Компоненты React — это Javascript-функции, которые возвращают разметку: ```js function MyButton() { return ( - + ); } ``` -Now that you've declared `MyButton`, you can nest it into another component: +Теперь, когда вы объявили `MyButton`, вы можете вложить его в другой компонент: ```js {5} export default function MyApp() { @@ -46,9 +45,9 @@ export default function MyApp() { } ``` -Notice that `` starts with a capital letter. That's how you know it's a React component. React component names must always start with a capital letter, while HTML tags must be lowercase. +Заметьте, что `` начинается с заглавной буквы. Это отличительная черта компонентов React. Названия компонентов в React должны всегда начинаться с заглавной буквы, а теги HTML — с маленькой. -Have a look at the result: +Посмотрите на результат: From 4118bfe502ea32ce98eaa51d08558017e120f29b Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Tue, 25 Apr 2023 21:39:54 +0300 Subject: [PATCH 02/13] Almost all text's ready --- src/content/learn/index.md | 160 ++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index 60e7b774f..08aa2b57c 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -38,7 +38,7 @@ function MyButton() { export default function MyApp() { return (
-

Welcome to my app

+

Добро пожаловать в моё приложение

); @@ -55,7 +55,7 @@ export default function MyApp() { function MyButton() { return ( ); } @@ -63,7 +63,7 @@ function MyButton() { export default function MyApp() { return (
-

Welcome to my app

+

Добро пожаловать в моё приложение

); @@ -72,49 +72,49 @@ export default function MyApp() {
-The `export default` keywords specify the main component in the file. If you're not familiar with some piece of JavaScript syntax, [MDN](https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export) and [javascript.info](https://javascript.info/import-export) have great references. +Ключевые слова `export default` указывают на основной компонент в файле. Если вам не знакомы некоторые аспекты синтаксиса JavaScript, [MDN](https://developer.mozilla.org/ru-RU/docs/web/javascript/reference/statements/export) и [learn.javascript.ru](https://learn.javascript.ru/import-export) послужат для вас хорошими справочниками. -## Writing markup with JSX {/*writing-markup-with-jsx*/} +## Пишем разметку с JSX {/*writing-markup-with-jsx*/} -The markup syntax you've seen above is called *JSX*. It is optional, but most React projects use JSX for its convenience. All of the [tools we recommend for local development](/learn/installation) support JSX out of the box. +Используемый в примерах выше синтаксис разметки называется *JSX*. Его необязательно использовать, но большинство проектов на React используют JSX в силу его удобства. Все [инструменты, которые мы рекомендуем для локальной разработки,](/learn/installation) поддерживают JSX из коробки. -JSX is stricter than HTML. You have to close tags like `
`. Your component also can't return multiple JSX tags. You have to wrap them into a shared parent, like a `
...
` or an empty `<>...` wrapper: +JSX строже HTML. Вам нужно закрывать теги вроде `
`. Ваш компонент также не может возвращать несколько JSX-тегов. Их нужно будет обернуть внутрь общего родителя, например, `
...
` или пустую обёртку вида `<>...`: ```js {3,6} function AboutPage() { return ( <> -

About

-

Hello there.
How do you do?

+

Обо мне

+

Привет.
Как дела?

); } ``` -If you have a lot of HTML to port to JSX, you can use an [online converter.](https://transform.tools/html-to-jsx) +Если вам нужно перевести большое количество HTML-верстки в JSX, вы можете использовать [онлайн-конвертер.](https://transform.tools/html-to-jsx) -## Adding styles {/*adding-styles*/} +## Добавляем стили {/*adding-styles*/} -In React, you specify a CSS class with `className`. It works the same way as the HTML [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class) attribute: +В React CSS-классы объявляются с помощью свойства `className`. Оно работает аналогично HTML-аттрибуту [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class): ```js ``` -Then you write the CSS rules for it in a separate CSS file: +Затем, в отдельном CSS-файле вы прописываете правила для него. ```css -/* In your CSS */ +/* В вашем CSS */ .avatar { border-radius: 50%; } ``` -React does not prescribe how you add CSS files. In the simplest case, you'll add a [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) tag to your HTML. If you use a build tool or a framework, consult its documentation to learn how to add a CSS file to your project. +React не ограничивает вас в способах добавления CSS-файлов. В самом простом случае вы добавляете тэг [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять, как добавить CSS-файл в ваш проект. -## Displaying data {/*displaying-data*/} +## Отображаем данные {/*displaying-data*/} -JSX lets you put markup into JavaScript. Curly braces let you "escape back" into JavaScript so that you can embed some variable from your code and display it to the user. For example, this will display `user.name`: +JSX позволяет вам встраивать разметку в JavaScript, а фигурные скобки позволяют вам "выйти" в JavaScript для того, чтобы вы могли встроить какую-либо переменную из вашего кода и показать ее пользователю. Например, этот код отобразит переменную `user.name`: ```js {3} return ( @@ -124,7 +124,7 @@ return ( ); ``` -You can also "escape into JavaScript" from JSX attributes, but you have to use curly braces *instead of* quotes. For example, `className="avatar"` passes the `"avatar"` string as the CSS class, but `src={user.imageUrl}` reads the JavaScript `user.imageUrl` variable value, and then passes that value as the `src` attribute: +Вы тажке можете "выйти в JavaScript" из атрибутов JSX, но вам нужно использовать фигурные скобки *вместо* кавычек. Например, `className="avatar"` передает строку `"avatar"` как класс CSS, но `src={user.imageUrl}` считывает значение JavaScript-переменной `user.imageUrl` и затем передает его в качестве атрибута `src`: ```js {3,4} return ( @@ -135,7 +135,7 @@ return ( ); ``` -You can put more complex expressions inside the JSX curly braces too, for example, [string concatenation](https://javascript.info/operators#string-concatenation-with-binary): +Вы также можете прописывать более сложные выражения внутри фигурных скобок JSX, например, [сложение строк](https://learn.javascript.ru/operators#slozhenie-strok-pri-pomoschi-binarnogo): @@ -153,7 +153,7 @@ export default function Profile() { {'Photo -In the above example, `style={{}}` is not a special syntax, but a regular `{}` object inside the `style={ }` JSX curly braces. You can use the `style` attribute when your styles depend on JavaScript variables. +В этом примере `style={{}}` не явлется особым синтаксисом, а представляет из себя обычный объект `{}` внутри фигурных скобок JSX `style={ }`. Вы можете использовать атрибут `style` в случаях, когда ваши стили зависят от переменных JavaScript. -## Conditional rendering {/*conditional-rendering*/} +## Условный рендеринг {/*conditional-rendering*/} -In React, there is no special syntax for writing conditions. Instead, you'll use the same techniques as you use when writing regular JavaScript code. For example, you can use an [`if`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else) statement to conditionally include JSX: +В React не существует особого синтаксиса для описания условий, вместо этого пишите привычный вам код на JavaScript. Например, для условного использования JSX-кода можно применять инструкцию [`if`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Statements/if...else): ```js let content; @@ -196,7 +196,7 @@ return ( ); ``` -If you prefer more compact code, you can use the [conditional `?` operator.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) Unlike `if`, it works inside JSX: +Если вы предпочитаете писать более компактный код, используйте [условный оператор `?`.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) В отличие от `if`, его можно использовать в JSX: ```js
@@ -208,7 +208,7 @@ If you prefer more compact code, you can use the [conditional `?` operator.](htt
``` -When you don't need the `else` branch, you can also use a shorter [logical `&&` syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND#short-circuit_evaluation): +Когда вам не нужно использовать ветку `else`, можно использовать более короткий [логический оператор `&&`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND#short-circuit_evaluation): ```js
@@ -216,23 +216,23 @@ When you don't need the `else` branch, you can also use a shorter [logical `&&`
``` -All of these approaches also work for conditionally specifying attributes. If you're unfamiliar with some of this JavaScript syntax, you can start by always using `if...else`. +Все эти способы подходят и для условного задания атрибутов. Если вы не знакомы с такими синтаксическими конструкциями JavaScript, вы можете начать с повсеместного использования `if...else`. -## Rendering lists {/*rendering-lists*/} +## Отрисовываем списки {/*rendering-lists*/} -You will rely on JavaScript features like [`for` loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) and the [array `map()` function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) to render lists of components. +Для отрисовки списков компонентов вам будет нужно использовать такие возможности JavaScript, как [цикл `for`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) и [функцию массива `map()`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Global_Objects/Array/map). -For example, let's say you have an array of products: +Например, представим, что у вас есть массив продуктов: ```js const products = [ - { title: 'Cabbage', id: 1 }, - { title: 'Garlic', id: 2 }, - { title: 'Apple', id: 3 }, + { title: 'Капуста', id: 1 }, + { title: 'Чеснок', id: 2 }, + { title: 'Яблоко', id: 3 }, ]; ``` -Inside your component, use the `map()` function to transform an array of products into an array of `
  • ` items: +Преобразуйте этот массив в массив элементов `
  • ` с помощью функции `map()` внутри вашего компонента: ```js const listItems = products.map(product => @@ -246,15 +246,15 @@ return ( ); ``` -Notice how `
  • ` has a `key` attribute. For each item in a list, you should pass a string or a number that uniquely identifies that item among its siblings. Usually, a key should be coming from your data, such as a database ID. React uses your keys to know what happened if you later insert, delete, or reorder the items. +Обратите внимание, что у `
  • ` есть атрибут `key`. Для каждого элемента списка вам нужно задавать ключ в виде строки или числа, который позволит однозначно определить этот элемент среди остальных в списке. Обычно этот ключ берется из ваших данных, например, ключом может быть идентификатор из базы данных. React использует информацию о ключах, чтобы понимать, что случилось, если вы добавите, удалите или переупорядочите элементы. ```js const products = [ - { title: 'Cabbage', isFruit: false, id: 1 }, - { title: 'Garlic', isFruit: false, id: 2 }, - { title: 'Apple', isFruit: true, id: 3 }, + { title: 'Капуста', isFruit: false, id: 1 }, + { title: 'Чеснок', isFruit: false, id: 2 }, + { title: 'Яблоко', isFruit: true, id: 3 }, ]; export default function ShoppingList() { @@ -277,14 +277,14 @@ export default function ShoppingList() { -## Responding to events {/*responding-to-events*/} +## Реагируем на события {/*responding-to-events*/} -You can respond to events by declaring *event handler* functions inside your components: +Можно реагировать на события, объявляя внутри ваших компонентов функции *обработчиков событий*: ```js {2-4,7} function MyButton() { function handleClick() { - alert('You clicked me!'); + alert('Вы нажали на меня!'); } return ( @@ -295,19 +295,19 @@ function MyButton() { } ``` -Notice how `onClick={handleClick}` has no parentheses at the end! Do not _call_ the event handler function: you only need to *pass it down*. React will call your event handler when the user clicks the button. +Заметьте: у `onClick={handleClick}` нет скобок в конце! Не _вызывайте_ функцию обработчика событий: вам нужно просто ее *передать*. React вызовет ваш обработчик событий, когда пользователь нажмет на кнопку. -## Updating the screen {/*updating-the-screen*/} +## Обновляем экран {/*updating-the-screen*/} -Often, you'll want your component to "remember" some information and display it. For example, maybe you want to count the number of times a button is clicked. To do this, add *state* to your component. +Зачастую, вам понадобится, чтобы ваш компонент "помнил" какую-то информацию и отображал её. Например, вы хотите посчитать, сколько раз была нажата кнопка. Чтобы это сделать, добавьте *состояние* в ваш компонент. -First, import [`useState`](/reference/react/useState) from React: +Сначала импортируйте [`useState`](/reference/react/useState) из React: ```js import { useState } from 'react'; ``` -Now you can declare a *state variable* inside your component: +Теперь можно объявить *переменную состояния* внутри вашего компонента: ```js function MyButton() { @@ -315,9 +315,9 @@ function MyButton() { // ... ``` -You’ll get two things from `useState`: the current state (`count`), and the function that lets you update it (`setCount`). You can give them any names, but the convention is to write `[something, setSomething]`. +`useState` вернет вам две сущности: текущее состояние (`count`) и функцию (`setCount`), которая обновляет его. Можно назвать их как вам угодно, но такого рода вещи принято называть `[something, setSomething]`. -The first time the button is displayed, `count` will be `0` because you passed `0` to `useState()`. When you want to change state, call `setCount()` and pass the new value to it. Clicking this button will increment the counter: +На первый показ кнопки `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Когда вы хотите изменить состояние, вызовите `setCount()` и передайте туда новое значение. Нажатие на эту кнопку будет увеличивать счётчик: ```js {5} function MyButton() { @@ -329,15 +329,15 @@ function MyButton() { return ( ); } ``` -React will call your component function again. This time, `count` will be `1`. Then it will be `2`. And so on. +React снова вызовет функцию вашего компонента. На этот раз `count` будет равно `1`, затем `2`, и так далее. -If you render the same component multiple times, each will get its own state. Click each button separately: +Если вы рендерите один и тот же компонент несколько раз, у каждого из них будет своё состояние. Попробуйте понажимать на каждую кнопку по отдельности: @@ -347,7 +347,7 @@ import { useState } from 'react'; export default function MyApp() { return (
    -

    Counters that update separately

    +

    Независимо обновляющиеся счётчики

    @@ -363,7 +363,7 @@ function MyButton() { return ( ); } @@ -378,59 +378,59 @@ button {
    -Notice how each button "remembers" its own `count` state and doesn't affect other buttons. +Обратите внимание на то, как каждая кнопка "помнит" свое состояние `count` и не влияет на другие кнопки. -## Using Hooks {/*using-hooks*/} +## Используем хуки {/*using-hooks*/} -Functions starting with `use` are called *Hooks*. `useState` is a built-in Hook provided by React. You can find other built-in Hooks in the [API reference.](/reference/react) You can also write your own Hooks by combining the existing ones. +Функции, которые начинаются с `use`, называются *хуками*. `useState` — это встроенный в React хук. В [справочнике API](/reference/react) приводятся другие встроенные хуки. Также, вы можете писать свои собственные хуки, совмещая уже существующие. -Hooks are more restrictive than other functions. You can only call Hooks *at the top* of your components (or other Hooks). If you want to use `useState` in a condition or a loop, extract a new component and put it there. +У хуков больше ограничений, чем у других функций. Хуки могут вызываться только *в начале* ваших компонентов (или других хуков). Если вам нужен `useState` в условии или цикле, выделите новый компонент и используйте его там. -## Sharing data between components {/*sharing-data-between-components*/} +## Обмениваемся данными между компонентами {/*sharing-data-between-components*/} -In the previous example, each `MyButton` had its own independent `count`, and when each button was clicked, only the `count` for the button clicked changed: +В предыдущем примере у каждого `MyButton` имеется своё собственное состояние `count`, и при нажатии на каждую кнопку обновление `count` происходило только у нажатой кнопки. - + -Initially, each `MyButton`'s `count` state is `0` +В начале у каждого `MyButton` состояние `count` равно `0` - + -The first `MyButton` updates its `count` to `1` +Первый компонент `MyButton` обновляет свой `count` значением `1` -However, often you'll need components to *share data and always update together*. +Однако, вы будете часто сталкиваться с ситуацией, когда вам будет нужно, чтобы компоненты *имели общие данные и всегда обновлялись вместе*. -To make both `MyButton` components display the same `count` and update together, you need to move the state from the individual buttons "upwards" to the closest component containing all of them. +Для того, чтобы оба компонента `MyButton` отображали одно и то же значение `count`, вам нужно выделить состояние из отдельных кнопок "вверх" в ближайший компонент, содержащий эти компоненты. -In this example, it is `MyApp`: +В этом случае таким компонентом является `MyApp`: -Initially, `MyApp`'s `count` state is `0` and is passed down to both children +Сначала состояние `count` компонента `MyApp` равно `0` и передаётся обоим потомкам -On click, `MyApp` updates its `count` state to `1` and passes it down to both children +При нажатии `MyApp` обновляет своё состояние `count` значением `1` и передает его вниз обоим потомкам -Now when you click either button, the `count` in `MyApp` will change, which will change both of the counts in `MyButton`. Here's how you can express this in code. +Теперь, когда вы нажимаете на любую из кнопок, `count` в `MyApp` будет менять своё значение, что в свою очередь повлечёт обновление счётчиков в обоих компонентах `MyButton`. Вот как это можно прописать в коде. -First, *move the state up* from `MyButton` into `MyApp`: +Сначала *переместите вверх состояние* из `MyButton` в `MyApp`: ```js {2-6,18} export default function MyApp() { @@ -442,7 +442,7 @@ export default function MyApp() { return (
    -

    Counters that update separately

    +

    Независимо обновляющиеся счётчики

    @@ -450,12 +450,12 @@ export default function MyApp() { } function MyButton() { - // ... we're moving code from here ... + // ... мы перемещаем код отсюда ... } ``` -Then, *pass the state down* from `MyApp` to each `MyButton`, together with the shared click handler. You can pass information to `MyButton` using the JSX curly braces, just like you previously did with built-in tags like ``: +Затем *передайте состояние на уровень ниже* из `MyApp` каждому `MyButton` вместе с общим обработчиком клика. Можно передавать информацию в `MyButton` через фигурные скобки JSX таким же образом, как вы это делали со встроенными тегами наподобие ``: ```js {11-12} export default function MyApp() { @@ -467,7 +467,7 @@ export default function MyApp() { return (
    -

    Counters that update together

    +

    Совместно обновляющиеся счётчики

    @@ -475,21 +475,21 @@ export default function MyApp() { } ``` -The information you pass down like this is called _props_. Now the `MyApp` component contains the `count` state and the `handleClick` event handler, and *passes both of them down as props* to each of the buttons. +Информация, которую вы передаёте таким образом, называется _пропсами_. Теперь у компонента `MyApp` есть состояние `count` и обработчик событий `handleClick`, *которые он передает в качестве пропсов* каждой кнопке-потомку. -Finally, change `MyButton` to *read* the props you have passed from its parent component: +Наконец, подправьте компонент `MyButton` так, чтобы он *считывал* пропсы, переданные от своего родителя: ```js {1,3} function MyButton({ count, onClick }) { return ( ); } ``` -When you click the button, the `onClick` handler fires. Each button's `onClick` prop was set to the `handleClick` function inside `MyApp`, so the code inside of it runs. That code calls `setCount(count + 1)`, incrementing the `count` state variable. The new `count` value is passed as a prop to each button, so they all show the new value. This is called "lifting state up". By moving state up, you've shared it between components. +Когда вы нажимаете на кнопку, срабатывает обработчик `onClick`. В каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, таким образом, исполняется код этой функции. Этот код вызывает `setCount(count + 1)`, тем самым увеличивая переменную состояния `count`. Новое значение `count` передается в качестве пропа каждой кнопке, таким образом все кнопки будут показывать это новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов. @@ -530,8 +530,8 @@ button { -## Next Steps {/*next-steps*/} +## Следующие шаги {/*next-steps*/} -By now, you know the basics of how to write React code! +Теперь вы знаете, как писать простой код для React! -Check out the [Tutorial](/learn/tutorial-tic-tac-toe) to put them into practice and build your first mini-app with React. +Ознакомьтесь со следующим [введением](/learn/tutorial-tic-tac-toe), в рамках которого вы примените полученные знания и соберёте свое первое мини-приложение на React. From b06ad4504166ce89cb876145c737d44b60b03813 Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Tue, 25 Apr 2023 22:47:05 +0300 Subject: [PATCH 03/13] Translated Quick Start to Russian --- src/content/learn/index.md | 72 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index 08aa2b57c..e7dda8f35 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -4,7 +4,7 @@ title: Quick Start -Добро пожаловать в документацию React! Эта страница послужит вам введением в 80% концептов React, которые вы будете использовать каждый день. +Добро пожаловать в документацию React! Эта страница посвятит вас в основы 80% концепций React, которыми вы будете пользоваться каждый день. @@ -18,11 +18,11 @@ title: Quick Start -## Creating and nesting components {/*components*/} +## Создание и вложение компонентов {/*components*/} Приложения на React собираются из *компонентов*. Компонент — это часть пользовательского интерфейса, у которой есть свои логика и внешность. Компоненты в размерах разнятся от мелких кнопок до больших цельных страниц. -Компоненты React — это Javascript-функции, которые возвращают разметку: +Компоненты React — это функции JavaScript, которые возвращают разметку: ```js function MyButton() { @@ -32,7 +32,7 @@ function MyButton() { } ``` -Теперь, когда вы объявили `MyButton`, вы можете вложить его в другой компонент: +Вы объявили компонент `MyButton`, который можно вложить в другой компонент: ```js {5} export default function MyApp() { @@ -45,7 +45,7 @@ export default function MyApp() { } ``` -Заметьте, что `` начинается с заглавной буквы. Это отличительная черта компонентов React. Названия компонентов в React должны всегда начинаться с заглавной буквы, а теги HTML — с маленькой. +Обратите внимание на то, что `` начинается с заглавной буквы. Это отличительная черта компонентов React. Названия компонентов в React всегда должны начинаться с заглавной буквы, а теги HTML — с маленькой. Посмотрите на результат: @@ -72,11 +72,11 @@ export default function MyApp() { -Ключевые слова `export default` указывают на основной компонент в файле. Если вам не знакомы некоторые аспекты синтаксиса JavaScript, [MDN](https://developer.mozilla.org/ru-RU/docs/web/javascript/reference/statements/export) и [learn.javascript.ru](https://learn.javascript.ru/import-export) послужат для вас хорошими справочниками. +Ключевые слова `export default` указывают на основной компонент в файле. Для того, чтобы понять некоторые особенности синтаксиса JavaScript, можно пользоваться ресурсами [MDN](https://developer.mozilla.org/ru-RU/docs/web/javascript/reference/statements/export) и [learn.javascript.ru](https://learn.javascript.ru/import-export). -## Пишем разметку с JSX {/*writing-markup-with-jsx*/} +## Написание разметки с JSX {/*writing-markup-with-jsx*/} -Используемый в примерах выше синтаксис разметки называется *JSX*. Его необязательно использовать, но большинство проектов на React используют JSX в силу его удобства. Все [инструменты, которые мы рекомендуем для локальной разработки,](/learn/installation) поддерживают JSX из коробки. +Используемый в примерах выше синтаксис разметки называется *JSX*. Он не обязателен, но большинство проектов на React предпочитают его использовать за удобство. Все [инструменты, которые мы рекомендуем для локальной разработки,](/learn/installation) поддерживают JSX из коробки. JSX строже HTML. Вам нужно закрывать теги вроде `
    `. Ваш компонент также не может возвращать несколько JSX-тегов. Их нужно будет обернуть внутрь общего родителя, например, `
    ...
    ` или пустую обёртку вида `<>...`: @@ -91,17 +91,17 @@ function AboutPage() { } ``` -Если вам нужно перевести большое количество HTML-верстки в JSX, вы можете использовать [онлайн-конвертер.](https://transform.tools/html-to-jsx) +Для того, чтобы перевести большое количество HTML-верстки в JSX, можно использовать [онлайн-конвертер.](https://transform.tools/html-to-jsx) -## Добавляем стили {/*adding-styles*/} +## Добавление стилей {/*adding-styles*/} -В React CSS-классы объявляются с помощью свойства `className`. Оно работает аналогично HTML-аттрибуту [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class): +В React CSS-классы объявляются с помощью свойства `className`. Оно работает аналогично HTML-аттрибуту [`class`](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Global_attributes/class): ```js ``` -Затем, в отдельном CSS-файле вы прописываете правила для него. +В отдельном CSS-файле вы прописываете стили для него. ```css /* В вашем CSS */ @@ -110,9 +110,9 @@ function AboutPage() { } ``` -React не ограничивает вас в способах добавления CSS-файлов. В самом простом случае вы добавляете тэг [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять, как добавить CSS-файл в ваш проект. +React не ограничивает вас в том, как добавлять CSS-файлы. В самом простом случае вы добавляете тэг [``](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять, как добавить CSS-файл в ваш проект. -## Отображаем данные {/*displaying-data*/} +## Отображение данных {/*displaying-data*/} JSX позволяет вам встраивать разметку в JavaScript, а фигурные скобки позволяют вам "выйти" в JavaScript для того, чтобы вы могли встроить какую-либо переменную из вашего кода и показать ее пользователю. Например, этот код отобразит переменную `user.name`: @@ -196,7 +196,7 @@ return ( ); ``` -Если вы предпочитаете писать более компактный код, используйте [условный оператор `?`.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) В отличие от `if`, его можно использовать в JSX: +Если вы предпочитаете писать более компактный код, используйте [условный оператор `?`.](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) В отличие от `if` его можно использовать в JSX: ```js
    @@ -208,7 +208,7 @@ return (
    ``` -Когда вам не нужно использовать ветку `else`, можно использовать более короткий [логический оператор `&&`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND#short-circuit_evaluation): +Когда вам не нужна ветка `else`, можно использовать более короткий [логический оператор `&&`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Operators/Logical_AND#short-circuit_evaluation): ```js
    @@ -216,11 +216,11 @@ return (
    ``` -Все эти способы подходят и для условного задания атрибутов. Если вы не знакомы с такими синтаксическими конструкциями JavaScript, вы можете начать с повсеместного использования `if...else`. +Все эти способы подходят и для условного задания атрибутов. Если вам не знакомы такие синтаксические конструкции JavaScript, вы можете начать с повсеместного использования `if...else`. -## Отрисовываем списки {/*rendering-lists*/} +## Рендеринг списков {/*rendering-lists*/} -Для отрисовки списков компонентов вам будет нужно использовать такие возможности JavaScript, как [цикл `for`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) и [функцию массива `map()`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Global_Objects/Array/map). +Для отрисовки списков компонентов вам будет нужно использовать такие возможности JavaScript, как [цикл `for`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Statements/for) и [функция массива `map()`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Global_Objects/Array/map). Например, представим, что у вас есть массив продуктов: @@ -277,7 +277,7 @@ export default function ShoppingList() { -## Реагируем на события {/*responding-to-events*/} +## Обработка событий {/*responding-to-events*/} Можно реагировать на события, объявляя внутри ваших компонентов функции *обработчиков событий*: @@ -295,11 +295,11 @@ function MyButton() { } ``` -Заметьте: у `onClick={handleClick}` нет скобок в конце! Не _вызывайте_ функцию обработчика событий: вам нужно просто ее *передать*. React вызовет ваш обработчик событий, когда пользователь нажмет на кнопку. +Заметьте: у `onClick={handleClick}` нет скобок в конце! Не _вызывайте_ функцию обработчика событий: вам нужно просто ее *передать*. React вызовет ваш обработчик событий, когда пользователь кликнет по кнопке. -## Обновляем экран {/*updating-the-screen*/} +## Обновление экрана {/*updating-the-screen*/} -Зачастую, вам понадобится, чтобы ваш компонент "помнил" какую-то информацию и отображал её. Например, вы хотите посчитать, сколько раз была нажата кнопка. Чтобы это сделать, добавьте *состояние* в ваш компонент. +Вам может понадобиться, чтобы ваш компонент "помнил" какую-то информацию и отображал её. Например, вы хотите посчитать, сколько раз была нажата кнопка. Чтобы это сделать, добавьте *состояние* в ваш компонент. Сначала импортируйте [`useState`](/reference/react/useState) из React: @@ -317,7 +317,7 @@ function MyButton() { `useState` вернет вам две сущности: текущее состояние (`count`) и функцию (`setCount`), которая обновляет его. Можно назвать их как вам угодно, но такого рода вещи принято называть `[something, setSomething]`. -На первый показ кнопки `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Когда вы хотите изменить состояние, вызовите `setCount()` и передайте туда новое значение. Нажатие на эту кнопку будет увеличивать счётчик: +На первый показ кнопки `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Когда вы хотите изменить состояние, вызовите `setCount()` и передайте туда новое значение. Клик на эту кнопку будет увеличивать счётчик: ```js {5} function MyButton() { @@ -329,7 +329,7 @@ function MyButton() { return ( ); } @@ -337,7 +337,7 @@ function MyButton() { React снова вызовет функцию вашего компонента. На этот раз `count` будет равно `1`, затем `2`, и так далее. -Если вы рендерите один и тот же компонент несколько раз, у каждого из них будет своё состояние. Попробуйте понажимать на каждую кнопку по отдельности: +Если вы рендерите один и тот же компонент несколько раз, то у каждого из них будет своё состояние. Попробуйте покликать на каждую кнопку по отдельности: @@ -363,7 +363,7 @@ function MyButton() { return ( ); } @@ -380,15 +380,15 @@ button { Обратите внимание на то, как каждая кнопка "помнит" свое состояние `count` и не влияет на другие кнопки. -## Используем хуки {/*using-hooks*/} +## Использование хуков {/*using-hooks*/} Функции, которые начинаются с `use`, называются *хуками*. `useState` — это встроенный в React хук. В [справочнике API](/reference/react) приводятся другие встроенные хуки. Также, вы можете писать свои собственные хуки, совмещая уже существующие. У хуков больше ограничений, чем у других функций. Хуки могут вызываться только *в начале* ваших компонентов (или других хуков). Если вам нужен `useState` в условии или цикле, выделите новый компонент и используйте его там. -## Обмениваемся данными между компонентами {/*sharing-data-between-components*/} +## Обмен данными между компонентами {/*sharing-data-between-components*/} -В предыдущем примере у каждого `MyButton` имеется своё собственное состояние `count`, и при нажатии на каждую кнопку обновление `count` происходило только у нажатой кнопки. +В предыдущем примере у каждого `MyButton` имеется своё собственное состояние `count`, и при клике на каждую кнопку обновление `count` происходило только у нажатой кнопки. @@ -398,7 +398,7 @@ button { - + Первый компонент `MyButton` обновляет свой `count` значением `1` @@ -414,15 +414,15 @@ button { - + Сначала состояние `count` компонента `MyApp` равно `0` и передаётся обоим потомкам - + -При нажатии `MyApp` обновляет своё состояние `count` значением `1` и передает его вниз обоим потомкам +При клике `MyApp` обновляет своё состояние `count` значением `1` и передает его вниз обоим потомкам @@ -483,7 +483,7 @@ export default function MyApp() { function MyButton({ count, onClick }) { return ( ); } @@ -534,4 +534,4 @@ button { Теперь вы знаете, как писать простой код для React! -Ознакомьтесь со следующим [введением](/learn/tutorial-tic-tac-toe), в рамках которого вы примените полученные знания и соберёте свое первое мини-приложение на React. +Ознакомьтесь с [введением](/learn/tutorial-tic-tac-toe), в рамках которого вы примените полученные знания и соберёте свое первое мини-приложение на React. From 221876d20dd6909ae4481e9fb221e5ed7467716b Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Wed, 26 Apr 2023 10:57:22 +0300 Subject: [PATCH 04/13] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Предложения от gcor, самостоятельно замеченные случаи неиспользования буквы `ё` Co-authored-by: Anton Ahatov --- src/content/learn/index.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index e7dda8f35..9d1052ba4 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -4,7 +4,7 @@ title: Quick Start -Добро пожаловать в документацию React! Эта страница посвятит вас в основы 80% концепций React, которыми вы будете пользоваться каждый день. +Добро пожаловать в документацию React! Эта страница познакомит вас с большинством концепций React, которыми вы будете пользоваться каждый день. @@ -13,14 +13,14 @@ title: Quick Start - Как добавлять разметку и стили - Как отображать данные - Как отрисовывать условия и списки -- Как реагировать на события и обновлять экран +- Как реагировать на события и обновлять страницу - Как обмениваться данными между компонентами ## Создание и вложение компонентов {/*components*/} -Приложения на React собираются из *компонентов*. Компонент — это часть пользовательского интерфейса, у которой есть свои логика и внешность. Компоненты в размерах разнятся от мелких кнопок до больших цельных страниц. +Приложения на React собираются из *компонентов*. Компонент — это часть пользовательского интерфейса, у которого есть собственная логика и внешность. Компонент может быть маленьким, как кнопка, или большим, как целая страница. Компоненты React — это функции JavaScript, которые возвращают разметку: @@ -76,7 +76,7 @@ export default function MyApp() { ## Написание разметки с JSX {/*writing-markup-with-jsx*/} -Используемый в примерах выше синтаксис разметки называется *JSX*. Он не обязателен, но большинство проектов на React предпочитают его использовать за удобство. Все [инструменты, которые мы рекомендуем для локальной разработки,](/learn/installation) поддерживают JSX из коробки. +Синтаксис разметки, который вы видели выше, называется *JSX*. Он не обязателен, но большинство проектов на React предпочитают его использовать из-за удобства. Все [инструменты, которые мы рекомендуем для локальной разработки,](/learn/installation) поддерживают JSX. JSX строже HTML. Вам нужно закрывать теги вроде `
    `. Ваш компонент также не может возвращать несколько JSX-тегов. Их нужно будет обернуть внутрь общего родителя, например, `
    ...
    ` или пустую обёртку вида `<>...`: @@ -101,7 +101,7 @@ function AboutPage() { ``` -В отдельном CSS-файле вы прописываете стили для него. +В отдельном CSS-файле вы прописываете для него стили. ```css /* В вашем CSS */ @@ -114,7 +114,7 @@ React не ограничивает вас в том, как добавлять ## Отображение данных {/*displaying-data*/} -JSX позволяет вам встраивать разметку в JavaScript, а фигурные скобки позволяют вам "выйти" в JavaScript для того, чтобы вы могли встроить какую-либо переменную из вашего кода и показать ее пользователю. Например, этот код отобразит переменную `user.name`: +Фигурные скобки внутри JSX-разметки позволяют использовать JavaScript, например для того чтобы отобразить свою переменную пользователю. Код ниже отобразит `user.name`: ```js {3} return ( @@ -124,7 +124,7 @@ return ( ); ``` -Вы тажке можете "выйти в JavaScript" из атрибутов JSX, но вам нужно использовать фигурные скобки *вместо* кавычек. Например, `className="avatar"` передает строку `"avatar"` как класс CSS, но `src={user.imageUrl}` считывает значение JavaScript-переменной `user.imageUrl` и затем передает его в качестве атрибута `src`: +Вы также можете использовать JavaScript в атрибутах JSX. В таком случае вам нужно поставить фигурные скобки *вместо* кавычек. Например, `className="avatar"` передаёт строку `"avatar"` как CSS-класс, а `src={user.imageUrl}` считывает значение JavaScript-переменной `user.imageUrl` и передаёт его в качестве атрибута `src`: ```js {3,4} return ( @@ -135,7 +135,7 @@ return ( ); ``` -Вы также можете прописывать более сложные выражения внутри фигурных скобок JSX, например, [сложение строк](https://learn.javascript.ru/operators#slozhenie-strok-pri-pomoschi-binarnogo): +Вы также можете использовать в JSX более сложные выражения внутри фигурных скобок, например, [сложение строк](https://learn.javascript.ru/operators#slozhenie-strok-pri-pomoschi-binarnogo): @@ -176,11 +176,11 @@ export default function Profile() { -В этом примере `style={{}}` не явлется особым синтаксисом, а представляет из себя обычный объект `{}` внутри фигурных скобок JSX `style={ }`. Вы можете использовать атрибут `style` в случаях, когда ваши стили зависят от переменных JavaScript. +В этом примере `style={{}}` не является специальным синтаксисом, а представляет из себя обычный объект `{}` внутри фигурных скобок JSX `style={ }`. Вы можете использовать атрибут `style` в случаях, когда ваши стили зависят от переменных JavaScript. ## Условный рендеринг {/*conditional-rendering*/} -В React не существует особого синтаксиса для описания условий, вместо этого пишите привычный вам код на JavaScript. Например, для условного использования JSX-кода можно применять инструкцию [`if`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Statements/if...else): +В React не существует специального синтаксиса для описания условий, вместо этого можно использовать обычный код на JavaScript. Например, для условного рендеринга JSX-кода можно применять [`if`](https://developer.mozilla.org/ru-RU/docs/Web/JavaScript/Reference/Statements/if...else): ```js let content; @@ -216,7 +216,7 @@ return ( ``` -Все эти способы подходят и для условного задания атрибутов. Если вам не знакомы такие синтаксические конструкции JavaScript, вы можете начать с повсеместного использования `if...else`. +Все эти способы подходят и для задания условий в атрибутах. Если вам не знакомы такие синтаксические конструкции JavaScript, вы можете начать с использования `if...else`. ## Рендеринг списков {/*rendering-lists*/} @@ -279,7 +279,7 @@ export default function ShoppingList() { ## Обработка событий {/*responding-to-events*/} -Можно реагировать на события, объявляя внутри ваших компонентов функции *обработчиков событий*: +Вы можете реагировать на события, объявляя внутри ваших компонентов функции *обработчиков событий*: ```js {2-4,7} function MyButton() { @@ -315,9 +315,9 @@ function MyButton() { // ... ``` -`useState` вернет вам две сущности: текущее состояние (`count`) и функцию (`setCount`), которая обновляет его. Можно назвать их как вам угодно, но такого рода вещи принято называть `[something, setSomething]`. +`useState` вернет вам две вещи: текущее состояние (`count`) и функцию (`setCount`), которая обновляет его. Можно именовать их как вам угодно, но такого рода вещи принято называть `[something, setSomething]`. -На первый показ кнопки `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Когда вы хотите изменить состояние, вызовите `setCount()` и передайте туда новое значение. Клик на эту кнопку будет увеличивать счётчик: +При первом показе кнопка `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Чтобы изменить состояние, вызовите `setCount()` и передайте туда новое значение. Клик на эту кнопку будет увеличивать счётчик: ```js {5} function MyButton() { @@ -422,7 +422,7 @@ button { -При клике `MyApp` обновляет своё состояние `count` значением `1` и передает его вниз обоим потомкам +При клике `MyApp` обновляет своё состояние `count` на значение `1` и передаёт его вниз обоим потомкам @@ -532,6 +532,6 @@ button { ## Следующие шаги {/*next-steps*/} -Теперь вы знаете, как писать простой код для React! +Теперь вы знаете основы, как писать код для React! -Ознакомьтесь с [введением](/learn/tutorial-tic-tac-toe), в рамках которого вы примените полученные знания и соберёте свое первое мини-приложение на React. +Ознакомьтесь с [введением](/learn/tutorial-tic-tac-toe), в рамках которого вы сможете применить полученные знания и собрать своё первое мини-приложение на React. From d4c742d39f78b6b7a7ab2581aa5a13aa81e7123f Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Thu, 27 Apr 2023 11:58:44 +0300 Subject: [PATCH 05/13] Apply suggestions from code review Co-authored-by: Anton Ahatov --- src/content/learn/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index 9d1052ba4..e14bdc22e 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -299,7 +299,7 @@ function MyButton() { ## Обновление экрана {/*updating-the-screen*/} -Вам может понадобиться, чтобы ваш компонент "помнил" какую-то информацию и отображал её. Например, вы хотите посчитать, сколько раз была нажата кнопка. Чтобы это сделать, добавьте *состояние* в ваш компонент. +Вам может понадобиться, чтобы компонент «помнил» какую-то информацию и отображал её. Например, вы хотите посчитать сколько раз была нажата кнопка. Чтобы это сделать, добавьте *состояние* в ваш компонент. Сначала импортируйте [`useState`](/reference/react/useState) из React: @@ -382,7 +382,7 @@ button { ## Использование хуков {/*using-hooks*/} -Функции, которые начинаются с `use`, называются *хуками*. `useState` — это встроенный в React хук. В [справочнике API](/reference/react) приводятся другие встроенные хуки. Также, вы можете писать свои собственные хуки, совмещая уже существующие. +Функции, которые начинаются с `use`, называются *хуками*. `useState` — это встроенный в React хук. В [справочнике API](/reference/react) приводятся другие встроенные хуки. Также, вы можете писать свои собственные хуки, совмещая их с уже существующими. У хуков больше ограничений, чем у других функций. Хуки могут вызываться только *в начале* ваших компонентов (или других хуков). Если вам нужен `useState` в условии или цикле, выделите новый компонент и используйте его там. @@ -408,19 +408,19 @@ button { Однако, вы будете часто сталкиваться с ситуацией, когда вам будет нужно, чтобы компоненты *имели общие данные и всегда обновлялись вместе*. -Для того, чтобы оба компонента `MyButton` отображали одно и то же значение `count`, вам нужно выделить состояние из отдельных кнопок "вверх" в ближайший компонент, содержащий эти компоненты. +Для того, чтобы оба компонента `MyButton` отображали одно и то же значение `count`, вам нужно перенести состояние из отдельных кнопок «выше», в ближайший компонент, содержащий эти компоненты. В этом случае таким компонентом является `MyApp`: - + Сначала состояние `count` компонента `MyApp` равно `0` и передаётся обоим потомкам - + При клике `MyApp` обновляет своё состояние `count` на значение `1` и передаёт его вниз обоим потомкам @@ -467,7 +467,7 @@ export default function MyApp() { return (
    -

    Совместно обновляющиеся счётчики

    +

    Одновременно обновляющиеся счётчики

    @@ -475,9 +475,9 @@ export default function MyApp() { } ``` -Информация, которую вы передаёте таким образом, называется _пропсами_. Теперь у компонента `MyApp` есть состояние `count` и обработчик событий `handleClick`, *которые он передает в качестве пропсов* каждой кнопке-потомку. +Информация, которую вы передаёте таким образом, называется _пропсами_. Теперь у компонента `MyApp` есть состояние `count` и обработчик событий `handleClick`, *которые передаются в качестве пропсов* каждой кнопке. -Наконец, подправьте компонент `MyButton` так, чтобы он *считывал* пропсы, переданные от своего родителя: +Наконец, измените компонент `MyButton` так, чтобы он *считывал* пропсы, переданные от своего родителя: ```js {1,3} function MyButton({ count, onClick }) { @@ -532,6 +532,6 @@ button { ## Следующие шаги {/*next-steps*/} -Теперь вы знаете основы, как писать код для React! +Теперь вы знаете основы того, как писать код для React! Ознакомьтесь с [введением](/learn/tutorial-tic-tac-toe), в рамках которого вы сможете применить полученные знания и собрать своё первое мини-приложение на React. From 4488d86b4bfeb5c65c32ad7a5043b21e0cb7b8f7 Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Thu, 4 May 2023 10:32:46 +0300 Subject: [PATCH 06/13] Apply suggestions from code review Co-authored-by: Nick Tishkevich --- src/content/learn/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index e14bdc22e..f80c35d34 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -22,7 +22,7 @@ title: Quick Start Приложения на React собираются из *компонентов*. Компонент — это часть пользовательского интерфейса, у которого есть собственная логика и внешность. Компонент может быть маленьким, как кнопка, или большим, как целая страница. -Компоненты React — это функции JavaScript, которые возвращают разметку: +React-компоненты — это функции JavaScript, которые возвращают разметку: ```js function MyButton() { @@ -114,7 +114,7 @@ React не ограничивает вас в том, как добавлять ## Отображение данных {/*displaying-data*/} -Фигурные скобки внутри JSX-разметки позволяют использовать JavaScript, например для того чтобы отобразить свою переменную пользователю. Код ниже отобразит `user.name`: +Фигурные скобки внутри JSX-разметки позволяют использовать JavaScript, например, для того, чтобы отобразить свою переменную пользователю. Код ниже отобразит `user.name`: ```js {3} return ( @@ -295,11 +295,11 @@ function MyButton() { } ``` -Заметьте: у `onClick={handleClick}` нет скобок в конце! Не _вызывайте_ функцию обработчика событий: вам нужно просто ее *передать*. React вызовет ваш обработчик событий, когда пользователь кликнет по кнопке. +Заметьте: у `onClick={handleClick}` нет скобок в конце! Не _вызывайте_ функцию обработчика событий: вам нужно просто её *передать*. React вызовет ваш обработчик событий, когда пользователь кликнет по кнопке. ## Обновление экрана {/*updating-the-screen*/} -Вам может понадобиться, чтобы компонент «помнил» какую-то информацию и отображал её. Например, вы хотите посчитать сколько раз была нажата кнопка. Чтобы это сделать, добавьте *состояние* в ваш компонент. +Вам может понадобиться, чтобы компонент «помнил» какую-то информацию и отображал её. Например, вы хотите посчитать сколько раз была нажата кнопка. Для этого добавьте *состояние* в ваш компонент. Сначала импортируйте [`useState`](/reference/react/useState) из React: @@ -317,7 +317,7 @@ function MyButton() { `useState` вернет вам две вещи: текущее состояние (`count`) и функцию (`setCount`), которая обновляет его. Можно именовать их как вам угодно, но такого рода вещи принято называть `[something, setSomething]`. -При первом показе кнопка `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Чтобы изменить состояние, вызовите `setCount()` и передайте туда новое значение. Клик на эту кнопку будет увеличивать счётчик: +При первом показе кнопка `count` будет иметь значение `0`, потому что вы передали `0` в `useState()`. Для изменения состояния вызовите `setCount()` и передайте туда новое значение. Клик на эту кнопку будет увеличивать счётчик: ```js {5} function MyButton() { @@ -382,7 +382,7 @@ button { ## Использование хуков {/*using-hooks*/} -Функции, которые начинаются с `use`, называются *хуками*. `useState` — это встроенный в React хук. В [справочнике API](/reference/react) приводятся другие встроенные хуки. Также, вы можете писать свои собственные хуки, совмещая их с уже существующими. +Функции, которые начинаются с `use`, называются *хуками*. `useState` — это встроенный хук в React. В [справочнике API](/reference/react) приводятся другие встроенные хуки. Также, вы можете писать свои собственные хуки, совмещая их с уже существующими. У хуков больше ограничений, чем у других функций. Хуки могут вызываться только *в начале* ваших компонентов (или других хуков). Если вам нужен `useState` в условии или цикле, выделите новый компонент и используйте его там. @@ -392,7 +392,7 @@ button { - + В начале у каждого `MyButton` состояние `count` равно `0` @@ -428,7 +428,7 @@ button { -Теперь, когда вы нажимаете на любую из кнопок, `count` в `MyApp` будет менять своё значение, что в свою очередь повлечёт обновление счётчиков в обоих компонентах `MyButton`. Вот как это можно прописать в коде. +Теперь, когда вы нажимаете на любую из кнопок, `count` в `MyApp` будет менять своё значение, что в свою очередь повлечёт обновление счётчиков в обоих компонентах `MyButton`. Вот как это можно выразить в коде. Сначала *переместите вверх состояние* из `MyButton` в `MyApp`: @@ -489,7 +489,7 @@ function MyButton({ count, onClick }) { } ``` -Когда вы нажимаете на кнопку, срабатывает обработчик `onClick`. В каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, таким образом, исполняется код этой функции. Этот код вызывает `setCount(count + 1)`, тем самым увеличивая переменную состояния `count`. Новое значение `count` передается в качестве пропа каждой кнопке, таким образом все кнопки будут показывать это новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов. +Когда вы нажимаете на кнопку, срабатывает обработчик `onClick`. В каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, таким образом, исполняется код этой функции. Этот код вызывает `setCount(count + 1)`, тем самым увеличивая переменную состояния `count`. Новое значение `count` передаётся в качестве пропа каждой кнопке, таким образом все кнопки будут показывать это новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов. From c2c7f12a26ded59002f62fcf1d7c0260cebc4dd5 Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Thu, 4 May 2023 10:51:25 +0300 Subject: [PATCH 07/13] Small fixes that I couldn't add via suggestions UI --- src/content/learn/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index f80c35d34..56e417998 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -5,6 +5,7 @@ title: Quick Start Добро пожаловать в документацию React! Эта страница познакомит вас с большинством концепций React, которыми вы будете пользоваться каждый день. + @@ -246,7 +247,7 @@ return ( ); ``` -Обратите внимание, что у `
  • ` есть атрибут `key`. Для каждого элемента списка вам нужно задавать ключ в виде строки или числа, который позволит однозначно определить этот элемент среди остальных в списке. Обычно этот ключ берется из ваших данных, например, ключом может быть идентификатор из базы данных. React использует информацию о ключах, чтобы понимать, что случилось, если вы добавите, удалите или переупорядочите элементы. +Обратите внимание, что у `
  • ` есть атрибут `key`. Для каждого элемента списка вам нужно задавать ключ в виде строки или числа, который позволит однозначно отделить этот элемент от остальных в списке. Обычно этот ключ берется из ваших данных, например, это может быть идентификатор из базы данных. React использует эти ключи при добавлении, удалении или изменении порядка элементов. From 05c1a1e855c3c3b6d1c1ec64701e5effae8d4b40 Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Wed, 14 Jun 2023 22:29:13 +0300 Subject: [PATCH 08/13] Update src/content/learn/index.md Co-authored-by: Nick Tishkevich --- src/content/learn/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index 56e417998..79a131465 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -111,7 +111,7 @@ function AboutPage() { } ``` -React не ограничивает вас в том, как добавлять CSS-файлы. В самом простом случае вы добавляете тэг [``](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять, как добавить CSS-файл в ваш проект. +React не ограничивает вас в том, как добавлять CSS-файлы. В самом простом случае вы добавите тег [``](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять как добавить CSS-файл в ваш проект. ## Отображение данных {/*displaying-data*/} From 24524ad69b88380a7db3dbf6fd9e15a946ae0aec Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Sun, 18 Jun 2023 10:41:01 +0300 Subject: [PATCH 09/13] Update src/content/learn/index.md --- src/content/learn/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index 79a131465..578e28a27 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -102,7 +102,7 @@ function AboutPage() { ``` -В отдельном CSS-файле вы прописываете для него стили. +В отдельном CSS-файле вы пишете для него CSS-правила: ```css /* В вашем CSS */ From 8a7139d8a2bba3470b8db508507c06e18dd7e42b Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Sun, 18 Jun 2023 10:42:04 +0300 Subject: [PATCH 10/13] Update src/content/learn/index.md --- src/content/learn/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index 578e28a27..aff875623 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -96,7 +96,7 @@ function AboutPage() { ## Добавление стилей {/*adding-styles*/} -В React CSS-классы объявляются с помощью свойства `className`. Оно работает аналогично HTML-аттрибуту [`class`](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Global_attributes/class): +В React CSS-классы объявляются с помощью свойства `className`. Оно работает аналогично HTML-атрибуту [`class`](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Global_attributes/class): ```js From a0c663988a4674d1533544e24d2f9625d6873dbd Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Sun, 18 Jun 2023 12:40:37 +0300 Subject: [PATCH 11/13] Update index.md --- src/content/learn/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index aff875623..f4d86d9fa 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -96,7 +96,7 @@ function AboutPage() { ## Добавление стилей {/*adding-styles*/} -В React CSS-классы объявляются с помощью свойства `className`. Оно работает аналогично HTML-атрибуту [`class`](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Global_attributes/class): +В React CSS-классы объявляются с помощью `className`. Оно работает аналогично HTML-атрибуту [`class`](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Global_attributes/class): ```js @@ -476,7 +476,7 @@ export default function MyApp() { } ``` -Информация, которую вы передаёте таким образом, называется _пропсами_. Теперь у компонента `MyApp` есть состояние `count` и обработчик событий `handleClick`, *которые передаются в качестве пропсов* каждой кнопке. +Информация, которую вы передаёте таким образом, называется _пропсами_. Теперь у компонента `MyApp` есть состояние `count` и обработчик событий `handleClick`, *которые он передаёт в качестве пропсов* каждой кнопке-потомку. Наконец, измените компонент `MyButton` так, чтобы он *считывал* пропсы, переданные от своего родителя: @@ -490,7 +490,7 @@ function MyButton({ count, onClick }) { } ``` -Когда вы нажимаете на кнопку, срабатывает обработчик `onClick`. В каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, таким образом, исполняется код этой функции. Этот код вызывает `setCount(count + 1)`, тем самым увеличивая переменную состояния `count`. Новое значение `count` передаётся в качестве пропа каждой кнопке, таким образом все кнопки будут показывать это новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов. +При нажатии на кнопку срабатывает обработчик `onClick`. Каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, поэтому выполняется соответствующий код. Этот код вызывает функцию `setCount(count + 1)`, увеличивая значение состояния `count`. Новое значение `count` передается каждой кнопке в качестве пропа, поэтому они все отображают новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов. From 44f9d55fe6dd88e8f9b3c6d261eb1acc9d28190e Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Sun, 18 Jun 2023 12:46:19 +0300 Subject: [PATCH 12/13] Update index.md --- src/content/learn/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index f4d86d9fa..d3557b057 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -111,7 +111,7 @@ function AboutPage() { } ``` -React не ограничивает вас в том, как добавлять CSS-файлы. В самом простом случае вы добавите тег [``](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять как добавить CSS-файл в ваш проект. +React не ограничивает вас в том, как добавлять CSS-файлы. В самом простом случае вы добавите тег [``](https://developer.mozilla.org/ru-RU/docs/Web/HTML/Element/link) в ваш HTML-файл. Если вы используете инструмент для сборки или фреймворк, обратитесь к его документации, чтобы понять, как добавить CSS-файл в ваш проект. ## Отображение данных {/*displaying-data*/} From 7fcb67c8b03e9ea48f5c802d4b10bcddbfdd38e7 Mon Sep 17 00:00:00 2001 From: Pavel Zenov Date: Mon, 19 Jun 2023 08:18:13 +0300 Subject: [PATCH 13/13] Update src/content/learn/index.md Co-authored-by: Nick Tishkevich --- src/content/learn/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/learn/index.md b/src/content/learn/index.md index d3557b057..d1d8f83de 100644 --- a/src/content/learn/index.md +++ b/src/content/learn/index.md @@ -490,7 +490,7 @@ function MyButton({ count, onClick }) { } ``` -При нажатии на кнопку срабатывает обработчик `onClick`. Каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, поэтому выполняется соответствующий код. Этот код вызывает функцию `setCount(count + 1)`, увеличивая значение состояния `count`. Новое значение `count` передается каждой кнопке в качестве пропа, поэтому они все отображают новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов. +При нажатии на кнопку срабатывает обработчик `onClick`. Каждой кнопке в качестве значения пропа `onClick` задана функция `handleClick` из `MyApp`, поэтому выполняется соответствующий код. Этот код вызывает функцию `setCount(count + 1)`, увеличивая значение состояния `count`. Новое значение `count` передаётся каждой кнопке в качестве пропа, поэтому они все отображают новое значение. Это называется "подъёмом состояния вверх". Поднимая состояние вверх, вы делаете его общим для всех компонентов.