Гузариш ба мундариҷа
Мавзӯи 2 аз 5
Назария

Props и списки

Компонент как функция с параметрами

Компонент, который всегда показывает одно и то же, мало полезен. Настоящая сила — в props (properties, свойства): данные, которые родитель передаёт компоненту, как аргументы функции. Один компонент ProductCard может показать тысячу разных товаров.

function Greeting(props) {
  return <p>Привет, {props.name}!</p>;
}

<Greeting name="Аня" />        // props = { name: "Аня" }
<Greeting name="Тимур" />      // props = { name: "Тимур" }

Props записываются как атрибуты. Строки — в кавычках, всё остальное — в фигурных скобках:

<Product title="Наушники" price={1990} inStock={true} tags={["audio", "new"]} onBuy={handleBuy} />

Можно передать что угодно: числа, массивы, объекты и даже функции.

Деструктуризация

Писать props. перед каждым свойством утомительно, поэтому props почти всегда сразу раскладывают в параметрах (это деструктуризация из курса JavaScript):

function Product({ title, price, inStock = true }) {
  return (
    <div className="product">
      <h3>{title}</h3>
      <p>{price} ₽</p>
      {!inStock && <p className="out">Нет в наличии</p>}
    </div>
  );
}

inStock = true — значение по умолчанию, если prop не передали.

Props только для чтения

Компонент не меняет свои props. Они принадлежат родителю: если нужно что-то поменять, родитель передаст новые значения, и React перерисует компонент. Менять можно только своё состояние — о нём в следующей теме.

children

Всё, что написано между открывающим и закрывающим тегом компонента, приходит в prop children. Так делают обёртки — карточки, модальные окна, разметку страницы:

function Card({ title, children }) {
  return (
    <section className="card">
      <h2>{title}</h2>
      {children}
    </section>
  );
}

<Card title="О нас">
  <p>Мы делаем лучшие курсы.</p>
  <button>Подробнее</button>
</Card>

Списки: map

Чтобы показать массив, его превращают в массив JSX-элементов методом map — React умеет рисовать массивы элементов:

const fruits = ["яблоко", "банан", "вишня"];

function FruitList() {
  return (
    <ul>
      {fruits.map((fruit) => (
        <li key={fruit}>{fruit}</li>
      ))}
    </ul>
  );
}

Зачем нужен key

Каждый элемент списка получает key — уникальный и постоянный идентификатор среди соседей. По нему React понимает, какой элемент какому соответствует между перерисовками: что добавилось, что удалилось, что переехало. Без key React выдаёт предупреждение в консоль и может перепутать состояние элементов (например, введённый текст «прыгнет» в соседнюю строку).

{users.map((user) => <UserRow key={user.id} user={user} />)}

Лучший key — id из данных. Индекс массива (key={index}) — плохой вариант, если элементы можно удалять или переставлять: индексы сдвигаются, и смысл ключа теряется.

Фильтрация и сортировка перед map

Данные готовят обычным JavaScript до return, а в JSX только выводят результат:

function Leaders({ players }) {
  const top = [...players]
    .filter((p) => p.score > 0)
    .sort((a, b) => b.score - a.score)
    .slice(0, 3);

  if (top.length === 0) return <p>Пока никого</p>;

  return (
    <ol>
      {top.map((p) => (
        <li key={p.id}>{p.name} — {p.score}</li>
      ))}
    </ol>
  );
}

[...players] — копия: sort меняет массив на месте, а props трогать нельзя.

Итог

  • Props — данные от родителя: <Comp name="Аня" age={20} /> → function Comp({ name, age }).
  • Props только читаем; значения по умолчанию — в деструктуризации.
  • children — содержимое между тегами компонента.
  • Списки — array.map(... => <li key={id}>...</li>), key уникален и постоянен; данные готовим до return.

Приветствие

Осон+10 XP

Напиши компонент Greeting, который получает prop name и показывает <p>Hello, имя!</p>.

<Greeting name="Ann" />  →  <p>Hello, Ann!</p>

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.