终于把 Vue 的 Dialog 给整舒服了

2022-08-11 15:26:06 +08:00
 wunonglin

目前流行的弹窗,不管是

<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,
		......
	}
}

第二种写法

忍了好久了,终于把 https://material.angular.io/components/dialog/overview 的 dialog 给挪过来了,所说不太完美,但是至少满足我的痛点了。

使用文档可以看我写的demo,API 参考的话可以看Dialog | Angular Material

各位如果也有同样的痛苦的话,可以 fork 到自己项目里去改一下就可以用了。

写得不是很完美,仅作为一个想法、思路。

ps:真的想吐槽手动初始化 Vue 这个过程,难受至极,离开了文档的操作,啥也不是。

1246 次点击
所在节点    Vue.js
11 条回复
swordne
2022-08-11 16:18:22 +08:00
vant 的 dialog 还行啊。
wunonglin
2022-08-11 16:24:48 +08:00
@swordne #1 vant 的调用的方式,还是没逃脱我上文说的这两种写法
corcd
2022-08-15 03:35:17 +08:00
你可以挂 ref 然后把 visible 状态维持在 dialog 内部,用 open 和 close 方法去修改 visible 就好了,就是不太符合数据驱动的思路
wunonglin
2022-08-15 03:43:42 +08:00
@corcd #3 你这种就是我列出的第二种写法,弊端我上文写了。还是没人能跳出这两种思路
gausszhou
2022-08-16 09:49:57 +08:00
我这之前是直接用了 v-if 了, 然后 在 dialog 内 created 和 mounted 进行 接口数据调用和 ref 操作 /(ㄒoㄒ)/~~
chenjiangui998
2022-08-28 01:59:27 +08:00
直接用 v-if 代替 visible 啊, 关闭直接 emit('close'), 不用管是否实际关闭
wunonglin
2022-08-28 03:09:56 +08:00
@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 ,做的很优雅,对你应该挺有帮助的
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>

```
chenjiangui998
2022-08-28 14:16:53 +08:00
@wunonglin
看了, 这个相当于实现了个公用 dialog, 切换内部内容, 而且要用 rxjs 和事件驱动, 我觉得不如直接状态驱动简单干脆,
```
const dialog = {
show: true,
components: 'xxx1',
props: {}
}

<dialog :visible="dialog.show" @close="xxx">
<component :is="dialog.components" v-bind="props"></component>
</dialog>

```
刚回车了, 我觉得这个和你发的那个没啥区别, 而且还是状态驱动的
wunonglin
2022-08-28 14:18:07 +08:00
@chenjiangui998 #8 确实是简单了。不过太不优雅了
wunonglin
2022-08-28 14:21:32 +08:00
@chenjiangui998 #9 目前我在公司内部用着我写的这个了,体验和 ng 的一样,还不错。后面打算去掉 element ,自己实现个 layout 层,这样体验会更好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX