同事在开发中遇到一个问题,使用 Ant Design Modal 的确认对话框,正常使用没有问题:
Modal.confirm({
content: 'w3h5.com',
onOk() {
console.log('OK');
},
onCancel() {
console.log('Cancel');
},
});使用 onCancel 方法的参数就不能关闭弹窗了:
Modal.confirm({
content: 'w3h5.com',
onOk() {
console.log('OK');
},
onCancel(a) {
console.log(a);
},
});最后在 GitHub 上面找到了解决方法:Modal.confirm在设置closable为true的情况下,onCancel传入的close函数参数为undefined #36581
当我们使用 Modal.method() 或 Modal.useModal() 打开弹窗时。
关闭弹窗有 3 种方式
点击蒙层关闭 [maskClosable=true]
ESC 关闭 [keyboard=true]
点击右上角图标关闭 [closable=true]
如果是 confirm 类型,footer 会多出一个取消按钮 (确定按钮等左边),此时关闭弹窗在前面 3 种方式中又多出一种,点击 取消 按钮关闭。
但是官方源码对于 前面 3 种关闭形式定义为 triggerCancel, 这时候不能通过 onCancel: function(close) 的第一个参数 close 去调用。
对于 confirm 类型弹窗,点击 取消 按钮这个行为才需要通过 close 方法手动关闭。
我 GET 到的官方设计目的是,前 3 种方式关闭,属于 antd 功能。不需要开发者手动 close, onCancel 则表示 点击遮罩层或右上角叉或ESC关闭的回调。
而 confirm 类型弹窗的 取消 按钮行为是开发需要关心的逻辑。所以交给开发者去手动 close。 前 3 种的 onCancel 还是正常执行。
对此我解决方法是多加一个判断(需要先修复 undefined问题),或者具体等官方具体解答一下设计场景。
const config = {
title: 'issues/36581',
closable: true,
content: <code>Test</code>,
onCancel(close) {
if(close && close.triggerCancel) {
// 前面 3 种关闭类型;点击遮罩层、右上角叉、ESC关闭 的回调
return;
}
// do something
close()
},
};
Modal.method(config)或者 Modal.useModal() 用法
// ... const [modal, contextHolder] = Modal.useModal(); modal.method(config) //..
另外一个粗暴的解决方案
const config = {
title: 'issues/36581',
closable: true,
content: <code>Test</code>,
onCancel(close) {
lodash.isFunction(close) && close()
},
};
Modal.method(config)未经允许不得转载:前端资源网 - w3h5 » Ant Design Modal.confirm使用onCancel方法无法关闭弹窗问题解决
前端资源网 - w3h5