vue element-ui message或this.$message 主动关闭

ヤッハロー、Kaiqisanすうう、一つふつうの学生プログラマである, 在我实际的项目过程中,赶巧不巧碰到服务器特别迟缓的时候,有时候在向后端请求信息的时候,会卡顿特别久才能弹出“提交成功”,在提交成功弹出之前,页面就一直僵持在那里,这对用户非常不友好,于是,借此机会,我打算增加一个加载中动画效果。于是,我打算使用element-ui 的 message 功能模块来做一个“加载中”效果,提示用户的信息正在提交中。

简答

this.$message.close() // 不行
let msg = this.$message({
	....
})
msg.close() // 行

详解

this.$message({
	duration: 0,   // 设置为0就可以使永久停留
	type: 'warning',
	message: '等待中....'
})

现在,信息加载已经完成了,我现在要把这个弹出框关掉

this.$message.close() // 官网指定方法

然而这样并不行,因为您还给这个弹出框指定一个参数来接收,所以它是匿名的,上面的方法并不能找到需要关闭的弹出框。就像setTimeout方法一样,如果没有一个接收的参数,它就永远无法被销毁。

let timer = setTimeout(() => {
    console.log('ok')
    clearTimeout(timer) // 找到计时器传入的参数就可以删除,否则就无法删除。
}, 1000)

所以,下面这种方法才是OK的。

// 点击按钮后触发
openMsg() {
    this.msg = this.$message({ // 需要一个参数接收这个$message(msg来自data)
        duration: 0,
        type: 'warning',
        message: '等待中....'
    })
    // 使用延时器来模拟请求的异步方法
    setTimeout(() => {
        this.msg.close()  // 这样才能正确关闭
        this.msg = this.$message({
            duration: 1000,
            type: 'success',
            message: '提交成功'
        })
    }, 2000)
}

显示效果
msg-gif

下面为更加完美的方法,更加适用于项目,程序也更加健壮----页面只能容许一个弹出框的存在。克服了 message 中 close() 只能关闭一个弹框的缺点。

openMsg() {
    if (this.status) { // 为事件加锁,点击之后,在动作没有完成之前不允许再次触发事件
        this.status = false
        if (this.msg) {	// 防止第一次点击报错
		    this.msg.close()
		}
        this.msg = this.$message({
            duration: 0,
            type: 'warning',
            message: '等待中....'
        })
        setTimeout(() => {
            this.msg.close()
            this.msg = this.$message({
                duration: 1000,
                type: 'success',
                message: '提交成功'
            })
            this.status = true
        }, 2000)
    }
}

展示效果
msg-2

总结

给大伙一个建议,如果觉得官方文档的方法失效的话,请第一时间去百度,验证自己的方法是否有误(大半的错误是自己引起的),如果百度有解决方法的话就直接拿过来,吃个教训;如果没有的话就去专业社区寻求求助,或者去专门讨论这个专项内容的群里面寻找解决方案。

Logo

前往低代码交流专区

更多推荐