Выбор ответа Junior Context и стейт-менеджеры обновлено

Почему в createSlice можно «мутировать»

Вопрос

В редьюсере createSlice написано state.items.push(action.payload). Почему это не ломает иммутабельность Redux?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: RTK оборачивает редьюсер в Immer: мутации идут над черновиком. createSlice использует Immer.

Варианты ответа

  1. Redux Toolkit отключает проверку иммутабельности в редьюсерах createSlice
  2. В Redux Toolkit стор хранится в мутабельном объекте, это нормально
  3. push в редьюсерах RTK заменяется на concat при сборке
  4. RTK оборачивает редьюсер в Immer: мутации идут над черновикомправильный ответ

Разбор

createSlice использует Immer. Редьюсер получает черновик (draft), записи в него отслеживаются, и Immer собирает новый объект, переиспользуя неизменённые части. Для Redux состояние по-прежнему иммутабельно.

  • Проверка мутаций в dev-режиме RTK как раз включена.
  • Стор остаётся неизменяемым, просто удобный синтаксис.
  • Никакой подмены кода при сборке нет, это работа Immer в рантайме.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме