【问题标题】:React Redux: How to share data between reducers?React Redux:如何在 reducer 之间共享数据?
【发布时间】:2018-11-20 07:28:05
【问题描述】:

我有一个基本的待办事项列表。 todo 列表的 todo 输入字段有一个 onChange 事件,该事件触发一个操作并将 event.target.value 发送到 reducer 并将用户键入的每个字符存储到 store 对象的属性中。

当用户提交表单时,我想获取之前通过 onChange 事件存储的数据,然后我想将它放在 store 对象的新属性中。

如何获取之前从 store 输入的数据并将其拉入不同的 reducer?

在我见过的所有示例中,reducer 都以“初始状态”开始。我不想要那个,我想要用户输入的先前状态。

下面是代码的 CodeSandbox 版本(出于某种原因,右侧的橙色-米色选项卡需要向左切换为蓝色才能呈现表单。如果您不这样做,它将不会工作)。

https://codesandbox.io/s/pwqlmp357j

【问题讨论】:

  • 请在 SO 本身中编写代码,因为将来链接可能会中断。

标签: javascript reactjs react-redux


【解决方案1】:

问问自己,您的减速器结构是否正确。如果一个 和b不是相互独立的,为什么要分开 减速机?

好吧,如果我们谈论正确构建减速器,cachedInputtodoList 应该存在于单个减速器中。无需创建另一个减速器。另外我想您需要一次获取所有输入值(当用户单击提交时)并将其发送到存储。

如果你仍然想创建单独的减速器,那么你可以按照下面给出的方法:

回答如何访问或共享已存储在 reducer 中的数据?

不要使用 combineReducers。

示例

替换此代码

export const a = combineReducers({
  cachInput,
  newTodo
});

export default (state = {}, action) => {
  return {
    cachInput: cachInput(state.app, action, state),
    newTodo: newTodo(state.posts, action, state),
  };
};

reducer 就像

const reducer = (state = initialState, action, root) => {....}

你可以从root访问之前的状态

【讨论】:

    【解决方案2】:

    onChange 事件触发一个动作并将 event.target.value 发送到 reducer 并将用户键入的每个字符存储到 store 对象的属性中

    实际上,考虑到您正在提交表单以将相同的数据发送到减速器,这不是使用 redux->action->reducers->store 的正确方法。

    如果您没有很好地处理shouldComponentUpdate /componetWillRecieve/getDerivedStateFromProps,这将导致与redux#connect 连接的组件的不必要渲染

    而是将您键入的每个字符/字符串存储在组件state 中,一旦用户提交它,dispatch action 将字符串/字符传递给reducer's

    【讨论】:

    • 我读到如果你使用 Redux,你不应该使用组件状态。我想我不清楚指导方针是什么。但是是的,这是有道理的
    • 不,您可以将本地状态与 Redux 一起使用。这是一个很好的例子,实际上你可以使用它。
    【解决方案3】:

    您为每个 reducer 使用了两个不同的状态(或者说是初始状态)。因此,一个对象的更新不会反映在另一个对象中。

    你需要为这两个reducer使用共享的initialState,你的问题就解决了。

    您可以将 initialState 保存在不同的文件中,并且可以在两个 reducer 中导入。

    考虑下面的代码示例:

    1.InitialState.js

    export default initialState = {
      todoList: [
        { text: "fake todo" },
        { text: "fake todo" },
        { text: "fake todo" }
      ],
      cachedInput: ""
    };
    

    2.现在在 CachDataOfTodoInput.js 中

    import initialState from "InitialState";
    
    export function cachInput(state = initialState, action)
    

    3.SubmitDataToTodo.js 相同

    import initialState from "InitialState";
    export function submitNewTodo(state = initialState, action)
    

    因此 intialState 在您的 reducer 之间共享,您将能够访问每个 reducer 中的数据。

    【讨论】:

    • 我最初缓存的数据在代码中的初始状态是空字符串。如果我将其导入另一个减速器,用户输入的数据将丢失并替换为空字符串。如果您认为我误解了您,除非我看到代码示例,否则我无法理解。
    • 这似乎可行,但仍不清楚它是否是正确的做法等:“您可以将 initialState 保存在不同的文件中,并且可以在两个减速器中导入。”
    • 这是redux中的正确做法。 Flux 和 redux 的主要区别在于 Flux 可以有多个 store,而在 redux 中你必须声明一个 store。通过这个问题的答案来了解区别:stackoverflow.com/questions/32461229/…
    • 同意Hriday,redux应该有一个store。
    • 我尝试听从您的建议,但当我提交待办事项时,它们是空白的。 cachedData 不存储在其他对象属性中。示例:codesandbox.io/s/6z8vno7vo3
    【解决方案4】:

    如果您想以包含先前缓存数据的初始状态加载您的应用程序,并且如果您正在使用客户端渲染,则可以将 redux 存储中的缓存数据插入本地存储并将其用作初始状态。

    如果你只是想在表单提交后将数据导入另一个reducer,你可以使用redux-thunk。它允许您在提交操作中加载当前状态,并将捕获值传递给其他减速器并存储它们。

    如果您正在使用 ssr 并且您希望将数据加载到服务器上,除非将数据保存在服务器上(在文件或数据库中),否则无法在服务器上收到请求时读取数据并更新您的 redux 存储。它将在您的应用中加载数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 2020-08-04
      • 2016-04-11
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多