uniapp全局弹窗APP做全局弹窗(dialog)插件的思路

uniapp全局弹窗APP做全局弹窗(dialog)插件的思路

💡 原文中文,约5500字,阅读约需14分钟。
📝

内容提要

该文章介绍了在uniapp中实现全局弹窗的方法。作者提到了三种方法,其中选择了第三种方法。文章详细介绍了如何创建一个dialog组件,并在页面中使用。同时,还介绍了如何在pages.json中配置页面和在main.js中使用插件。最后,作者展示了使用该插件的示例代码。

🔎

延伸解读

为何选择“伪弹窗”页面方案

文章指出uniapp无法直接操作DOM,因此install的DOM操作无法实现全局dialog。作者对比了三种方案:subnvue webview子窗体、plus.nativeObj.View,以及新建透明页面跳转。前两种“工有点大”,最终选择第三种。这种方案本质是打开一个背景透明的页面,视觉上像弹窗,但实际是页面跳转,适合不想引入原生视图或子窗体复杂度的项目。

透明页面配置的关键细节

在pages.json中配置dialog页面时,需要设置navigationStyle为custom,并在app-plus中指定animationType为fade-in、background和backgroundColor为transparent、webviewBGTransparent为true、mask为none。同时关闭popGesture和bounce,避免iOS侧滑关闭和回弹影响体验。这些配置共同保证弹窗页面以淡入方式出现且背景透明,否则可能露出页面底色或产生不必要的交互。

插件通信与防重复打开机制

dialog.js插件通过Vue.prototype.$dialog暴露全局方法,内部使用Promise封装。跳转前会检查当前页面路由是否为dialog页面,防止在弹窗上再开弹窗。跳转时用encodeURIComponent传递JSON参数,并通过uni.$once监听$dialog事件。确认时resolve一个navigateBack函数,取消时reject。调用方用then和catch分别处理确认与取消,结构清晰但需注意事件只监听一次。

❓

Q&A

如何在uniapp中实现全局弹窗?

可以通过创建一个dialog组件并在pages.json中配置页面来实现全局弹窗。

uniapp中无法直接操作DOM,如何解决全局dialog的问题?

可以选择创建一个新页面作为伪弹窗,使用透明背景来模拟弹窗效果。

dialog组件的基本结构和样式是怎样的?

dialog组件包含标题、内容和确认/取消按钮,样式使用SCSS定义。

如何在main.js中使用dialog插件?

在main.js中导入dialog插件并使用Vue.use(dialogPlugin)进行注册。

如何调用全局弹窗并处理用户的确认或取消操作?

使用this.$dialog方法调用弹窗,并通过then和catch处理用户的确认或取消操作。

在pages.json中如何配置dialog页面的路径和样式?

在pages.json中添加dialog页面的路径,并设置navigationStyle为custom和背景透明等样式。

🏷️

标签

➡️

继续阅读