Выбор ответа Middle memo, useMemo, useCallback обновлено
Неполные зависимости useMemo
Вопрос
Пользователь меняет query, но список не фильтруется заново. В чём ошибка?
const visible = useMemo(
() => items.filter(i => i.title.includes(query)),
[items]
);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В зависимостях нет query, и кеш не пересчитывается. useMemo пересчитывает значение только при изменении перечисленных зависимостей. query читается внутри, но не указан, поэтому результат залипает.
Варианты ответа
useMemoнельзя использовать сfilter, он кеширует лишь примитивы- Нужно заменить на
useCallback, он пересчитывает при каждом вызове - В зависимостях нет
query, и кеш не пересчитываетсяправильный ответ itemsдолжен быть state, а не пропом, иначеuseMemoне видит смену
Разбор
useMemo пересчитывает значение только при изменении перечисленных зависимостей. query читается внутри, но не указан, поэтому результат залипает. Нужно [items, query], это подскажет линтер exhaustive-deps. filter в useMemo допустим. useCallback кеширует функцию, а не результат. Источник items значения не имеет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «memo, useMemo, useCallback»
- Перерендерится ли children
- React Compiler
- React.memo
- useCallback
- useMemo
- Таблица на 10 000 строк
- memo и children
- memo и стрелочная функция в props