问题
在 Bootstrap 5.1 中,如果使用 fade 渐进动画的 Modal 后,如:
<div class="modal fade">
...
</div>
在发生 Vue 页面跳转时,窗口虽然消失,但遮罩仍然会存在,导致新的路由页面你无法使用,如下图所示:
原因
由于 Vue 是单页面应用,在发生 Vue-Router 路由跳转时,并不是发生真正的页面跳转。
因此 Boostrap 的遮罩 DOM 仍然会保留在 body 当中,即:
解决
知道问题的原因解决也非常简单,只需要在新路由组件的 Vue 的 created 的生命周期方法中,将这两个 DOM 移除即可。
参考代码:
created() {
let body = document.getElementsByTagName("body")[0]
let deleted = []
for (let i = 0; i < body.children.length; i++) {
let child = body.children[i]
if (child.className.startsWith('modal-backdrop')) {
deleted.push(child)
}
}
deleted.forEach(e => body.removeChild(e));
}