iView Notice通知关闭后还能再打开吗?

UX树鹤 阅读 40

用iView的Notice.info做提示框,点击按钮第一次显示正常,但关闭后再点按钮就没了,控制台也没报错,这是怎么回事?

代码是这样写的:Notice.info({ title: '提示', desc: '内容', duration: 0 }),尝试过把duration改成5,但问题依旧存在。

难道这个组件只能弹一次?或者需要手动销毁?有没有办法让每次点击都能重新弹出?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
百里旭东
能 reopening 的,不是组件只能弹一次,是你每次调用 Notice.info 的时候其实创建了一个新的实例,但如果你之前没等它完全销毁或者重复用了同一个引用,就可能出现“点不动”的假象。

你贴的代码本身没问题,Notice.info({ title: '提示', desc: '内容', duration: 0 }) 是可以反复调用的。我猜你可能是把返回值存下来了,比如:

const notice = Notice.info({ title: '提示', desc: '内容', duration: 0 });


然后后面又去调用 notice.destroy() 或者重复操作,结果实例被关掉后没重新创建。

正确的做法是:每次点击都直接调用 Notice.info(...),不要缓存它的返回值,除非你明确要手动控制它。比如:

document.getElementById('btn').addEventListener('click', () => {
Notice.info({
title: '提示',
desc: '内容',
duration: 0 // 这个设为 0 就是不自动关闭,得手动关
});
});


如果确实要手动关,可以:

const n = Notice.info({ title: '提示', desc: '内容', duration: 0 });
setTimeout(() => {
n.destroy(); // 手动关掉
}, 3000);


但下次点按钮的时候再重新 Notice.info(...) 一次就行,别复用 n

我之前也踩过这个坑,以为它像 Modal 一样可以 show/hide,结果发现 Notice 是“一次性的”,但每次调用都会重新开一个,只要别自己手贱销毁完还复用引用就行。

希望能帮到你,如果还有问题可以再贴点你实际的代码片段,我帮你看看是不是其他地方的问题。
点赞 5
2026-02-26 19:09
Des.玉军
这个问题的核心在于 Notice 的使用方式。iView 的 Notice 组件默认是单例模式,也就是说同一个通知实例只会显示一次,关闭后不会重新渲染。

要解决这个问题,可以优化成每次点击按钮时都创建一个新的通知实例,而不是复用之前的实例。具体实现上,把 Notice.info 的调用放在一个函数里,每次点击按钮时调用这个函数即可。

代码可以写成这样:
function showNotice() {
Notice.info({
title: '提示',
desc: '内容',
duration: 0
});
}

// 假设你有一个按钮来触发通知
document.querySelector('#yourButton').addEventListener('click', function() {
showNotice();
});


这里的关键点是每次点击按钮都会调用 showNotice 函数,从而生成一个新的通知实例。这样即使之前的通知被关闭了,新的通知依然能够正常弹出。

如果你觉得每次都写函数有点麻烦,还可以封装一个更通用的方法,比如传入标题和内容作为参数,进一步提升代码的复用性。像这样:
function createNotice(title, desc) {
Notice.info({
title: title,
desc: desc,
duration: 0
});
}

// 使用时
document.querySelector('#yourButton').addEventListener('click', function() {
createNotice('提示', '内容');
});


这样做不仅解决了问题,还让代码更加优雅和灵活。如果以后需要调整通知的样式或者行为,只需要改 createNotice 函数就可以了。

最后吐槽一句,这种单例模式的设计虽然有它的道理,但确实容易让人踩坑,尤其是文档里没特别强调的时候。希望我的解答能帮你少走点弯路。
点赞 5
2026-02-19 14:01