Irbisa · Шпаргалка

Основы React

JSX, компоненты, props, children и композиция, условный рендер, списки и key, однонаправленный поток данных, основы React 19

Junior-разработчик · 21 вопрос

  1. 01

    Что такое React и что значит, что React декларативный?

    React представляет собой JavaScript-библиотеку для построения интерфейсов из компонентов.

  2. 02

    Что такое virtual DOM и делает ли он React быстрее реального DOM?

    Virtual DOM представляет собой дерево обычных JavaScript-объектов (React-элементов), которое возвращают ваши компоненты.

  3. 03

    Что такое JSX и во что он компилируется?

    JSX представляет собой расширение синтаксиса, которое позволяет писать разметку прямо в JavaScript.

    import { jsxs as _jsxs } from 'react/jsx-runtime'; const name = 'Ada'; // What you writeconst written = <h1 className="title">Hello, {name}</h1>;…
  4. 04

    Что такое компонент в React и почему его имя должно начинаться с заглавной буквы?

    Компонент представляет собой JavaScript-функцию, которая принимает пропсы и возвращает JSX.

    interface AvatarProps {  name: string;  url: string;} function Avatar({ name, url }: AvatarProps) {…
  5. 05

    Чем классовые компоненты отличаются от функциональных и осталось ли что-то, для чего ещё нужен класс?

    Классовый компонент наследует React.Component, хранит стейт в this.state и реагирует на монтирование и обновления в методах жизненного цикла; функциональный компонент является обычной функцией с хуками.

    import { Component, useState } from 'react'; // class: one state object that setState merges into; handlers need `this`export class ClassCounter extends Component<{ step: number }, { count: number }> {  state = { count: 0 };…
  6. 06

    Что такое пропсы и почему компонент не может менять свои пропсы?

    Пропсы (props) представляют собой входные данные, которые родитель передаёт ребёнку, как аргументы функции.

  7. 07

    Чем пропсы отличаются от стейта?

    Пропсы компонент получает от родителя и не может их менять; стейт (состояние) принадлежит самому компоненту, и он меняет его через сеттер, например тот, что возвращает useState.

  8. 08

    Что такое проп children и почему React предпочитает композицию наследованию?

    children содержит JSX, вложенный между открывающим и закрывающим тегами компонента, и приходит в компонент как проп.

    import type { ReactNode } from 'react'; interface CardProps {  title: string;  footer?: ReactNode;  children: ReactNode;…
  9. 09

    Какими способами можно рендерить что-то по условию в JSX?

    Обычным JavaScript: if с ранним return до JSX, тернарный оператор `cond ?

    interface InboxProps {  loading: boolean;  error?: string;  unread: number;  isAdmin: boolean;}…
  10. 10

    Как отрендерить список в React и зачем каждому элементу нужен key?

    Массив превращают в JSX через map: `items.map(item => <Row key={item.id} ...

    interface Todo {  id: string;  title: string;  done: boolean;}…
  11. 11

    Что такое Fragment и когда он нужен?

    Fragment, который пишут как <>...</> или <Fragment>, группирует несколько элементов, не добавляя DOM-узел.

    import { Fragment } from 'react'; interface Term {  id: string;  word: string;  meaning: string;…
  12. 12

    Как начать новый React-проект в 2026 году и почему create-react-app объявлен устаревшим?

    Берут фреймворк вроде Next.js или React Router, когда нужны роутинг, загрузка данных и SSR, или Vite для чисто клиентского приложения.

  13. 13

    Что отрендерит этот компонент при пустой корзине и как это исправить?

    interface CartProps {  items: string[];} export function Cart({ items }: CartProps) {  return (    <div>      <h2>Cart</h2>      {items.length && <p>{items.length} items in your cart</p>}    </div>  );}

    При пустой корзине под заголовком появится лишний 0.

  14. 14

    Найдите баг: после удаления первой строки заметка, набранная в ней, оказывается в следующей строке.

    import { useState } from 'react'; function Row({ title }: { title: string }) {  const [note, setNote] = useState('');  return (    <li>      {title} <input value={note} onChange={(e) => setNote(e.target.value)} />    </li>  );} export function List({ items }: { items: { id: string; title: string }[] }) {  return <ul>{items.map((item, index) => <Row key={index} title={item.title} />)}</ul>;}

    Список использует индекс массива как key.

  15. 15

    Что такое однонаправленный поток данных в React и как дочерний компонент передаёт данные родителю?

    Данные текут сверху вниз: родитель передаёт значения детям через пропсы, и дети не могут их менять.

    import { useState } from 'react'; interface FilterProps {  value: string;  onChange: (value: string) => void;}…
  16. 16

    Почему React-компонент должен быть чистым и что считается побочным эффектом во время рендера?

    React может вызвать компонент много раз, в любом порядке или выбросить рендер (StrictMode, конкурентный рендеринг), поэтому рендер только вычисляет JSX из пропсов, стейта и контекста.

    let renderCount = 0; // wrong: mutates a module variable during renderexport function CupBad({ guest }: { guest: number }) {  renderCount++;  return <h2>Tea cup #{renderCount} for guest {guest}</h2>;…
  17. 17

    Найдите баг: поле поиска теряет фокус после каждого нажатия клавиши.

    import { useState } from 'react'; export function SearchPage() {  const [query, setQuery] = useState('');   function SearchBox() {    return <input value={query} onChange={(e) => setQuery(e.target.value)} />;  }   return (    <main>      <SearchBox />      <p>Results for {query}</p>    </main>  );}

    SearchBox объявлен внутри SearchPage, поэтому каждый рендер создаёт новую функцию, и React видит в ней новый тип компонента.

  18. 18

    Что ломается, если вызвать компонент как функцию, {Row({ item })}, вместо того чтобы отрендерить его как <Row item={item} />?

    import { useState } from 'react'; type Item = { id: string; title: string; details: string }; function Row({ item }: { item: Item }) {  const [open, setOpen] = useState(false);  return (    <li onClick={() => setOpen(!open)}>      {item.title} {open && item.details}    </li>  );} export function List({ items }: { items: Item[] }) {  return <ul>{items.map((item) => Row({ item }))}</ul>;}

    Row перестаёт быть компонентом: React его не видит, поэтому его useState становится хуком List, по одному на каждый элемент.

  19. 19

    Каким хукам соответствуют методы жизненного цикла классов и у каких из них нет прямого аналога среди хуков?

    componentDidMount, componentDidUpdate и componentWillUnmount сливаются в один useEffect с функцией очистки, shouldComponentUpdate превращается в memo, а стейт из конструктора переходит в useState.

    import { Component, useEffect } from 'react'; // before: three lifecycle methods keep one connection in syncexport class ChatRoomClass extends Component<{ roomId: string }> {  connection = createConnection(this.props.roomId);…
  20. 20

    Что изменилось в React 19 из того, что заметно в повседневном коде компонентов?

    React 19 (декабрь 2024) сделал ref обычным пропсом, поэтому forwardRef больше не нужен, и добавил Actions с useActionState, useFormStatus и useOptimistic, API use, <Context> в роли провайдера и поддержку <title> и <meta> внутри компонентов.

    import type { ComponentProps } from 'react'; // React 19: ref arrives as a normal prop, no forwardRef wrapperfunction TextInput({ ref, ...props }: ComponentProps<'input'>) {  return <input ref={ref} className="input" {...props} />;}…
  21. 21

    Когда React сохраняет стейт компонента, когда сбрасывает его и как с помощью key принудительно его сбросить?

    React привязывает стейт к позиции компонента в дереве.

    import { useState } from 'react'; function ChatInput({ contact }: { contact: string }) {  const [draft, setDraft] = useState('');  return (    <textarea…