为什么我的Notification通知组件设置duration后无法自动关闭? 端木东宇 提问于 2026-02-04 17:47:28 阅读 40 组件 我在用Ant Design的Notification组件时,设置了duration为3秒,但提示框完全不自动消失。已经检查过代码,组件参数应该没错: <notification open message="操作成功" description="数据已保存" type="success" duration={3} /> 尝试过手动调用close方法可以关闭,但自动关闭功能就是不起效。控制台也没有报错信息,这是什么情况啊? 我来解答 赞 5 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 开发者金利 Lv1 你这个情况我遇到过,Ant Design 的 Notification 组件如果用了受控模式,是不会自动关闭的。问题就出在你用了 open 这个受控属性。 Notification 默认是受控组件,也就是说一旦你用了 open 控制显示隐藏,那 duration 就不会生效,必须手动调用 close 才能关掉。这是官方文档里没太说清楚的一个坑。 要解决这个问题有两个办法。第一是别用 open 控制,直接通过调用 notification.open() 来显示,这样 duration 就正常了。第二个是如果你一定要用 open 控制,那就得自己搞个定时器在 duration 时间后把 open 设为 false。 比如这样: const [open, setOpen] = useState(true); useEffect(() => { if (open) { const timer = setTimeout(() => { setOpen(false); }, 3000); return () => clearTimeout(timer); } }, [open]); return ( open={open} message="操作成功" description="数据已保存" type="success" /> ); 性能上来说两种方式差不多,但第一种更符合组件的默认行为,也少写点逻辑。除非你有特别需要受控的情况,不然建议用 notification.open() 方法来触发。 回复 点赞 2 2026-02-08 03:01 Mc.兰兰 Lv1 这个问题我之前也踩过。Ant Design 的 Notification 组件的 duration 是以秒为单位接收一个数字,但你这个写法其实传的是个对象:duration={3},这在 React 中会被当作对象引用,组件内部判断类型的时候发现不是 number 就忽略掉了,但不会报错。 你试试改成直接传值: <Notification open message="操作成功" description="数据已保存" type="success" duration={3000} /> 或者更稳妥的写法: <Notification open message="操作成功" description="数据已保存" type="success" duration={3000} /> 另外,如果你用的是 Ant Design v4 之后的版本,注意 notification.open() 这种函数式调用方式的 duration 单位是毫秒,这点官方文档其实也没写得很清楚,容易搞混。 建议你打印一下 antd 的版本,确认一下是否符合预期。我当时就是因为版本升级后默认单位变了,线上突然一堆 notification 不关闭,排查了好久才发现是这个坑。 回复 点赞 7 2026-02-04 18:03 加载更多 相关推荐
Notification 默认是受控组件,也就是说一旦你用了 open 控制显示隐藏,那 duration 就不会生效,必须手动调用 close 才能关掉。这是官方文档里没太说清楚的一个坑。
要解决这个问题有两个办法。第一是别用 open 控制,直接通过调用 notification.open() 来显示,这样 duration 就正常了。第二个是如果你一定要用 open 控制,那就得自己搞个定时器在 duration 时间后把 open 设为 false。
比如这样:
const [open, setOpen] = useState(true);
useEffect(() => {
if (open) {
const timer = setTimeout(() => {
setOpen(false);
}, 3000);
return () => clearTimeout(timer);
}
}, [open]);
return (
message="操作成功"
description="数据已保存"
type="success"
/>
);
性能上来说两种方式差不多,但第一种更符合组件的默认行为,也少写点逻辑。除非你有特别需要受控的情况,不然建议用 notification.open() 方法来触发。
duration是以秒为单位接收一个数字,但你这个写法其实传的是个对象:duration={3},这在 React 中会被当作对象引用,组件内部判断类型的时候发现不是 number 就忽略掉了,但不会报错。你试试改成直接传值:
或者更稳妥的写法:
另外,如果你用的是 Ant Design v4 之后的版本,注意
notification.open()这种函数式调用方式的duration单位是毫秒,这点官方文档其实也没写得很清楚,容易搞混。建议你打印一下 antd 的版本,确认一下是否符合预期。我当时就是因为版本升级后默认单位变了,线上突然一堆 notification 不关闭,排查了好久才发现是这个坑。