CreateSlice 的 extraReducer 操作不更新状态
CreateSlice's extraReducer action not updating the state
设置
我正在使用 createSlice
写一个减速器:
export const fetchUserProfile = createAsyncThunk(...)
export const UserProfileSlice = createSlice<UserProfileState | null, SliceCaseReducers<UserProfileState | null>>({
name: 'UserProfile',
initialState: null,
reducers: {},
extraReducers: (builder) => {
builder.addCase(fetchUserProfile.pending, (state, action) => {
console.log("Fetching user profile...")
})
builder.addCase(fetchUserProfile.rejected, (state, action) => {
// TODO: Handle this properly later.
console.log('Failed to fetch user profiles: ', action.payload)
})
builder.addCase(fetchUserProfile.fulfilled, (state, action) => {
console.log('State was: ', state)
state = action.payload
console.log('State is ', state)
})
}
})
export default UserProfileSlice.reducer
我正在使用 combineReducers
将切片的缩减器添加到我的根缩减器,并且我正在这样创建我的商店:
export const store = createStore(rootReducer, applyMiddleware(thunk));
我以这种方式在组件中使用状态:
const user = useAppSelector(state => state.userProfileReducer)
预期行为
调度 fetchUserProfile.fulfilled
操作时,会更新状态并重新呈现组件以反映其数据。
实际行为
传递给 builder.addCase(fetchUserProfile.fulfilled,...)
的闭包是 运行(如控制台输出所示),但其结果从未反映在组件所见的状态中。
我是 React Native 和整个 JS 生态系统的新手,所以我有点难以调试它。感谢您的帮助。
这在 Writing Immer Reducers: Mutating and Returning State 中处理。
state = newValue
没有任何作用。它不会修改state
中的对象,但丢弃state
中的对象并将一些新值放入变量.
状态对象的变化可以从函数外部观察到——仅仅改变变量不能。
解决方案?
改为return newValue
。
设置
我正在使用 createSlice
写一个减速器:
export const fetchUserProfile = createAsyncThunk(...)
export const UserProfileSlice = createSlice<UserProfileState | null, SliceCaseReducers<UserProfileState | null>>({
name: 'UserProfile',
initialState: null,
reducers: {},
extraReducers: (builder) => {
builder.addCase(fetchUserProfile.pending, (state, action) => {
console.log("Fetching user profile...")
})
builder.addCase(fetchUserProfile.rejected, (state, action) => {
// TODO: Handle this properly later.
console.log('Failed to fetch user profiles: ', action.payload)
})
builder.addCase(fetchUserProfile.fulfilled, (state, action) => {
console.log('State was: ', state)
state = action.payload
console.log('State is ', state)
})
}
})
export default UserProfileSlice.reducer
我正在使用 combineReducers
将切片的缩减器添加到我的根缩减器,并且我正在这样创建我的商店:
export const store = createStore(rootReducer, applyMiddleware(thunk));
我以这种方式在组件中使用状态:
const user = useAppSelector(state => state.userProfileReducer)
预期行为
调度 fetchUserProfile.fulfilled
操作时,会更新状态并重新呈现组件以反映其数据。
实际行为
传递给 builder.addCase(fetchUserProfile.fulfilled,...)
的闭包是 运行(如控制台输出所示),但其结果从未反映在组件所见的状态中。
我是 React Native 和整个 JS 生态系统的新手,所以我有点难以调试它。感谢您的帮助。
这在 Writing Immer Reducers: Mutating and Returning State 中处理。
state = newValue
没有任何作用。它不会修改state
中的对象,但丢弃state
中的对象并将一些新值放入变量.
状态对象的变化可以从函数外部观察到——仅仅改变变量不能。
解决方案?
改为return newValue
。