React, Redux, Router Flashcards

1
Q

Что такое React?

A

Это фронтенд библиотека. Она основана на JavaScript и поддерживается компанией Facebook. Главным предназначением этой библиотеки является предоставление разработчикам универсального UI для многократного использования.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Перечислите особенности React?

A

Ключевые особенности:
- Virtual DOM вместо реального DOM
- Быстрота и масштабируемость
- JSX
- React легко интегрируется с другими библиотеками

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое Virtual DOM? Как он работает с React?

A

Virtual DOM - легковесный JS объект, который представляет копию реального DOM дерева. Позволяет на много быстрее взаимодействовать со страницей, так как операции с реальным DOM с точки зрения производительности - сильно дороже.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Разница между управляемыми (controlled) и не управляемыми (uncontrolled) компонентами?

A

Управляемый компонент имеет состояние и через него как раз происходит “контроль” этого компонента. Например текст в строке ввода.

Не управляемый компонент - не имеет состоянием и поэтому нет возможности контролировать что в нём происходит.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Для чего нужен атрибут key при рендере списков?

A

Используя ключи React определяет какие элементы были изменены, добавлены, передвинуты. Более оптимально происходит рендер.

В качестве ключей лучше всего использовать уникальные значения, например ID. Индексы использовать не рекомендуется, так как они привязаны не к элементам, а к их положению в массиве. А оно может измениться.

Ключ должен быть уникальным среди своих соседей. В двух разных списках ключи могут повторяться.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Разница между состоянием и пропсами?

A

State не зависит от других компонентов и является внутренним состоянием компонента.

Props поступают в компонент снаружи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое JSX?
Какие у него ограничения?

A

JSX - это диалект языка JavaScript, с помощью которого удобно производить элементы React. Его особенность в том что можно писать HTML прямо в JS файле.

Важные моменты при использовании JSX:

  1. Возврат единственного корневого элемента.
  2. Все теги должны быть явно закрыты.
  3. Использование camelCase в именовании атрибутов.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое фрагмент (Fragment)? Почему фрагмент лучше, чем div?

A

Фрагменты позволяют группировать список дочерних элементов без добавления лишних узлов в DOM. Это полезно, когда нужно вернуть несколько элементов из компонента, но нужно избежать оборачивания их в дополнительный контейнер, такой как <div>.

<></> или <Fragment></Fragment>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Разница между элементом и компонентом?

A

Элемент в React — это объект, описывающий, что должно быть отображено на экране (например, <h1>Hello, world!</h1>). Элементы являются строительными блоками интерфейса.

Компонент в React — это функция или класс, принимающий пропсы и возвращающий элементы. Компоненты могут быть переиспользуемыми частями интерфейса, которые могут содержать один или несколько элементов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что такое React-ссылка (ref)? Как создать ссылку?

A

Атрибут, который позволяет получить доступ к конкретному элементу DOM дерева.

Это нужно для вызова анимации, задание фокуса и выделения текста, взаимодействия с этим элементом сторонними библиотеками.

В классовом компоненте:

В конструкторе создаётся ссылка: this.ref = React.createRef()

Закрепление за элементом: <div ref={this.ref} />

Ссылка будет каждый рендер новая.

В функциональном компоненте:

Хуком создаётся ссылка: const ref = useRef()

Закрепление за элементом: <div ref={ref} />

В объекте ref всего одно свойство - current. И в нём хранится ссылка на элемент DOM.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое контекст (Context)?
Как с ним работать?

A

Context - способ передачи данных по дереву компонентов без необходимости передавать пропсы на каждом уровне. Используется для аутенфикации, темы или языка.

Использование происходит в 3 этапа:

  1. Создание контекста
    const ThemeContext = React.createContext(defaultValue);
  2. Предоставление контекста (Provider)
    Обернуть компоненты в Provider.
    В value передать контекст.
       return (
         <ThemeContext.Provider value={theme}>
           <Page />
         </ThemeContext.Provider>
       );
  3. Потребление контекста (Consumer)
    В классовом компоненте использовать свойство объекта контекста Consumer. Внутри него сделать функцию, которая в качестве аргумента получает значение контекста:
       return (
         <MyContext.Consumer>
           {value => <div>{value}</div>}
         </MyContext.Consumer>
       );

В функциональном компоненте воспользоваться хуком useContext()
const value = useContext(SomeContext).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Могут ли веб-браузеры читать JSX?

A

Нет, не могут.

Под капотом JSX превращается в обычный JS, а элементы становятся объектами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

В чём различие между React JS и React Native?

A

React JS - для веба.

React Native - для мобильных приложений.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое компоненты?

A

Компонентыв React JS представляют из себяфункциив JavaScript. Они делят пользовательский интерфейс React на отдельные части и позволяют разработчику повторно использовать его в любой момент.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое Props?

A

Propsот слова Properties (свойства). Это способ передать данные от родительских компонентов к ребёнку.

Важная особенность заключается в одном направлении данных, которые передаются через пропсы. Только сверху вниз. Изменять пропс в дочернем компоненте - нельзя.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое State? Как его изменить?

A

Это внутреннее состояние компонента.

В классовом компоненте:
Начальное состояние задаётся в конструкторе через указание this.state.
Последующие значения состояние указываются через this.setState().

В функциональном компоненте:
Используется хук useState()
const [state, setState] = useState(initialState)
Возвращает значение текущего состояния и функцию для его изменения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Зачем в setState() нужно передавать функцию?

A

В качестве аргумента для setState может быть коллбек. Это нужно, когда новое состояние зависит от старого (state ⇒ {…}).

Связанно это с тем что setState выполняется асинхронно.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Как в React обрабатать пользовательские события?
Что такое синтетические события?

A

Обработка событий происходит обработчиками, которые можно прикрепить к JSX-элементам. В них передаётся функция.

Под капотом используются синтетические события, которые работают так же как и обычные, имеют тот же интерфейс, однако решают проблему кроссбраузерности.

Нативные события можно получить напрямую из синтетических событий, используя атрибут nativeEvent.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Как создать обработчик события в React? И в чём будут ключевые отличия от HTML?

A

Синтаксис:

  • В HTML имя события обычно пишется с использованием строчных букв:<button onclick="activateLasers()"></button>
  • В React имя события следует соглашению camelCase:<button onClick={activateLasers}></button>

Предотвращения стандартного поведения:

  • В HTML можно вернуть false, чтобы предотвратить стандартное поведение:<a href="#" onclick='console.log("The link was clicked."); return false;'></a>
  • В React необходимо явно вызвать preventDefault():
    jsx
      function handleClick(event) {
        event.preventDefault();
        console.log("The link was clicked.");
      }
      <a href="#" onClick={handleClick}></a>
     

Вызов функции:

  • В HTML необходимо вызывать функцию, добавляя () к ее имени:<button onclick="activateLasers()"></button>
  • В React не нужно добавлять () к имени функции:<button onClick={activateLasers}></button>
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Какие стадии жизненного цикла компонента существуют в React?

A

Глобально жизненный цикл можно разделить на 3 основных стадии:

  1. Монтирование
    1. constructor
    2. render
    3. componentDidMount
  2. Обновление
    1. shouldComponentUpdate
    2. componentDidUpdate
  3. Размонтирование
    1. componentWillUnmount
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

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

A

render— единственный обязательный метод в классовом компоненте. При вызове он проверяет this.props и this.state и возвращает JSX для отображения компонента.

constructor- инициализация состояния. Вызывается до того как смонтируется компонент. В начале конструктора необходимо вызывать super(props). Если это не сделать, this.props не будет определён. Это может привести к багам.

componentDidMount- вызывается сразу после монтирования. Отлично подходит для сетевых запросов и создания подписок на события. Так же тут можно работать с DOM.

componentDidUpdate - вызывается сразу после обновления. Позволяет работать с DOM при обновлении компонента. Так же удобен для выполнения сетевых запросов, которые выполняются на основе сравнения текущих пропсов с предыдущими.

shouldComponentUpdate - используется для повышения производительности и избегания лишних перерисовок.

componentWillUnmount- вызывается непосредственно перед размонтированием компонента. В этом методе выполняется необходимый сброс: отмена таймеров, сетевых запросов и подписок.

componentDidCatch - вызывается после возникновения ошибки у компонента-потомка.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Что такое Компонент высшего порядка?

A

Это функция, которая в качестве аргумента принимает компонент, добавляет ему новый функционал и возвращает новый компонент.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Что такое React хуки (Hooks)?

A

Функции, которые добавили возможность в функциональных компонентах зацепляться за состояние и методы жизненного цикла. Хуки не работают внутри классов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Что такое синтетические события в React?

A

Обёртка обычных событий, которая ведёт себя так же как обычные события, но при этом не имеет проблем с кроссбраузерностью.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Что такое условный рендеринг (Conditional Rendering)? Как его выполнить?

A

Возможность отрисовки компонентов на основании каких-то условий.

Обычно делается использованием тернарного оператора или логического И.

cond ? var 1 : var2

var1 && var2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Как в React типизировать пропсы?

A

PropTypes.

Создаётся два объекта. Для типов и для значения по умолчанию.
propTypes - типы пропсов

Компонента.propTypes = {
	prop1: PropTypes.string,
	prop2: PropTypes.number.isRequered // isRequered - пометка что он обязателен
}

defaultProps - значения по умолчанию

Компонента.defaultProps = {
	prop2: 2,
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Что такое «бурение пропсов» (Prop Drilling)? Как его избежать?

A

Когда пропс передаётся через несколько уровней компонентов.

Избежать - использовать контекст или стейт-менеджеры, например redux.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Что нельзя делать в методе render?

A
  1. Нельзя изменять состояние компонента. Например делать вызов (setState).
  2. Компонента должна быть чистой функцией.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Разница между рендерингом и монтированием?

A

Рендеринг происходит при каждом изменении.

Монтирование - это первый рендеринг.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Что такое сhildren?

A

Возможность получить элемент, который находится в компоненте-контейнере в виде пропса.

function Container({ children }) {
  return (
    <div className="container">
      {children}
    </div>
  );
}

function App() {
  return (
    <Container>
      <p>Child</p>
    </Container>
  );
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Что такое «ленивая» (Lazy) функция?
С чем обычно используется?

A

Функция, которая используется для отложенного импорта компонентов. Позволяет загружать компонент только тогда, когда он понадобился, а не при первой загрузке.

Для отображения процесса загрузки, пока ленивый компонент загружается - используется компонент <Suspense>. Пока идёт загрузка - будет отображать то, что указано в пропе fallback.

const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Поддерживает ли функция lazy именованные экспорты?

A

Нет - lazy функция может выполнять только импорт “по умолчанию”

При необходимости можно сделать транзитный компонент.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Как в React реализовать двустороннее связывание данных?

A

Двухстороннее связывание это когда изменения в пользовательском интерфейсе автоматически отражаются в состоянии компонента, и наоборот, изменения в состоянии компонента автоматически отражаются в пользовательском интерфейсе.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Разница между классовым и функциональным компонентами?

A

Разный синтаксис.

Классовые компоненты имеют методы жизненного цикла, в функциональных компонентах часть из них можно реализовать через useEffect.

В классовых компонентах надо использовать this.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

Расскажите про хук useEffect.

A

Используется для побочных эффектов.

С помощью него можно реализовать методы жизненного цикла componentDidMount, componentDidUpdate и componentWillUnmount.

useEffect(() => {
  // Код эффекта
  return () => {
    // Очистка эффекта (необязательно)
  };
}, [dependencies]);

В массиве зависимостей можно указать значения, изменение которых будет вызывать срабатывание эффекта.

Если указать пустой массив зависимостей - эффект сработает 1 раз при монтировании.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

Расскажите про хук useLayoutEffect.

A

У него точно такой же API как у useEffect. Разница в том, что useLayoutEffect срабатывает до появления элемента на экране.

Основные случаи использования useLayoutEffect:

  1. Чтение и изменение DOM перед отрисовкой.
    Если нужно измерить размеры или позицию элементов и затем сразу же применить изменения, чтобы избежать мерцания.
  2. Синхронные эффекты.
    Если эффект должен быть выполнен синхронно, а не асинхронно, чтобы избежать промежуточных состояний.
  3. Обновление рефов.
    Если нужно обновить рефы и сразу же выполнить действия с элементом.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Расскажите про хук useCallback.

A

Позволяет создать функцию, которая не будет повторно создаваться при каждом рендере, а будет изменяться только при изменении массива зависимостей.

const memoizedCallback = useCallback(func, [dependencies]);

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

Расскажите про хук useMemo.

A

Используется для мемоизации результата выполнения функции.

Результат будет получаться повторно только в случае изменения зависимостей.

const memoizedValue = useMemo(() => func(a, b), [a, b]);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

Расскажите про React.memo().

A

Это HOC. Используется для мемоизации рендера функциональной компоненты.

При решении нужно ли совершать повторный рендер происходит поверхностное сравнение пропсов. Если изменений нет, то React.memo предотвратит повторный рендер.

В качестве второго аргумента можно передать функцию сравнения, если нужно более сложное сравнение:

const MyComponent = memo(function MyComponent(props) {
  // Компонент
  return <div>{props.content}</div>;
}, (prevProps, nextProps) => {
  // Функция сравнения
  return prevProps.content === nextProps.content;
});

Как аргументы для этой функции используются предыдущие и будущие пропсы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Что делает метод shouldComponentUpdate?

A

Метод жизненного цикла, который используется для оптимизации.
Возвращая true или false, этот метод определяет, будет ли происходить повторный рендеринг компонента.
В качестве аргументов методу передаются будущие пропсы и будущее состояние.

Используя их возможно решить надо ли обновлять компонент.

shouldComponentUpdate(nextProps, nextState) {
    if (nextProps.someProp !== this.props.someProp) {
      return true; 
    }
    if (nextState.count !== this.state.count) {
      return true;
    }
    return false;
  }

Сравниваем будущие пропсы с текущими.
Если пропс изменился, то обновляем компонент (возвращаем true).
Если интересующие нас пропсы и состояние не изменились, не рендерим компонент (возвращаем false).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
41
Q

Разница между useEffect() и componentDidMount()?

A

Если не брать в расчёт что это хук и метод классового компонента, то componentDidMount() сработает до отображения компонента на экране, а useEffect() после.

Для исключения этой проблемы используется useLayoutEffect().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
42
Q

Что такое PureComponent?

A

Чистые компоненты — это компоненты, которые рендерят один и тот же вывод для одного и того же состояния и props.

В случае классовых компонентов:

PureComponent в React — это тип компонента, который автоматически реализует метод shouldComponentUpdate с поверхностным сравнением пропсов и состояния.

Его стоит использовать, когда пропсы и состояние компонента меняются редко или меняются предсказуемо.

Такая компонента должна наследоваться от React.PureComponent - class myComponent extends React.PureComponent { … }

В случае функциональных компонентов:

Используется React.memo().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
43
Q

Правила (ограничения) использования хуков?

A

Выполнять хуки следует в самом верху иерархии функции. Это нужно для гарантирования момента выполнения.

Вызывать можно только в функциональных компонентах или пользовательских хуках.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

В чем разница между useRef и createRef?

A

useRef - функциональный
createRef - классовый

createRef каждый раз создаёт новую ссылку

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
45
Q

Что такое поднятие состояния вверх (Lifting State Up)?

A

Это паттерн при котором

  • родительский компонент хранит “общее” состояние - свой и дочернего компонента.
  • родительский компонент передаёт дочернему функцию изменения состояния в качестве пропса
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
46
Q

Как реализовать однократное выполнение операции при начальном рендеринге?

A

useEffect с пустым массивом зависимости.

componentDidMount, если это классовый компонент.

47
Q

Какие типы данных может возвращать render?

A
  • React-элемент.
  • Массивы
  • Фрагменты (для обёртки нескольких элементов).
  • Порталы.
  • Строки и числа - автоматически обернутся в узел.
  • Булевы значения или null - полезно при условном рендре.
48
Q

Является ли React реактивным?

A

С одной стороны, если рассматривать реактивность как способность автоматически реагировать на изменение данных - он подходит.

С другой стороны существует мнение о том что из-за того что под капотом обновления интерфейсов могут собираться в пакеты - он не подходит.

49
Q

Что такое портал (Portal)?

A

Порталы позволяют рендерить компоненты вне текущего контейнера React. Это может быть полезно для модальных окон, всплывающих подсказок и других окон, которым надо быть поверх всего.

У портала сохраняется возможность получить контекст и пропсы. В коде он используется “внутри” других компонентов, но во время рендера оказывается “снаружи”.

Создать портал:
ReactDOM.createPortal(<>...</>, document.getElementById('modal-root'))
Первый аргумент: элемент, который будет использоваться в качестве портала.
Второй аргумент: DOM-контейнер, в который будет отрендерен.

50
Q

Как изменить state используя динамический ключ?

A

Обернуть setState в функцию.
В неё передать динамический ключ.
Объект в setState обновить по динамическому ключу:
{[key]: value}

	```
  handleChange = (e) => {
    const { name, value } = e.target;
    this.setState({
      [name]: value,
    });
  };
```
51
Q

Зачем делать eject?

A

Это команда предоставляет доступ к конфигурационным файлам и зависимостям CRA, которые по умолчанию скрыты.

Вернуться в обратное состояние обычной командой после этого нельзя.

52
Q

Как создать компоненты в React?

A

Есть два способа:

  • Классовый компонент
    Надо в методе render() вернуть разметку.
  • Функциональный компонент
    Достаточно вернуть нужную разметку из функции.
53
Q

Когда следует использовать классовые компоненты, а когда функциональные?

A

Всегда функциональные, за исключением двух случаев:

  1. Нужно использовать методы отлова ошибок, для которых пока не существует эквивалента в хуках
  2. Старая версия React, которая не поддерживает хуки.
54
Q

Расскажите про метод constructor().

A

Это метод классового компонента.

В начале надо вызвать super(props) - тогда в компоненте будет возможность обращаться к this.props.

Так же в нём обычно задаётся стартовое состояние через this.state - это единственное место, где можно изменить state напрямую. В остальных случаях только this.setState().

55
Q

В чем ключевое отличие между React и Angular?

A

React - библиотека для отрисовки приложения. Для другого функционала нужны другие решения (например для данных - Redux)

Angular - обширный фреймворк, где все решения есть в ядре (в коробке)

● Используя React - можно более гибко создавать приложения и более точечно управлять его частями
● Используя Angular - проще разрабатывать и поддерживать приложения

56
Q

Техники оптимизации перфоманса React?

A
  • PureComponent компоненты, shouldComponentUpdate, React.memo
  • React.Fragments
  • Throttling и Debouncing
  • Использование key
  • Мемоизация: useMemo, useCallback
57
Q

Разница между memo и useMemo?

A

memo - это HOC, для уменьшения количества ререндеров.

useMemo - это хук для мемоизации выполнения функции.

58
Q

Что такое компонент-переключатель (Switching Component)?

A

Паттерн который подразумевает отображение одного из нескольких компонентов в зависимости от условий.

Обычно делается через объект, которому в качестве значений передаются компоненты.

59
Q

Что такое «опрос» (Polling)? Как его реализовать в React?

A

Опрос - это периодическое обращение к серверу.

Реализуется через таймер в useEffect, в котором запускается функция на получение данных.

60
Q

Какой второй аргумент можно передать опционально в setState?

A

Коллбек, который будет вызываться после выполнения функции setState и отрисовки компонента.

61
Q

Почему React использует className вместо атрибута class?

A

Атрибут class является ключевым словом в JavaScript, а JSX это расширение JavaScript.

62
Q

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

A
  • componentDidMount, componentWillUnmount и componentDidUpdate
    Через useEffect.
    С пустым массивом зависимостей сработает 1 раз.
    То что будет в return выполнится при размонтировании.
    Обновление реализуется через массив зависимостей.
  • shouldComponentUpdate
    Через HOC React.memo.
  • componentDidCatch и getDerivedStateFromError
    Никак. Делается классовый компонент и в него помещается функциональный.
63
Q

Что такое предохранители (Error Boundaries)?
Когда предохранитель не поймает ошибку?

A

Это классовый компонент, который перехватывает ошибки, которые происходят в дочерних компонентах.

После этого отображает резервный UI и выводит сообщение об ошибки в консоль (или записывает в журнал).

Два ключевых метода componentDidCatch и static getDerivedStateFromError.

componentDidCatch - используется для логирования.

static getDerivedStateFromError - используется для обновления состояния компонента ({ hasError: true }) в случае ошибки.

В случае ошибки возвращается резервный UI - if (hasError) return <>Ошибка</>

Предохранитель не ловит ошибку

  • В обработчике событий
  • В асинхронном коде (используем try..catch)
  • При ошибке в самом предохранителе
64
Q

Что такое stateless компонент?

A

Компонент, поведение которого не зависит от состояния (и его у него нет).

65
Q

Что такое stateful компоненты?

A

Компонент у которого есть состояние. И следовательно его поведение зависит от этого состояния.

66
Q

Как использовать стили в React?

A

Атрибут style принимает объект где свойства написаны в camelCase и значения строки.

67
Q

Что такое React PropType array with shape?

A

Если нужно описать вид объекта, то можно использовать shape.

68
Q

Как построить название класса на условном выражении?

A

Через конкатенацию строк:

'btn-panel ' + (this.props.visible ? 'show' : 'hidden')

или через шаблонные строки:

btn-panel ${this.props.visible ? 'show' : 'hidden'}

69
Q

Как добавить несколько объектов стилей одному элементу?

A

Будет достаточно использовать spread.

style={{ ...styles1, ...styles2 }}

70
Q

Как установить фокус на элемент при загрузке страницы?

A

Нужно через ref получить ссылку на элемент, а через useEffect (или componentDidMount) применить focus() к этому элементу.

71
Q

Какова польза модулей стилей?

A

Возможность свободно использовать “своё” пространство имён, которое не пересечётся с всеми остальными модулями проекта.

72
Q

Что такое React Dev Tools?

A

Это инструмент, который позволяет разработчикам инспектировать и отлаживать иерархию компонентов React, включая их свойства (props) и состояние (state).

73
Q

Как обычно организуют файлы в React?

A

По типам файлов (их предназначению) или по целым компонентам.

74
Q

Как в PropTypes указать возможность использования нескольких типов?

A

Использовать метод oneOfType().

Component.propTypes = {
  size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};
75
Q

Можно ли импортировать файл SVG как компонент React?

A

Да, можно. Обычным импортом. Затем использовать как обычный компонент.

import { ReactComponent as MyLogo } from './my-logo.svg';
<MyLogo />
76
Q

Нужно ли держать всё состояние в Redux? Следует ли когда-либо использовать внутреннее состояние React?

A

Не обязательно. Если указанное состояние не нужно никому, кроме компонента, то логичнее использовать внутреннее состояние.

77
Q

Каково поведение непойманных ошибок в React?

A

Если ошибка не поймана - она размонтирует всё дерево компонентов.

Отсутствие UI лучше, чем неверно работающий UI.

78
Q

Правда ли, что React делает ре-рендер всех компонентов и дочерних компонентов каждый раз когда вызывается setState?

A

В том случае, если не используются техники оптимизации, то
setState вызовет повторный рендер компонента, а это вызовет повторный рендер всех дочерних компонентов.

79
Q

Как предотвратить ненужные обновления с использованием setState?

A

Если в колбеке, который используется в изменении состояния вернуть null, то изменение состояния не будет произведено. Тем самым не будет выполнен повторный рендер.

80
Q

Каков правильный способ размещения границ ошибок (error boundaries)?

A

Два основных варианта:

  1. Оборачивание маршрутов верхнего уровня.
  2. Оборачивание отдельных компонентов.
80
Q

Когда атрибуты компонента по умолчанию устанавливаются в true?

A

Если не указать значение атрибута или пропса, то он по умолчанию установится в true.

81
Q

Что такое компонент ожидания (suspense component)?

A

При использовании динамического импорта может быть так, что нужный компонент ещё не загрузился. Что бы отображать что-то во время загрузки используется компонент <Suspense>, которому в качестве атрибута fallback можно передать элемент, который будет отображаться, пока загружается внутренний компонент.

const OtherComponent = React.lazy(() => import("./OtherComponent"));

function MyComponent() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <OtherComponent />
      </Suspense>
    </div>
  );
}
82
Q

Что такое строгий режим (strict mode) в React? Почему строгий режим рендерит дважды в React?

A

Он активирует дополнительные проверки и предупреждения для всех потомков. Помогает выявлять потенциальные проблемы, такие как устаревшие жизненные циклы, использование устаревших методов и другие распространенные ошибки.

Рендеринг происходит дважды для обнаружения случайных побочных эффектов на этапе рендеринга.

83
Q

В какой момент жизненного цикла вы применяется AJAX запросы и почему?

A

В классовых компонентах это componentDidMount и componentDidUpdate, так как компонент уже присутствует в DOM.

Для функциональной компоненты это useEffect.

84
Q

Что такое React Reconciliation?

A

Механизм сверки посредством которого React обновляет DOM-дерево.

Когда состояние компонента изменяется, react должен рассчитать необходимость обновления DOM. Это делается с помощью создания виртуального DOM (с новым состоянием) и сравнения его с текущим DOM. Таким образом обновляются только те части, которые действительно обновились.

85
Q

[Redux] Общее описание работы Redux.

A

Всё состояние хранится в store.

Значение из store получаются через mapStateToProps и useSelector.

Состояние изменяется только через actions, которые вызывают функции reducer.

Изменения производятся функциями reducer.

Функции reducer должны быть чистыми функциями.

Что бы action были доступны компоненте используется mapDispatchToProps. В функциональных импортируются напрямую и вызываются с помощью useDispatch.

Событие на странице создает объект action

action передается в dispatch
dispatch передает action в middleware (опционально)

action попадает в функцию reducer

reducer возвращает новый объект состояния и передает его в state

state обновляется

перерисовывается UI

86
Q

[Redux] Каковы основные компоненты Redux?

A

Store - объект, который хранит всю информацию о состоянии приложения и является единственным источником истины.

Actions - объекты, которые описывают изменения состояния.

Reducers - чистые функции, которые принимают предыдущее состояние и действие, и возвращают новое состояние.

Dispatch - метод, который отправляет действие в store для изменения состояния.

Middleware - функции, которые могут изменять или перехватывать действия перед тем, как они достигнут reducers.

Immutable data - данные, которые не могут быть изменены напрямую, а только созданы новые копии с изменениями.

Предсказуемость (Predictability) - Redux позволяет легко отслеживать изменения состояния и предсказывать, как они будут влиять на приложение.

87
Q

[Redux] В чем разница между mapStateToProps() и mapDispatchToProps()?

A

mapStateToProps() - делает доступными значения из store в пропсах.

mapDispatchToProps() - делает доступными actions в пропсах.

88
Q

[Redux] Как создать и использовать store?

A

Создаётся объект store и в него передаётся объект с reducer.

const store = createStore(counterReducer);
Затем надо обернуть приложение в провайдер с доступом к этому store.

  <Provider store={store}>
    <App />
  </Provider>,
89
Q

[Redux] Как установить начальное состояние в Redux?

A

При создании store используется функция createStore().

Первый аргумент это reducer, второй это начальное состояние.

Или второй вариант это в функции reducer указать начальное состояние, как значение по умолчанию.

function reducer(state = initialState, action) { … }

90
Q

[Redux] Что такое действие (action) в Redux?

A

Это объект, который имеет тип (type) и может иметь payload.

91
Q

[Redux] Что такое reducer?

A

Простая чистая функция, принимающая state и action и модифицирующая state.

Должна возвращать новый объект

92
Q

[Redux] Можно ли вызвать действие в reducer?

A

Функция редьюсер должна быть чистой. Для этого можно использовать Thunk.

93
Q

[Redux] Как сделать AJAX запрос в Redux?

A

Использовать middleware redux-thunk.

Это возможно из-за того что у thunk есть доступ к dispatch и getState - в нём можно вызывать отдельные действия в нужные моменты, а так же получать доступ к текущему состоянию.

94
Q

[Redux] Как правильно получить доступ к хранилищу Redux?

A

В классовых компонентах используется connect, которая связывает компонент и предоставляет методы mapStateToProps() и mapDispatchToProps().

В функциональных компонентах через использование useSelector().

95
Q

[Redux] Каково назначение констант в Redux?

A

Они исключают возможность опечатки при написании типа действия.

96
Q

[Redux] Что такое Redux Thunk?

A

Это middleware, который позволяет создавать действия у которых есть возможность вызывать другие действия и есть доступ к состоянию. Это позволяет использовать асинхронные запросы в thunk.

97
Q

[Redux] Что такое Redux DevTools?

A

Расширение, которое позволяет удобно работать с redux, производить отладку, видеть текущее значение состояния и путешествовать во времени.

98
Q

[Redux] Что такое Redux селекторы и зачем они нужны?

A

Функция, которая выбирает какую-то заготовленную часть store.

99
Q

[Redux] Как добавить несколько middleware в Redux?

A

Используя функцию applyMiddleware() можно применить несколько middleware.

100
Q

[Redux] Можно ли Redux использовать только с React?

A

Нет - redux может работать с чем угодно и не завязан на react.

101
Q

[Redux] Что такое Middleware?

A

Middleware — это функция, которая расширяет функциональность dispatch. Эта функция принимает dispatch и getState (из store), а возвращает функцию, которая принимает next (ссылку на следующую middleware или редьюсер) и возвращает еще одну функцию, которая принимает action.

102
Q

[Redux] Какие типичные выборы middleware для обработки асинхронных вызовов в Redux?

A

Redux Thunk, Redux Promise, Redux Saga.

103
Q

[Redux] Какие рекомендации следует соблюдать при написании reducer?

A

Редьюсеры должны быть чистыми функциями без изменения состояния.

Каждое действие должно описывать одно взаимодействие пользователя, даже если оно вызывает несколько изменений в данных.

104
Q

[Redux] Что такое Redux Toolkit? Какие ключевые проблемы он решает?

A

Redux Toolkit- это пакет, облегчающий работу с Redux. Он создан с целью уменьшения сложности кода Redux, улучшения производительности и снижения объема написанного кода.

Решает три главных проблемы Redux:

  • Слишком сложная настройка хранилища (store).
  • Для того, чтобы заставить Redux делать что-то полезное, приходится использовать дополнительные пакеты.
  • Слишком много шаблонного кода (boilerplate).
105
Q

[Redux] Основные фишки RTK?

A

Простое создание store.

Возможность создавать slice для структурирования кода.

Простое создание действий и их импорт.

Встроенный thunk.

106
Q

[Router] Что такое React Router?

A

Библиотека для удобного роутинга приложения.

Роутинг - изменение адресной строки в одностраничном приложении.

107
Q

[Router] Как базово пользоваться Router?

A

Нужно обернуть приложение в <BrowserRouter> (v4) или <Switch> (v6).

Внутри него добавить несколько <Route> с свойствами path и component.

Для перехода на какой-то путь используется <Link> с свойством to вместо <a>.

108
Q

[Router] Как пользоваться <Route>?

A

Основное свойство это path. В нём указывается путь для этого маршрута. Если нужно абсолютно точное совпадение (например для пути “/”), то надо воспользоваться атрибутом exact.

Если больше одного пути без exact подходят, то будут отображены все.

В качестве компонента для <Route> может быть передан атрибут component v4 (element v6) с указанием компонента или render с передачей функции, которая будет исполнена для рендера.

109
Q

[Router] Как сделать динамический путь?

A

Для создания динамического пути в атрибуте path компонента <Route> добавляется, например “/:id”. В таком случае при переходе по ссылке, которая будет содержать такой паттерн - то что будет на месте :id будет возможно получить как значение.

Например:

<Route
	path="/starships/:id"
	render={({match, location, history}) => {
		return <StarshipDetails itemId="match.params.id" />
	}}
/>

В объекте match в свойстве params будет id.

Если в конце добавить “?”, то эта часть будет считаться опциональной. Тогда путь будет соответствовать как варианту с id, так и без него. Например: /:id?

110
Q

[Router] Как взаимодействовать с адресной строкой программно?

A

v4

Нужно использовать HOC witchRouter. Он предоставляет доступ к match, history и location для компоненты.

И можно, например выполнять history.push('/adress') для программного перехода. Так же можно использовать replace() для полной замены пути.

v6

Воспользоваться хуком useNavigate.

111
Q

[Router] Как показать что-то в случае несуществующего маршрута?

A

v4 - нужно использовать компонент без path.

v6 - нужно в path указать *.

112
Q

[Router] Как получить или установить параметры запроса из адресной строки?

A

v4

Для получения используется дополнительные библиотеки, например query-string.

Установка происходит просто через history.push(), в который передаётся не строка, а объект.

v6

Получение проихсодит через хук useLocation и объект URLSearchParams.

Установка через useNavigate().

113
Q

[Router] Как выполнить автоматический редирект после входа в систему?

A

React Router v4:

Используем компонент Redirect для перенаправления после успешного входа.

Redirect внутри компонента Login проверяет состояние входа и, если пользователь вошёл, перенаправляет его.

React Router v6:

Используем компонент Navigate вместо Redirect.

Логика остаётся той же: после успешного входа Navigate перенаправляет пользователя.