无状态功能组件方法永远不会从 Redux 存储中获取新数据,但其他方法会这样做

Posted

技术标签:

【中文标题】无状态功能组件方法永远不会从 Redux 存储中获取新数据,但其他方法会这样做【英文标题】:Stateless functional component method never gets fresh data from Redux store, but others do 【发布时间】:2019-01-31 03:49:35 【问题描述】:

我遇到了一些麻烦。 我有一个非常常见的功能组件通过 mapStateToProps 连接到 Redux:

    const TableWrapper = ( studentsSelection ) => 

  const onComponentStateChanged = params =>
    params.api.forEachNode(node =>
      studentsSelection.selectedStudents.findIndex(student =>
        student.number === node.data.number) >= 0 &&
      node.setSelected(true)
    );

  const gridOptions = getGridOptions(onComponentStateChanged(), onSelection);

  return (
    <BootStrapTableWrapper>
      <Table gridOptions=gridOptions />
    </BootStrapTableWrapper>
  );
;
TableWrapper.propTypes = 
  studentsSelection: PropTypes.shape(
    selectedStudents: PropTypes.array
  )
;

const mapStateToProps = state => (
  studentsSelection: state.gpCreationWizard.studentsSelection
);

export default connect(mapStateToProps)(TableWrapper);

其中 getGridOption 指的是这个:

const getStudentsSelectionGridOptions = (onComponentStateChanged, updateStudentsSelectionSelectionAction) => (
    ...studentsSelectionGridOptions,
    onComponentStateChanged(props) 
        onComponentStateChanged(props);
    ,
    onRowSelected(node) 
        updateStudentsSelectionSelectionAction(node);
    ,
);

export default getStudentsSelectionGridOptions;

生成的 gridOptions 用于 Ag-Grid 表。

所以让我解释一下业务功能:我正在使用 Ag-Grid 表,当用户选择一些学生时,他们会被添加到 Redux 存储中。然后我使用onComponentStateChanged 将选择保持在分页上。因此,如果用户更改了页面,并且旧数据将被新数据替换,我希望在他返回时保留选择。但问题onComponentStateChanged 总是指同一个studentsSelection.selectedStudents(但其他方法和渲染接收新数据)。所以这可能是关于 js 作用域的东西。请问,我应该怎么做才能使这个函数使用新数据,而不是旧数据。我试图将那个包装在另一个函数中,但这没有任何效果。有趣的事实是,这适用于类组件和 this.props 引用。如果我解释得不是很清楚,请询问更多细节。

【问题讨论】:

你能显示getGridOptions吗? @ChrisCousins 你好! getGridOptions = getStudentsSelectionGridOptions,在导入时重命名。谢谢 【参考方案1】:

不确定 getGridOptions 是做什么的...但我认为问题在于,您调用的是方法而不是传递方法,因此请更改:

const gridOptions = getGridOptions(onComponentStateChanged(), onSelection);

到:

const gridOptions = getGridOptions(onComponentStateChanged, onSelection);

所以onComponentStateChanged 是作为方法发送的,而不是调用它的结果

【讨论】:

如果没有,params 永远不会被使用 可能不是这样,因为onComponentStateChanged返回一个函数,在getStudentsSelectionGridOptions中使用。我是有意识地这样做的。 onComponentStateChanged 不返回函数,是函数。并且您使用未定义的参数调用它,所以它一定是在崩溃...控制台没有显示任何内容? 哎呀。我的坏,没有注意到。我复制了一个错误,实际上它看起来像const gridOptions = getGridOptions(onComponentStateChanged, onSelection); 但仍然没有效果。我有一种感觉,Ag-Grid 出于某种原因以某种方式改变了函数的范围,并且不再对新数据做出反应。

以上是关于无状态功能组件方法永远不会从 Redux 存储中获取新数据,但其他方法会这样做的主要内容,如果未能解决你的问题,请参考以下文章

Redux 存储在调度后不更新(异步数据加载)

P13:Redux进阶-Redux中的无状态组件的改写

组件不会重新渲染,但 redux 状态已通过反应钩子更改

Redux状态更改后,简单的React组件不会更新

如何在 redux 状态更新时自动刷新组件

更新 Redux 存储时反应组件不重新渲染