我正在尝试将现有项目从createStore
转换为configureStore
。
商店. js:
export default configureStore({
reducer: {
articlesList: loadArticlesReducer
}
});
首页. js:
const articlesList = useSelector((state) => state.articlesList);
const dispatch = useDispatch()
useEffect(() => {
dispatch(getArticles());
})
文章切片. js:
const articleSlice = createSlice({
name: 'articles',
initialState : [],
reducers : {
loadArticlesReducer: (state, action) => {
console.log("WE NEVER REACH THIS CODE") <=== the problem is here
state = action.payload;
}
}
});
export const { loadArticlesReducer } = articleSlice.actions;
export const getArticles = () => dispatch => {
fetch("https://....")
.then(response => response.json())
.then(data => {
dispatch(loadArticlesReducer(data))
})
};
正如注解中所述,问题在于getArticles
操作从不将数据分派到loadArticlesReducer
。
我错过了什么?
2条答案
按热度按时间xyhw6mcr1#
loadArticlesReducer
是一个动作创建器,而不是一个reducer函数,我建议重命名这个动作创建器,这样它的目的就不会让未来的读者(* 包括你自己 *)感到困惑,并且实际上导出这个reducer函数。示例:
您还可以考虑使用
createAsyncThunk
将getArticles
转换为更惯用的RTK thunk函数。您可以使用切片的extraReducers
来处理从thunk返回的已实现的Promise。示例:xe55xuns2#
根据documentation,您需要替换以下行:
有了这个:
当然,您需要从
articleSlice.js
导出减速器:作为一个一般性的提示,总是使用完全相同的设置和命名来复制文档中的示例,一旦成功了,就以缓慢的一步一步的方式相应地定制代码。如果与原始代码没有一一对应的关系,那么在复制如此复杂的设置时很容易漏掉一些东西。