目前流行的弹窗,不管是
<dialog visible="visible">
<user-dialog />
</dialog>
还是
<template>
<dialog visible="visible"></dialog>
</template>
<script>
visible = false
open(){
this.visible = true
}
close(){
this.visible = true
}
</script>
都难受至极。
第一种写法
- 在使用 dialog 的时候,dialog 就已经加载好了,但是我还不需要,所以造成不必要的资源浪费(可忽略),以及在代码里看着这堆东西太不优雅了
<dialog ref="dialog1" :visible="dialog1" />
<dialog ref="dialog2" :visible="dialog2" />
<dialog ref="dialog3" :visible="dialog3" />
<dialog ref="dialog4" :visible="dialog4" />
......
- visible 会留在调用组件里,调用者有 N 个 dialog 就有 N 个变量
data(){
return {
dialog1: false,
dialog2: false,
dialog3: false,
......
}
}
- 想在关闭 dialog 的时候做一些事情很难受,要么 watch dialog1~N 这个变量,要么给所有 dialog 写
<dialog @close="close" /> -
在关闭弹窗时,接收返回的变量很难受
<dialog :visible.sync="visible"> <user-dialog @close="close" /> </dialog> data(){ return { visible: true } } close(event){ console.log(event) this.visible = false }
第二种写法
-
一旦引入组件,组件便开始 mount 了,生命周期也执行了,如果调用者引入了 N 个 dialog ,那性能可想而知,还不如第一种写法
-
因失去了生命周期的特性,导致关闭弹窗的时候需要你自己重置数据,做清理
-
而且你开不能利用生命周期来做数据加载,因为你还没打开弹窗,90%的业务场景是没必要加载数据的,所以你还要在 open 里自己加载
-
还有一些问题我暂时想不起来,先略吧
忍了好久了,终于把 https://material.angular.io/components/dialog/overview 的 dialog 给挪过来了,所说不太完美,但是至少满足我的痛点了。
使用文档可以看我写的demo,API 参考的话可以看Dialog | Angular Material
各位如果也有同样的痛苦的话,可以 fork 到自己项目里去改一下就可以用了。
写得不是很完美,仅作为一个想法、思路。
ps:真的想吐槽手动初始化 Vue 这个过程,难受至极,离开了文档的操作,啥也不是。