【问题标题】:React/Redux: componentDidUpdate not firing consistentlyReact/Redux:componentDidUpdate 没有持续触发
【发布时间】:2023-03-05 23:00:01
【问题描述】:

我的props中有嵌套数组,用户可以通过拖放列重新排序二级数组。我(使用 redux)制作 getState 外部数组的浅表副本,进行重新排序(通过基于索引重新分配数组对象),并将新数组返回到状态(在我的 reducer 中使用扩展运算符)。但是,componentDidUpdate 不会被调用如果此排序是我在页面加载后做的第一件事。如果我采取其他更新道具/状态的操作,然后尝试重新排序,排序工作正常并调用componentDidUpdate

在前一种情况下,排序是我在页面加载/刷新后尝试做的第一件事,渲染函数被命中(使用正确重新排序的道具)但 DOM 永远不会更新,大概是因为 redux 无法识别状态变化?

似乎其他一些 props 发生了变化(即使与数组无关)“唤醒”redux 或 connect 并允许它识别变化。

这里是我在 reducer 中复制、调度然后释放更新状态的地方:

在 actionCreator 方法中:

...
const newProjects = getState().tracker.projects.slice().map(p => {
    if (p.innerArray) {
        const from = p.innerArray[draggedId-1];
        const to = p.innerArray[droppedId-1];
        p.innerArray[draggedId - 1] = { ...to, order: draggedId };
        p.innerArray[droppedId - 1] = { ...from, order: droppedId };
    }
    return p;
})                
dispatch({ type: 'RECEIVE_FIELD_UPDATE', projects: newProjects, message: "Sorted" });

减速器:

case 'RECEIVE_FIELD_UPDATE':
        return {
            ...state,
            projects: action.projects,
            message: action.message
        }

如您所见,我没有在 reducer 中改变状态或做其他反模式的事情(据我所知)。

FWIW,无论componentDidUpdate 是否被命中,message 属性上的“Sorted”值似乎都可以通过(我有一个模式会弹出消息以确认)。

任何指针或相关文档都会有所帮助;我一直在阅读我能找到的所有内容,包括其他 StackOverflow 帖子,但无济于事。

更新 解决了这个问题,它确实与 redux 不区分属性有关,但不是因为我的预期,如果有兴趣,请阅读以下内容。

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    想通了,但通常我找错地方了。

    问题是我对页面加载的条件检查以防止重新加载已存储的数据,这阻止了任何调度的触发。当我查看reducer时,拖动后项目的子数组是相同的,因为状态之前还没有连接。我认为硬刷新会导致完全重新加载,但显然我需要阅读有关 redux 如何存储数据以及如何刷新数据的更多信息。

    无论如何,解决此问题以便我在页面加载时获得新数据解决了问题,并且componentDidUpdate 现在被持续触发。

    【讨论】:

      【解决方案2】:

      在以数组格式更新 reducer 中的状态时,我不得不再次传播状态以进行更新并避免发生变异。

      case 'RECEIVE_FIELD_UPDATE':
              return {
                  ...state,
                  projects: ...state, ...action.projects,
                  message: action.message
              }
      

      或者...

      case 'RECEIVE_FIELD_UPDATE':
               return {
                   ...state,
                   projects: [...state, ...action.projects],
                   message: action.message
                  }
      

      取决于格式。 希望有帮助。

      【讨论】:

      • 谢谢,但是 projects 不是顶级状态,它只是状态对象的一个​​属性,所以上面会抛出错误。我可以看到混乱,因为我的帖子没有深入到状态树。将状态项目分散到行动项目中最终会得到与以前相同的结果,因为没有添加或删除项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多