我如何*可预见地*标记 AG-Grid React 中已更改的单元格?
How can I *predictably* mark changed cells in AG-Grid React?
我在 React 中有一个使用 AG-grid 组件的功能组件,大致如下所示:
import React, { useRef } from 'react'
import { AgGridReact } from 'ag-grid-react'
export default function FormEditor(props) {
.... code for fetching data etc. goes here ...
// create ref to be able to call ag-grid.api on our spreadsheet
const editFormRef = useRef()
// can we log the row data to the console? Yes!
function logData() {
if (!editFormRef.current.api) {
return
}
const rowCount = editFormRef.current.api.getDisplayedRowCount()
for (let i = 0; i < rowCount; i++) {
const rowNode = editFormRef.current.api.getDisplayedRowAtIndex(i)
console.log(`row ${i + 1} -> `, rowNode.data)
// Perform your logic
}
}
// will the data that's changed be highlighted? Maybe, on the second go...
function markCellChanged(params) {
if (!editFormRef.current.api) {
return
}
const row = editFormRef.current.api.getDisplayedRowAtIndex(params.rowIndex)
console.log('markCellChanged() called ')
if (params.oldValue !== params.newValue) {
params.colDef.cellStyle = function(params) {
return { backgroundColor: '#6fcc44', transparency: 0.5 }
}
console.log('Redrawing row ', row)
editFormRef.current.api.redrawRows({ rowNodes: [row] })
}
}
return (
<React.Fragment>
<AgGridReact
ref={editFormRef}
rowSelection="multiple"
columnDefs={columns}
rowData={rows}
rowDragManaged={true}
components={{ editCellEditor: ReviewCellEditor }}
// editType="fullRow"
enableFillHandle={true}
/>
<Button variant="contained" onClick={() => logData()}>
Log Data
</Button>
</React.Fragment>
)
}
问题是它确实有效,但仅限于第二次。如果该列中的单元格已被编辑,它也可以工作。
这不是我想要的最终位置,因为我想根据提供的原始行检查数据,而不仅仅是单元格中最后更改的值。我只是认为最好从小处着手,然后构建 ;-)
任何人都可以解释这种行为,让我知道哪里出错了吗?
我在 Angular 中使用 ag-grid,而不是 React,但在我看来你不应该更改 columnDef 的 cellStyle,因为 应该 适用到整个专栏。
如果您只想更改一个单元格的样式,AFAIK,正确的方法是为 colDef.cellClassRules 提供一个函数字典。键是 css class 名称,值是采用单元格值和 return 指示是否应将 class 应用于单元格的布尔值的函数,如:
cellClassRules: {
// apply green to 2008
'rag-green-outer': function(params) { return params.value === 2008},
// apply amber 2004
'rag-amber-outer': function(params) { return params.value === 2004},
// apply red to 2000
'rag-red-outer': function(params) { return params.value === 2000}
}
请参阅 https://www.ag-grid.com/javascript-grid-cell-styles/#cell-class-rules
中的文档
我在 React 中有一个使用 AG-grid 组件的功能组件,大致如下所示:
import React, { useRef } from 'react'
import { AgGridReact } from 'ag-grid-react'
export default function FormEditor(props) {
.... code for fetching data etc. goes here ...
// create ref to be able to call ag-grid.api on our spreadsheet
const editFormRef = useRef()
// can we log the row data to the console? Yes!
function logData() {
if (!editFormRef.current.api) {
return
}
const rowCount = editFormRef.current.api.getDisplayedRowCount()
for (let i = 0; i < rowCount; i++) {
const rowNode = editFormRef.current.api.getDisplayedRowAtIndex(i)
console.log(`row ${i + 1} -> `, rowNode.data)
// Perform your logic
}
}
// will the data that's changed be highlighted? Maybe, on the second go...
function markCellChanged(params) {
if (!editFormRef.current.api) {
return
}
const row = editFormRef.current.api.getDisplayedRowAtIndex(params.rowIndex)
console.log('markCellChanged() called ')
if (params.oldValue !== params.newValue) {
params.colDef.cellStyle = function(params) {
return { backgroundColor: '#6fcc44', transparency: 0.5 }
}
console.log('Redrawing row ', row)
editFormRef.current.api.redrawRows({ rowNodes: [row] })
}
}
return (
<React.Fragment>
<AgGridReact
ref={editFormRef}
rowSelection="multiple"
columnDefs={columns}
rowData={rows}
rowDragManaged={true}
components={{ editCellEditor: ReviewCellEditor }}
// editType="fullRow"
enableFillHandle={true}
/>
<Button variant="contained" onClick={() => logData()}>
Log Data
</Button>
</React.Fragment>
)
}
问题是它确实有效,但仅限于第二次。如果该列中的单元格已被编辑,它也可以工作。
这不是我想要的最终位置,因为我想根据提供的原始行检查数据,而不仅仅是单元格中最后更改的值。我只是认为最好从小处着手,然后构建 ;-)
任何人都可以解释这种行为,让我知道哪里出错了吗?
我在 Angular 中使用 ag-grid,而不是 React,但在我看来你不应该更改 columnDef 的 cellStyle,因为 应该 适用到整个专栏。
如果您只想更改一个单元格的样式,AFAIK,正确的方法是为 colDef.cellClassRules 提供一个函数字典。键是 css class 名称,值是采用单元格值和 return 指示是否应将 class 应用于单元格的布尔值的函数,如:
cellClassRules: {
// apply green to 2008
'rag-green-outer': function(params) { return params.value === 2008},
// apply amber 2004
'rag-amber-outer': function(params) { return params.value === 2004},
// apply red to 2000
'rag-red-outer': function(params) { return params.value === 2000}
}
请参阅 https://www.ag-grid.com/javascript-grid-cell-styles/#cell-class-rules
中的文档