首先,因为小程序没有app.wxml,所以自定义弹窗必须写成组件,除非应用微信自带的弹窗。
// login.wxml<view class="login-dialog-wrap" wx:if="{{showPhoneDialog}}"> <view class="login-dialog-cover"></view> <view class="login-dialog-container"> <view class="login-dialog-content"> <view class="login-dialog-title text-center color33">受权登录</view> <view class="text-center">您好,受权微信手机登录即可及时</view> <view class="text-center">获取本店最新优惠资讯哦~</view> <button class="login-dialog-button" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> 立刻受权 </button> </view> <view class="iconfont icon-guanbi login-dialog-close" bindtap="closePhoneDialog"></view> </view></view>
// loginDialog.jsComponent({ data: { showPhoneDialog: false, isTabBarPage: false }, lifetimes: { attached() { // 判断以后页面是否为tabBar页面 // 非tabBar页执行hideTabBar()报错 let pages = getCurrentPages() //获取加载的页面 let currentPage = pages[pages.length - 1] //获取以后页面的对象 let url = currentPage.route //以后页面url this.setData({ isTabBarPage: app.tabBarPages.includes(url + '.html') }) } }, properties: { // 手机号受权弹窗 phoneDialog: { type: Boolean, observer(val) { setTimeout(() => { this.setData({ showPhoneDialog: val }) if (val) { this.hideTab() } }, 500) } } }, methods: { // 手机号受权胜利回调 getPhoneNumber(e) { this.setData({ showPhoneDialog: false }) this.showTab() if (e.detail.errMsg.includes('fail')) { // 回绝受权 this.triggerEvent('callback', { type: 'phoneNumber', val: false }) } else { let detail = e.detail // dosomething } }, closePhoneDialog() { this.setData({ showPhoneDialog: false }) this.showTab() this.triggerEvent('callback', { type: 'phoneNumber', val: false }) }, showTab() { if (!this.data.isTabBarPage) return wx.showTabBar() }, hideTab() { if (!this.data.isTabBarPage) return wx.hideTabBar() } }})
写好弹窗组件后,全局引入
// app.json"usingComponents": { "login-dialog": "/components/loginDialog/loginDialog"}
弹窗的显示管制就交给Mixin
export default { data: { phoneDialog: false }, onLoad() { // 基于某些判断后,更改phoneDialog为true }, // 执行某些接口后盾返回须要登录时,可通过this.mixinNeedLogin弹出受权弹窗 mixinNeedLogin() { this.setData({ phoneDialog: false }) setTimeout(()=>{ this.setData({ phoneDialog: true }) },0) }}