【问题标题】:Redux async dispatch causes connected component errorRedux 异步调度导致连接组件错误
【发布时间】:2017-01-11 22:50:41
【问题描述】:

单击按钮时,会进行 API 调用(由 setTimeout 模拟),完成后,该项目会从状态中移除。我希望组件不会尝试渲染,但它会失败,因为它需要的状态不再存在。

The first fiddle 显示所需的行为有效,因为调度调用是同步的:

dispatch({
  type: 'REMOVE',
  id
}); 

The second fiddle 显示错误,因为调度调用是异步进行的:

setTimeout(() => {
  dispatch({
    type: 'REMOVE',
    id
  });   
 }, 0);

我假设父组件将不再尝试渲染子组件,因为该项目已从数组中过滤出来。如何从状态中删除项目并防止组件尝试重新渲染?

【问题讨论】:

标签: javascript reactjs asynchronous redux


【解决方案1】:

是的,这是一个问题,因为默认情况下 redux 不支持异步调用,所以你正在寻找它 redux-thunk

https://github.com/gaearon/redux-thunk

向下滚动到动机,它基本上与您在此处发布的代码完全相同。

:::编辑:::

根据您在下面的评论,我更新了您的代码,我认为问题的主要来源之一是将带有地图状态的 Item 组件连接到道具。

const mapStateToProps = (state, { id }) => {
    var {text} = state.items.filter((x) => x.id === id)[0];
    return {
    id: id,
    text: text
  };
};

const mapDispatchToProps = (dispatch) => {
    return {
    onRemove(id) {
        setTimeout(() => {
        dispatch({
            type: 'REMOVE',
          id
        }); 
     }, 0);
    }
  };
 };

我知道您可能不需要它/或不想要它,但我稍微重构了代码以使其更清晰一点,但我可能已经忘乎所以并将其与您的原始示例相去甚远,但如果您想看看它张贴在这里。

https://jsfiddle.net/kriscoulson/ogkyspsp/

【讨论】:

  • 我认为中间件只是允许您异步使用动作创建器,但我宁愿不这样做。中间件在幕后做了什么神奇的事情吗?我已经updated the example here 使用了 redux-thunk,但它仍然无法正常工作......
  • @NickL 我在上面更新了我的答案。对不起,如果我第一次不清楚。我可能与您最初的问题相去甚远。但是让它在没有 reduxthunk 的情况下与 settimeout 一起工作
  • 所以这是将该组件连接到商店的结果?我这样做的原因是为了提高我的应用程序的性能,以最大限度地减少重新渲染(它是一个表,行和单元格连接到存储)。我在关注this tree example。我仍然想将组件连接到商店,这可能吗?我是否必须先调度操作才能删除所有子项?
  • Here is an example that works。它调度两个动作:第一个隐藏项目,第二个将其从状态中移除。这感觉不直观,因为通常我只是从要删除的节点开始删除树,而不是遍历树并向上删除......
  • 抱歉这么久才回复我更新了我的版本,但没有重新连接项目组件并在每个项目上再次搜索 id。但是,如果您从我的示例中删除,您可以使用shouldComponentUpdate 方法,它将显示它可以工作并且项目组件会重新呈现。此外,html 标记是什么并不重要,因此您仍然可以使用表格。 jsfiddle.net/kriscoulson/ogkyspsp/1
猜你喜欢
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2017-07-18
  • 2016-08-09
  • 1970-01-01
  • 2017-09-26
  • 2021-04-03
  • 2019-01-09
相关资源
最近更新 更多