javascript - 从 Reducer 函数中访问 Redux 中的 Store 状态

标签 javascript reactjs redux react-redux

我有一个包含多个 reducer /状态的组合 reducer 。看起来如下

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 Action 创建者和一个 updateUser Action 创建者。我的用户与我的博客模型存在一对多关系。我想我需要更新用户的状态以包括新创建的博客,我想我可以只获取当前的博客状态,找到用户,然后用更新后的状态替换他们的博客。

类似这样的事情,但也难住了其中的一部分。

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
      }
    });
  };
};

最佳答案

Redux 文档中有一个 FAQ 部分是关于这个问题的: https://redux.js.org/faq/reducers#how-do-i-share-state-between-two-reducers-do-i-have-to-use-combinereducers

你可以使用 reduce-reducers例如:

// In this reducer, the state argument represents your root state
// Here you can handle actions which need to access multiple slice of the root state
const specializedReducer = (state, action) => {
  switch (action.type) {
    case "UPDATE_USER":
      const { blogs, users } = state;
      // proceed with your code here
  }
}

const reducer = combineReducers({
  blogs: blogReducer,
  notification: notificationReducer,
  search: searchReducer,
  filter: filterReducer,
  users: userReducer,
  loggedUser: loginReducer
});

const rootReducer = reduceReducers(specializedReducer, reducer);

const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(thunk)));

关于javascript - 从 Reducer 函数中访问 Redux 中的 Store 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58925728/

相关文章:

javascript - 在子进程中没有处理程序的情况下与 Redux : Passing function to child component, 调用进行 react

javascript - 让 CasperJS 迭代 URL 列表

javascript - 如何使用 Javascript 将多个音频文件附加到当前正在播放的音频中?

javascript - 我怎样才能修复这个 jQuery 故障,使 div 在使用 .hover() 时不会试图消失?

reactjs - React/Redux - 在应用程序加载/初始化上调度操作

reactjs - y 轴上的 react-chart-js-2 个单位

javascript - 当我在字符串上使用 .split 和 .length 来查找某个字符在字符串中出现的次数时,为什么输出数字总是少一?

node.js - 非映射属性 - Sequelize

javascript - Redux-thunk: `dispatch is not a function`

javascript - 在 Redux 中更新存储以获取引用字段