如何将Ant Design Table行数据传递到Modal并在确认操作时使用
排查步骤
- 先校验传入的原始数据是否正常
在showModal方法内添加打印逻辑,确认触发点击时拿到的record不是空值:
const showModal = (record) => { console.log('接收的行数据:', record) setModalTaskId(record); setVisible(true); };
如果此处打印为空,检查Table组件的dataSource配置、行数据映射逻辑即可。
解决方法
如果showModal拿到的record正常,可通过以下两种方式修复取值为空的问题:
方式1:直接传参调用,避开状态依赖
修改Modal的onOk回调,直接将当前状态里的modalTaskId作为参数传入handleOk,无需在handleOk内部依赖状态取值:
// Modal组件修改 <Modal visible={visible} onOk={() =>{handleOk(modalTaskId)}} confirmLoading={confirmLoading} onCancel={handleCancel} > <p>{modalText}</p> </Modal>
对应修改handleOk接收参数:
const handleOk = async (taskId) => { console.log('modalTaskId: ', taskId) // 后续删除逻辑直接使用taskId即可 }
方式2:修正状态清空的时机
如果你的handleCancel或者确认逻辑执行完后会清空modalTaskId,不要和关闭弹窗的操作同步执行,避免状态更新优先级导致取值异常:
// 错误的清空逻辑 const handleCancel = () => { setModalTaskId(undefined) setVisible(false) } // 正确的清空逻辑,等弹窗关闭后再清空状态 const handleCancel = () => { setVisible(false) // 延迟清空,适配Ant Design Modal的关闭动画时长 setTimeout(() => setModalTaskId(undefined), 300) } // handleOk执行完业务逻辑后再清空状态 const handleOk = async () => { console.log('modalTaskId: ', modalTaskId) // 执行删除请求等业务逻辑 await deleteApi(modalTaskId) setVisible(false) setModalTaskId(undefined) }
额外注意事项
useState必须声明在函数组件的最顶层,不能放在条件判断、循环、嵌套函数内部- 确认组件没有重复声明
modalTaskId变量,避免作用域覆盖
内容的提问来源于stack exchange,提问作者seyet
相关产品推荐
相关产品推荐

