#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 не мог не согласиться.