admin管理员组文章数量:1353245
I'm using AG-Grid throughout a react application, and in several instances I want a cellRenderer to update when grid data changes. In both of the following cases, the cellRenderer loads correctly initially, but doesn't update when data changes:
- A user edits an editable cell and changes the value.
- The server updates the grid data in redux
Check out this codesandbox
In this example I recreated the first use case with an editable cell, and used a class ponent and a function ponent. Using onCellValueChanged with params.api.refreshCells() I was able to get the class ponent to update, but not the function ponent.
First question: How do I get react function ponents to re-render with new props, the same way the class ponent re-renders in the codesandbox example?
Second question: Is there a better way to update a cellRenderer without un-mounting and re-mounting every cell in the column any time data updates?
Thanks in advance for the help and guidance!
...
this.state = {
columnDefs: [
{
headerName: "Editable Country",
editable: true,
field: "country",
width: 200
},
{
headerName: "Class Render",
cellRendererFramework: GridCellClass,
colId: "class-renderer",
width: 200
},
{
headerName: "Function Render",
cellRendererFramework: GridCellFunction,
colId: "function-renderer",
width: 200
}
],
rowData: []
};
}
...
<AgGridReact
rowModelType="infinite"
columnDefs={this.state.columnDefs}
enableColResize={true}
rowClassRules={{
california: function(params) {
return params.data.country === "California";
}
}}
onCellValueChanged={function(params) {
return params.api.refreshCells({
force: true,
columns: ["class-renderer", "function-renderer"]
});
}}
onGridReady={this.onGridReady.bind(this)}
rowData={this.state.rowData}
/>
...
// This one updates!
import React, { Component } from "react";
class GridCellClass extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
const { data } = this.props;
return (
<div>
{data.country === "California" ? "CALIFORNIA!!!" : "Not California"}
</div>
);
}
}
export default GridCellClass;
// This one does not update.
import React from "react";
function GridCellFunction(props) {
const { data } = props;
return (
<div>
{data.country === "California" ? "CALIFORNIA!!!" : "Not California"}
</div>
);
}
export default GridCellFunction;
I'm using AG-Grid throughout a react application, and in several instances I want a cellRenderer to update when grid data changes. In both of the following cases, the cellRenderer loads correctly initially, but doesn't update when data changes:
- A user edits an editable cell and changes the value.
- The server updates the grid data in redux
Check out this codesandbox
In this example I recreated the first use case with an editable cell, and used a class ponent and a function ponent. Using onCellValueChanged with params.api.refreshCells() I was able to get the class ponent to update, but not the function ponent.
First question: How do I get react function ponents to re-render with new props, the same way the class ponent re-renders in the codesandbox example?
Second question: Is there a better way to update a cellRenderer without un-mounting and re-mounting every cell in the column any time data updates?
Thanks in advance for the help and guidance!
...
this.state = {
columnDefs: [
{
headerName: "Editable Country",
editable: true,
field: "country",
width: 200
},
{
headerName: "Class Render",
cellRendererFramework: GridCellClass,
colId: "class-renderer",
width: 200
},
{
headerName: "Function Render",
cellRendererFramework: GridCellFunction,
colId: "function-renderer",
width: 200
}
],
rowData: []
};
}
...
<AgGridReact
rowModelType="infinite"
columnDefs={this.state.columnDefs}
enableColResize={true}
rowClassRules={{
california: function(params) {
return params.data.country === "California";
}
}}
onCellValueChanged={function(params) {
return params.api.refreshCells({
force: true,
columns: ["class-renderer", "function-renderer"]
});
}}
onGridReady={this.onGridReady.bind(this)}
rowData={this.state.rowData}
/>
...
// This one updates!
import React, { Component } from "react";
class GridCellClass extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
const { data } = this.props;
return (
<div>
{data.country === "California" ? "CALIFORNIA!!!" : "Not California"}
</div>
);
}
}
export default GridCellClass;
// This one does not update.
import React from "react";
function GridCellFunction(props) {
const { data } = props;
return (
<div>
{data.country === "California" ? "CALIFORNIA!!!" : "Not California"}
</div>
);
}
export default GridCellFunction;
Share
Improve this question
asked May 14, 2020 at 21:28
M WellmanM Wellman
731 gold badge1 silver badge5 bronze badges
1 Answer
Reset to default 51.Cell Renderer Function
A cell renderer function should be used when you dont have refresh requirements and this is mentioned in the ag-grid docs.
As per docs-
Use the function variant of a cell renderer if you have no refresh or cleanup requirements (ie you don't need to implement the refresh or destroy functions).
This is the reason why your cell renderer function does not refresh.
To solve your problem, you can do this -
onCellValueChanged={function(params) {
if(params.column.getId() === 'country') {
params.api.redrawRows();
}
}}
2.Cell Renderer Component
The reason your GridCellClass
works on api.refreshCells()
is because the grid handles the refresh()
for you since you have not implemented refresh()
in your GridCellClass
ponent.
What that means is your ponent will be destroyed and recreated if the underlying data changes.
3.RefreshCells
Also note that using api.refreshCells()
won't work as is because ag-grid uses change detection to refresh cells while determining what cells to refresh and since essentially the value of your other 2 columns do not change but infact they are changed in the cellRenderer itself.
However the below works for GridCellClass
because you disable change detection by passing force:true
,
params.api.refreshCells({
force: true
});
From docs-
Change detection will be used to refresh only cells who's display cell values are out of sync with the actual value. If using a cellRenderer with a refresh method, the refresh method will get called.
本文标签:
版权声明:本文标题:javascript - AG-Grid React, trouble getting custom cell renderer to update when data changes. Function components are behaving d 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1743927659a2563262.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论