内容提要
该文章介绍了在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和背景透明等样式。