【问题标题】:In Redux, how to get state in action? [duplicate]在 Redux 中,如何获得状态? [复制]
【发布时间】:2019-03-16 08:12:18
【问题描述】:

在下面的示例中,从 firebase 获取数据后,我想添加已经存在于 redux 存储中的用户对象并将其附加到所有消息对象中。请求你帮忙。

问题:

  1. 在动作创建器中访问状态是一种好方法吗?如果是,怎么做?
  2. 如果没有,有哪些替代方案?
db.collection(`messages/${documentId}/chat`)
  .get()
  .then(snapshot => {
    const messages = [];
    snapshot.docs.forEach(doc => {
    console.log("message", doc.id, doc.data());
    messages.push({
      id: doc.id,
      from: doc.data().from,
      to: doc.data().to,   
      text: doc.data().text,
      timestamp: doc.data().timestamp.seconds * 1000
    });
  });
  dispatch({ type: GET_CHAT, payload: messages });
});

【问题讨论】:

  • 为什么需要让状态生效?
  • 我正在构建聊天应用程序,并希望在我从 firebase 收到聊天消息后附加已经查询过一次并出现在商店中的用户对象。
  • 所以你让我说一个用户存储和一个消息存储对吗?您想在查询消息时获取 userInfo,然后将其保存到您的消息存储中?
  • 我同意这个回复的人,也许它会给你一些线索linkredux的作者
  • “想要附加已经查询过一次并存在于存储中的用户对象”更好的方法是让你的存储在关系数据库的意义上保持正常状态。并且仅在使用选择器将状态映射到组件道具时才对数据进行非规范化。否则你几乎肯定会遇到各种“哦,我更新了用户,但我的聊天组件没有重新呈现”的问题。

标签: react-native redux react-redux


【解决方案1】:

如果您使用 Redux Thunk 中间件,您可以简单地这样做:

const myAction = () => async (dispatch, getState) => {
  const { field1, field2 } = getState().myReducer;
};

【讨论】:

    【解决方案2】:

    很简单。 从“..path/to/your/createStore/export”导入存储。

    然后在 action 内部或任何地方使用它,我们不能使用 redux 的 connect 方法来订阅我们的组件。

    store.getState() // 将返回整个 store 对象。

    调度动作的其他有用方法;。 store.dispatch(动作名称)。

    最后,soter.getState() 应该在紧急情况下使用。 为您的用例。 大多数情况下,我们使用动作参数。并将数据作为动作的参数传递。我们从哪里派出行动前。来自订阅了 redux store 的某个组件。在那里我们将通过 mapStateToProps 方法访问 store 对象。

    export const successBuy = data => {
    let request = axios
    .post(`/api/users/successBuy`, data)
    .then(response => response.data);
    return {
    type: actionTypes.SET_CURRENT_USER,
    payload: request
     };
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2017-12-02
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多