AgGridReact单元格校验失败如何还原旧值?stopEditing失效问题
问题原因定位
你调用stopEditing(true)无效的核心是事件触发时序与API的生效条件不匹配:
stopEditing(cancel=true)仅在单元格处于活跃编辑状态、新值尚未提交到网格行数据时生效,调用后会直接丢弃编辑器内的输入内容,还原为编辑前的旧值。- 你使用的
onCellValueChanged是编辑完全结束后的回调:AgGrid会先把用户输入的新值写入绑定的行数据、完成表格渲染,之后才会触发这个事件。此时编辑状态已经终止,没有可取消的活跃编辑会话,调用stopEditing自然不会有任何效果。
正确实现方案
根据校验需求的不同,有两种常用的可落地方案:
方案一:编辑完成后校验回退(简单易实现,适合绝大多数场景)
利用onCellValueChanged事件自带的oldValue、node参数直接回退值,不需要依赖stopEditing:
const onCellValueChanged = (event) => { // 这里替换为你的自定义校验规则,支持同步/异步逻辑 const validateResult = yourCustomValidateRule(event.newValue); // 校验不通过时,直接把单元格值改回旧值 if (!validateResult) { // 直接更新行节点的对应字段为旧值 event.node.setDataValue(event.colDef.field, event.oldValue); // 若需要强制刷新单元格显示,可补充调用刷新接口 event.api.refreshCells({ rowNodes: [event.node], columns: [event.colDef.field] }); // 可在此处补充错误提示逻辑 } }
补充说明:
- AgGrid会自动判断
setDataValue传入的新旧值是否一致,值未发生变化时不会重复触发onCellValueChanged,因此不会出现无限循环的问题。- 如果你的校验逻辑需要调用接口做异步判断,也可以把
onCellValueChanged改成异步函数,等待校验结果返回后再执行回退逻辑即可。
方案二:编辑过程中实时拦截(体验更好,适合需要提前拦截非法输入的场景)
如果你希望用户输入非法内容时直接终止编辑,不提交任何内容,就需要在编辑活跃期调用stopEditing,可以通过列配置的编辑器参数实现:
// 列定义配置 const columnDefs = [ { field: 'age', // 替换为你的业务字段名 editable: true, cellEditor: 'agTextCellEditor', cellEditorParams: { // 监听编辑器输入事件,实时校验 onInput: (e) => { const inputValue = e.target.value; // 替换为你的校验规则,比如要求年龄为正整数 if (isNaN(inputValue) || Number(inputValue) <= 0) { // 此时处于活跃编辑状态,调用stopEditing(true)可正常生效 gridApi.current.stopEditing(true); // 可在此处补充错误提示逻辑 } } } } ]
该方案的优势是不会先把非法值渲染到表格上再回退,没有视觉闪烁问题。
内容的提问来源于stack exchange,提问作者CodeMonkey
相关产品推荐
相关产品推荐

