Redux Store数据加载延迟导致AG Grid表格无法填充及编辑后组件不更新的解决方案求助
问题1:Redux数据延迟加载后表格未更新
你当前的updateData只在onGridReady中执行了一次,但onGridReady仅在AG Grid初始化时触发。当Redux中的rules从空变为有效数据时,组件虽然会因为useSelector拿到新值而重渲染,但此时onGridReady不会再次执行,所以rowData状态没有被更新,表格自然不会刷新。
你提到尝试过useEffect但没生效,大概率是依赖项没配置正确。试试下面的修改:
const DisplayRules = () => { const rules = useSelector(({rules}) => rules.data); const dispatch = useDispatch(); const [gridApi, setGridApi] = useState(null); const [gridColumnApi, setGridColumnApi] = useState(null); const [rowData, setRowData] = useState(rules); // 监听rules的变化,自动更新rowData和表格 useEffect(() => { if (rules) { setRowData(rules); // 如果表格已初始化,直接通过gridApi刷新数据 gridApi?.setRowData(rules); } }, [rules, gridApi]); // 必须把rules和gridApi加入依赖项 const onGridReady = (params) => { setGridApi(params.api); setGridColumnApi(params.columnApi); // 初始化时如果已有数据,直接设置表格数据 rules && params.api.setRowData(rules); }; // 其余代码保持不变... };
更简洁的方式可以省去中间的rowData状态,直接把rules传给表格的rowData属性:
<AgGridReact // ...其他props rowData={rules || []} // 用空数组避免初始null导致的渲染问题 // ...其他props >
这样只要Redux中的rules更新,表格会自动接收新数据,不用手动维护rowData状态。
问题2:Edit Section修改后组件不自动重渲染
要实现编辑后自动刷新,核心是确保修改操作最终更新了Redux中的rules状态。因为你的组件通过useSelector订阅Redux状态,只要Redux里的rules变化,组件就会自动重渲染,表格也会同步更新。
假设你的EditSection是用来修改单条规则的,在编辑完成后需要dispatch一个action更新Redux中的对应数据,而不是只修改本地数据:
// 在EditSection组件中 const handleSave = (updatedRule) => { // dispatch action更新Redux中的rules dispatch(updateRule(updatedRule)); };
另外,你当前给cellRendererParams传递gridApi的方式有问题:gridApi是组件状态,当它变化时,cellRenderer不会自动重新初始化(AG Grid的cellRenderer仅在行数据变化时更新)。更好的方式是直接从cellRenderer的params中获取gridApi:
// EditSection组件内部 const EditSection = (props) => { // 直接从props.params拿到当前表格的api const gridApi = props.params.api; // 你的编辑逻辑... };
然后在父组件中去掉cellRendererParams的配置:
<AgGridColumn headerName= "Edit" field="Edit" cellRenderer= 'EditSection' />
这样当Redux中的rules更新后,useSelector会拿到新数据,组件重渲染,表格的行数据更新,EditSection也会同步拿到最新的行信息,实现自动刷新。
总结关键要点:
- 要么用
useEffect监听Redux状态变化同步表格数据,要么直接将Redux状态作为表格的rowData - 编辑操作必须触发Redux状态更新,依赖Redux的订阅机制触发组件重渲染
- 避免通过props传递
gridApi给cellRenderer,直接从cellRenderer的params中获取更可靠
内容的提问来源于stack exchange,提问作者jannisonay

