Redux异步action更新状态后页面没变化怎么办?
我在用Redux Toolkit处理API请求时遇到问题,当调用fetchData的thunk后,状态虽然在store里更新了,但页面组件没重新渲染。我检查过action确实被dispatch了,但state数组还是空的。
这是我的slice写法:
export const fetchData = createAsyncThunk(
'posts/fetchPosts',
async () => await api.get('/posts')
);
const postSlice = createSlice({
name: 'posts',
initialState: { list: [], status: 'idle' },
extraReducers: {
[fetchData.fulfilled]: (state, action) => {
state.list = action.payload; // 这里是不是应该用展开运算符?
state.status = 'succeeded';
}
}
});
我尝试过在组件里用useSelector(state => state.posts.list),但数据加载完还是显示空数组。难道是immer的不可变更新有问题?或者应该用produce包裹?
extraReducers写法,Redux Toolkit 的createSlice中推荐用 builder callback 的方式定义异步 action 的处理逻辑,而不是直接解构action.type。你现在的写法可能会导致 Redux Toolkit 无法正确识别 reducer。另外,
action.payload应该是一个数组,但如果你的 API 返回的数据结构不是直接的数组,比如是嵌套在某个字段里,那你需要确保取的是正确的值。可以打印一下action.payload确认。还有一个常见的坑是组件没有正确订阅到状态的变化。
useSelector的 selector 函数必须返回一个新的引用或者值,才能触发重新渲染。如果 selector 没有正确映射到状态的变化,组件是不会更新的。我建议按照下面的方式调整代码:
然后在组件中这样使用:
最后提醒一下,Redux Toolkit 内部已经用了 immer,所以你不需要手动用展开运算符或者
produce包裹,直接修改state就行了。如果问题还是存在,可能是其他地方有问题,比如 store 配置或者组件挂载逻辑,那得再具体排查了。