Странное поведение состояния в slice redux-toolkit (отозванный прокси)

#reactjs #redux-toolkit #immer.js

#reactjs #redux-toolkit #immer.js

Вопрос:

Песочница: https://codesandbox.io/s/ucjrx?file=/src/features/todos/todosSlice.js

В todoSlice.js , в строке 14, когда я пытаюсь выполнить console.log, он печатается как отозванный прокси (консоль браузера). Но когда я ставлю точку останова в chrome dev tools и шаг за шагом просматриваю эту строку, это не отозванный прокси. Почему это происходит?

Ответ №1:

В RTK-редукторе ваше состояние оборачивается в прокси-объект библиотекой immer для обнаружения изменений. После завершения работы редуктора этот прокси-объект отменяется для предотвращения утечек памяти.

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

Как объясняется в документации, вы должны регистрировать значения черновика состояния, используя current экспорт из immer, который повторно экспортируется из RTK:

 import { createSlice, current } from '@reduxjs/toolkit'

const slice = createSlice({
  name: 'todos',
  initialState: [{ id: 1, title: 'Example todo' }],
  reducers: {
    addTodo: (state, action) => {
      console.log('before', current(state))
      state.push(action.payload)
      console.log('after', current(state))
    },
  },
})
  

Комментарии:

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

2. @Organic Это не имеет ничего общего с Redux, а с тем, как браузеры регистрируют данные. Преимущество: вы просто пишете 1/4 кода по сравнению с устаревшим Redux. Кроме того, эта «проблема» разделяется многими библиотеками управления состоянием, которые используют подобные абстракции.

3. @Organic не мог не согласиться.