javascript - 从 Reducer 函数中访问 Redux 中的 Store 状态
问题描述
我有一个带有几个减速器/状态的组合减速器。看起来如下
const reducer = combineReducers({
blogs: blogReducer,
notification: notificationReducer,
search: searchReducer,
filter: filterReducer,
users: userReducer,
loggedUser: loginReducer
});
const store = createStore(reducer, composeWithDevTools(applyMiddleware(thunk)));
在我的 userReducer 文件中,我想从函数中访问博客状态
这是为了在保存新博客文章时更新我的用户状态。
我试过这个:
import store from "../store";
const { blogs } = store.getState().blogReducer.blogs;
和这个
const { blogs } = store.getState().blogs;
但两者都没有工作
最终,在一篇新的博客文章中,我调用了 createBlog 操作创建者和 updateUser 操作创建者。我的用户与我的博客模型有一对多的关系。我想我需要更新用户的状态以包括新创建的博客,并认为我可以只获取当前的博客状态,找到用户,然后用更新的状态替换他们的博客。
像这样的东西,但也难倒其中的一部分。
const userReducer = (state = [], action) => {
switch (action.type) {
case "NEW_USER":
return [...state, action.data];
case "UPDATE_USER":
const { blogs } = state;
console.log("Blogs", blogs);
const username = action.data.id.username;
const userBlogs = blogs.filter(b => b.user.username === username);
const userToChange = state.find(a => a.username === username);
const changedUser = userToChange.blogs.replace(userBlogs);
return state.map(user =>
user.username !== username ? user : changedUser
);
export const updateUser = (id, blog) => {
return async (dispatch, getState) => {
const { blogs } = getState();
dispatch({
type: "UPDATE_USER",
data: {
id: id,
data: blog,
blogs
}
});
};
};
解决方案
所以,正如怀疑的那样,我把事情复杂化了。多亏了这里的来回,我意识到我可以从另一个减速器中调用另一个监听器。因此,这就是我解决问题的方法。
在我的用户减速器中,我添加了一个案例“USER_POSTED_BLOG”
case "USER_POSTED_BLOG":
return [...action.data];
然后在我的博客化简器中,我为新创建的案例添加了一个额外的调度,它将抓取所有用户并在新博客创建后更新状态
export const createBlog = content => {
return async dispatch => {
const newBlog = await blogService.create(content);
dispatch({
type: "NEW_BLOG",
data: newBlog
});
const updatedUsers = await userService.getAll();
dispatch({
type: "USER_POSTED_BLOG",
data: updatedUsers
});
};
};
推荐阅读
- python - 编码器输入与解码器输出不同
- windows - 验证服务进程是否符合“SERVICE_CONFIG_LAUNCH_PROTECTED”的条件
- docker - Docker 文件错误没有这样的文件或目录:unkno
- amazon-web-services - JWT 令牌中的无状态身份验证和权限
- flutter - 错误:配置项目“:app”时出现问题
- python - 使用已注册的转换器延迟反序列化 Python sqlite3.Row 列?
- reactjs - React Native 中的 Internet 推送通知
- reinforcement-learning - 适用于 2 人游戏的深度 Q 学习 (DQN)
- amazon-web-services - AWS 中用于微服务的内部通信
- angularjs - “ui select”正在还原 Chrome Android 中的搜索字符串