J'utilise AG-Grid dans une application react, et dans plusieurs cas, je veux qu'un cellRenderer se mette à jour lorsque les données de la grille changent. Dans les deux cas suivants, le cellRenderer se charge correctement au départ, mais ne se met pas à jour lorsque les données changent :
- Un utilisateur édite une cellule modifiable et en change la valeur.
- Le serveur met à jour les données de la grille en redux
Regarde ça codesandbox
Dans cet exemple, j'ai recréé le premier cas d'utilisation avec une cellule modifiable, et j'ai utilisé un composant de classe et un composant de fonction. En utilisant onCellValueChanged avec params.api.refreshCells(), j'ai réussi à mettre à jour le composant de classe, mais pas le composant de fonction.
Première question : Comment faire en sorte que les composants de fonction react soient rendus avec de nouveaux props, de la même manière que le composant de classe dans l'exemple codesandbox ?
Deuxième question : Existe-t-il un meilleur moyen de mettre à jour un cellRenderer sans démonter et remonter chaque cellule de la colonne à chaque mise à jour des données ?
Merci d'avance pour votre aide et vos conseils !
...
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;