gpt4 book ai didi

ag-grid CellRenderer - 当其他行数据(props.data)更改时如何渲染?

转载 作者:行者123 更新时间:2023-12-02 21:00:18 28 4
gpt4 key购买 nike

我希望根据与该行关联的 props.data 对象中可用的其他数据以某种方式呈现单元格。但我不知道当其他数据发生变化时如何让单元格重新渲染。

我有一个非常简单的数据结构,我试图在 ag-grid 中显示,基本上是一个属性数组,每个属性都有一个名称、一个值和一个 isLoading 标志,指示该属性是否正在更新(例如可能会发生后台刷新,网格单元中的数据是只读的)。

我希望网格显示名称和值列,并且如果 isLoading == true,我希望值列显示微调器图标。
我正在尝试为此构建一个自定义单元格渲染器,但单元格仅在值更改时重新渲染,而不是在 isLoading 标志更改时重新渲染。

在我的代码流程中,isLoading 标志设置为 true,然后更新该值。这会触发渲染方法,单元格现在将显示更新的值和加载微调器。然后 isLoading 标志设置为 false,但不会再次调用 render 方法,因此单元格继续显示加载微调器。

所以我的问题是,如何让 cellrenderer 响应 props.data 中的更改,这些更改不适用于其显示值的字段?在这种情况下,当 props.data.isLoading 标志更改时,我需要重新渲染单元格。

我正在使用带有react和redux的ag-grid v17(并尝试 typescript )。
我的代码看起来与此处的示例非常相似:https://www.ag-grid.com/react-redux-integration-pt1/

在此示例中,我的单元格渲染器是根据货币渲染器构建的:https://www.ag-grid.com/javascript-grid-cell-rendering-components/#example-rendering-using-react-components

注意:我将网格的 deltaRowDataMode 设置为 true,因此它仅重新渲染已更改的数据。

这是我的列定义:

{
colId: 'value',
headerName: 'Value',
field: 'value', //the property's value on my data structure
cellRendererFramework: MyCellRenderer
}

这是我的单元格渲染器:

import React from 'react';
import { ICellRendererParams } from 'ag-grid';

interface RendererState {
currentValue: string;
isLoading: boolean;
}

export class MyCellRenderer extends React.Component<ICellRendererParams, RendererState> {
constructor(props: ICellRendererParams) {
super(props);
this.state = { currentValue: props.data.value, isLoading: props.data.isLoading };
}

//refresh is only called when the value changes, not when params.data.isLoading changes, so render does not get called
refresh(params: ICellRendererParams) {
if (params.value !== this.state.currentValue) {
this.setState({ currentValue: params.value });
}
if (params.data.isLoading !== this.state.isLoading) {
this.setState({ isLoading: params.data.isLoading });
}
return true;
}

render() {
var loadingStyle = {
display: (this.state.isLoading) ? '' : 'none'
};
return (
<div>
{this.state.currentValue}
<div className="pull-right">
<span className="fa fa-refresh fa-spin" style={loadingStyle}></span>&nbsp;
</div>
</div>
);
}

}

这也可以使用单元格类或样式,但我也希望能够以类似的方式处理其他事情,例如拥有带有按钮的单元格渲染器,并禁用该按钮如果 isLoading 为 true。

更新:
此处添加了一个工作示例:https://react-owixbq.stackblitz.io/

最佳答案

尝试使用componentWillReceiveProps,而不是在refresh()中更新状态.

    componentWillReceiveProps(nextProps){
if(nextProps.data.yourField !== this.props.data.yourField){
this.setState({ isLoading: false, currentValue: nextProps.data.yourField });
}
}

关于ag-grid CellRenderer - 当其他行数据(props.data)更改时如何渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330393/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com