当列具有返回 React 组件的 cellRenderer 时,AgGridReact rowData 更改时出错

Posted

技术标签:

【中文标题】当列具有返回 React 组件的 cellRenderer 时,AgGridReact rowData 更改时出错【英文标题】:Error when AgGridReact rowData changes when a column has a cellRenderer that returns a React component 【发布时间】:2019-08-29 19:27:02 【问题描述】:

给定一个AgGridReact 组件,如下所示:

<AgGridReact rowData=myData>
    <AgGridColumn field="status" cellRenderer=() => <span /> />
</AgGridReact>

当我将不同的值传递给 myData 属性时,我收到以下错误:

ag-Grid:当网格位于绘制行的中间时,无法让网格绘制行。当网格处于渲染阶段时,您的代码可能调用了网格 API 方法。为了克服这个问题,将 API 调用设置为超时,例如,调用 setTimeout(function()api.refreshView(),0),而不是 api.refreshView()。要查看导致刷新的代码部分,请检查此堆栈跟踪。

如果将cellRenderer 替换为() =&gt; 'foo',则不会出现此问题。

我没有调用任何网格 API 方法。从堆栈跟踪来看,有问题的 API 调用是内部调用(因为 rowData 已更改而被调用)。

rowData 属性来自 Redux 商店。由于从 saga 派发的动作,它正在发生变化。这可能相关,也可能不相关。

【问题讨论】:

您能否确认您是使用任何单元格样式还是使用枚举属性来呈现 rowData? 我在一个类似于问题中的示例代码的最小示例中重现了该问题,没有样式。 【参考方案1】:

对于遇到此问题且没有上述特定错误的任何人,当我在工具提示渲染器中遇到错误时遇到此错误(我试图在 null 上调用过滤器),问题浮出水面是因为 HMR ( Hot Module Reloading) 刷新我的组件的方式与冷启动时不同。

在拔出一些头发并用谷歌搜索直到每个链接都变成紫色之后,我向 ag-grid 本身添加了一些自定义日志记录。在 ag-grid-community.amd.js(您可能需要一个不同的)中,我将以下内容添加到 getLockOnRefresh(),这样我就可以了解调用 getLockOnRefresh 的内容,并在此引发此错误。

console.log('hi there', throw new Error().stack)

然后我在 web 检查器中添加了一些调试语句,最终在我的工具提示渲染器中发现了实际错误。

因此,请将此视为围绕 ag-grid 和 HMR 的警告信标,可能会吞下错误并在一段时间内将您引向错误的道路。

这可能无关紧要,但如果相关的话,我也在使用 React、Redux、Immer,并且我的网站是在 Electron 中加载的。

【讨论】:

【参考方案2】:

使用cellRendererFramework 解决了这个问题。比如:

class MyComponent extends React.Component 
    render()  return <span />; 

<AgGridColumn field="status" cellRendererFramework=MyComponent />

这有点不方便,但可以。

【讨论】:

你能帮我解决这个问题吗?***.com/questions/56231178/…

以上是关于当列具有返回 React 组件的 cellRenderer 时,AgGridReact rowData 更改时出错的主要内容,如果未能解决你的问题,请参考以下文章

自学React 入门

React的class组件及属性详解!

React Insert功能-子组件问题

当列具有默认约束时,SQL Server 2012获取列不能为空。

使用 cellrender 应用的 aggFunc 和 aggFunc 未显示在父行中

当列具有空值[重复]时,数据集到列表弹出失败