目前流行的弹窗,不管是
<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 ref="dialog1" :visible="dialog1" />
<dialog ref="dialog2" :visible="dialog2" />
<dialog ref="dialog3" :visible="dialog3" />
<dialog ref="dialog4" :visible="dialog4" />
......
data(){
return {
dialog1: false,
dialog2: false,
dialog3: false,
......
}
}
<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 这个过程,难受至极,离开了文档的操作,啥也不是。
1
swordne 2022-08-11 16:18:22 +08:00
vant 的 dialog 还行啊。
|
3
corcd 2022-08-15 03:35:17 +08:00 via iPhone
你可以挂 ref 然后把 visible 状态维持在 dialog 内部,用 open 和 close 方法去修改 visible 就好了,就是不太符合数据驱动的思路
|
5
gausszhou 2022-08-16 09:49:57 +08:00
我这之前是直接用了 v-if 了, 然后 在 dialog 内 created 和 mounted 进行 接口数据调用和 ref 操作 /(ㄒoㄒ)/~~
|
6
chenjiangui998 2022-08-28 01:59:27 +08:00
直接用 v-if 代替 visible 啊, 关闭直接 emit('close'), 不用管是否实际关闭
|
7
wunonglin OP @chenjiangui998 #6
这么做的话其实和上述第一种写法没什么区别。 假设 A 里面有 B ,C 两个 dialog: 传值的的时候在 A 里定义一个变量去传递给下级,有 N 个 dialog 就会有 N 个变量,不优雅且难管理。 假如 B ,C 两个都是使用同一个变量的话,加上 ts 的话这个变量定义会变得又臭又长,例如 dialogData: TypeB | TypeC | .... = null ,你需要手动管理这个变量,用起来也会很糟心。 其实作为初始化 dialog 的 data 是没必要在当前组件定义变量的,太啰嗦了。 接收 dialog 事件的问题如上。 ----------- 我目前接手过的 vue 项目 100%都是上述两种写法,如果写的人有心去写好的话,那也问题不大(也难受就是了),但不知道什么原因,每个地方都是写的流水账一样,一个 dialog 有 n 个需要传递的变量,还有 n 个接收 event 的方法,还没类型,全写在父组件上,父组件还不只一个 dialog ,不知道是不是 vue 就是推崇这种写法的还是怎么的,看到 vue 主流的的 ui 都是这样的 ----------- 你可以看下 https://material.angular.io/components/dialog/overview ,做的很优雅,对你应该挺有帮助的 |
8
chenjiangui998 2022-08-28 14:14:43 +08:00
@wunonglin 看了, 这个相当于实现了个公用 dialog, 切换内部内容, 而且要用 rxjs 和事件驱动, 我觉得不如直接状态驱动简单干脆,
``` const dialog = { show: true, components: 'xxx1', } <dialog :visible="dialog.show"> <component></component> </dialog> ``` |
9
chenjiangui998 2022-08-28 14:16:53 +08:00
|
10
wunonglin OP @chenjiangui998 #8 确实是简单了。不过太不优雅了
|
11
wunonglin OP @chenjiangui998 #9 目前我在公司内部用着我写的这个了,体验和 ng 的一样,还不错。后面打算去掉 element ,自己实现个 layout 层,这样体验会更好
|