位置: IT常识 - 正文

微信小程序做全局登录弹窗(微信小程序全栈开发实战)

编辑:rootadmin
微信小程序做全局登录弹窗

推荐整理分享微信小程序做全局登录弹窗(微信小程序全栈开发实战),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:微信小程序怎么做csdn,微信小程序的做法,微信小程序制作即速应用更放心,微信小程序的做法,微信小程序全栈开发实战,微信小程序怎么做csdn,微信小程序全栈开发实战,微信小程序全局方法,内容如对您有帮助,希望把文章链接给更多的朋友!

需求:在任意需要弹出登录的页面,后台返回需要登录状态码,弹出登录弹窗进行登录,并刷新当前页面 过程:因为微信小程序无法封装一个全局组件通过方法全局调用。因此只能封装一个公共组件,在需要弹窗的页面注册并挂载,可以在app.json中全局注册(此处有问题后面会讲到),在需要弹窗的页面就无需注册,直接挂载即可。 效果:

1. 第一步,封装全局弹窗组件

注意:封装弹窗组件踩的第一个坑,我当时使用到了微信小程序的page-container组件,使用show来控制弹窗的显示与隐藏,在全局注册并使用分包的情况下,小程序会报一个错误 大致意思就是page-container组件只能有一个实例,这个问题出现在,当你在A包页面登录完成之后,把token置为过期,再进入B包需要登录的页面的时候,,弹窗无法弹窗并会报这个错误。

弹窗组件代码

<!--components/LoginPopup/LoginPopup.wxml--><!-- 这里就会出现上面的问题 --><!-- <page-container show="{{show}}" position="center" overlay-style="width:200rpx" custom-style="background:transparent;" z-index="99999"> --><!-- 解决方法,直接用view替换掉page-container,用wx:if控制显隐,效果是一样的 --><view class="container-box" wx:if="{{show}}"> <view class="popup-box flex-c h--100 w--100"> <view class="popup-content"> <view class="br-10 bag-fff"> <view class="popup-top flex flex-y ju-c pad-l-40"> <text class="c-333 fs-20 wt-600">登录</text> <text class="c-ccc fs-16">Login</text> </view> <view class="popup-bot pad-20 box-bor mar-t-4"> <button class="w--100 btn-style1 fs-14 flex-c bag-46D2A1 c-fff br-8 wt-400" bindtap="login">微信一键登录</button> <!-- <button class="w--100 btn-style1 fs-14 flex-c bag-46D2A1 c-fff br-8 wt-400" open-type="getPhoneNumber" type="primary" bindgetphonenumber="onGetPhoneNumber">微信一键登录</button> --> <!-- <button class="w--100 btn-style2 fs-14 flex-c mar-t-16 bag-fff c-999 br-8 wt-400">手机号登录/注册</button> --> <view class="fs-10 flex al-c mar-t-18 line-1 c-ccc" bindtap="setAgree"> <text wx:if="{{agree}}" class="iconfont icon-44xuanze-2 c-46D2A1 line-1 fs-12 mar-r-2"></text> <text wx:else class="iconfont icon-xuanzhong c-999 line-1 fs-12 mar-r-2"></text> <text>登录代表您已同意</text> <text class="c-46D2A1" data-type="1" catchtap="goWebView">xxx用户协议 、</text> <text class="c-46D2A1" data-type="2" catchtap="goWebView">隐私协议</text> </view> </view> </view> <view class="line mar-auto"></view> <image bindtap="closePopup" class="close-btn mar-auto" src="https://www.yuucn.com/wp-content/uploads/2023/05/1683029438-3abe2494ab7c4bd.png" mode=""/> </view> </view></view><!-- </page-container> -->// components/LoginPopup/LoginPopup.ts// 引入刷新当前页面的公共方法,后面有讲到import { refreshPage } from '../../utils/util'Component({ // 这里可有可无,因为碰到一个需求,在首页不需要一进来就弹出登录弹出, // 但是点击banner图跳到外部链接的时候需要登录,因此我加了一个属性isShow properties: { isShow:Number }, data: { // 控制弹窗显隐的属性 show: false }, // 这里可以忽略,自己业务需求 attached(){ const {isShow} = this.data if(isShow){ this.setData({ show:isShow==1?true:false }) } }, methods: { // 跳转协议页面 goWebView(e: WechatMiniprogram.TouchEvent) { ... }, setAgree() { ... }, closePopup() { this.setData({ show: false }) }, // 登录 login() { ... }, // 获取用户信息 async getUserInfo() { ... // 获取完用户信息之后,刷新当前页面 // 看需求,也可以登录完成之后直接刷新当前页面 refreshPage() } }})

2. 第二步,全局注册组件

微信小程序做全局登录弹窗(微信小程序全栈开发实战)

app.json

"usingComponents": { "LoginPopup": "./components/LoginPopup/LoginPopup" },

3. 第三步,在需要展示弹窗的页面挂载

// 这里要用class,用于获取组件节点 <LoginPopup class="LoginPopup"></LoginPopup>

4. 第四步,封装控制组件的公共方法

把控制显隐的方法放到公共方法中,在需要的地方引入并调用即可,如放到响应拦截中 utils/index.ts

// 获取当前页面实例function getContext() { const pages = getCurrentPages(); return pages[pages.length - 1];}// 控制弹窗显隐方法export function BadgePopup() { const options = { show: true, dom: '.LoginPopup' }; const page = getContext(); const c= page .selectComponent(options.dom); if (!c) { console.warn(`未找到 ${options.dom} 节点,请确认 dom 是否正确`); return; } c.setData(options);}

5. 第五步,封装刷新当前页面的公共方法

刷新当前页面方法一般在登录完成,获取用户信息之后,直接调用即可

utils/index.ts

// 刷新当前页面export function refreshPage() { // getContext() 和第四步使用的同一个方法 const perpage = getContext() const keyList = Object.keys(perpage.options) if (keyList.length > 0) {//页面携带参数 let keys = '?' keyList.forEach((item, index) => { index === 0 ? keys = keys + item + '=' + perpage.options[item] : keys + '&' + item + '=' + perpage.options[keys] }) wx.reLaunch({ url: '/' + perpage.route + keys }) } else {//页面没有携带参数 perpage.onLoad() // 也可以使用wx.reLaunch }}

6. 总结

目前想到的最好的解决方法,如有更好的方法还请奉告

本文链接地址:https://www.jiuchutong.com/zhishi/294540.html 转载请保留说明!

上一篇:CSS中height:100vh和height:100%的区别是什么?(css width height)

下一篇:h5接微信js-sdk的详细步骤(h5链接js)

  • 荣耀30青春版和荣耀x10有哪些区别(荣耀30青春版和哪个手机壳是一样的)

  • vivos6有什么颜色呢(vivo s6 5g手机参数颜色)

  • 抖音下线多久就不显示在线(抖音下线多久就没流量了)

  • 苹果6s和6的手机壳是通用吗(苹果6s和6的手机壳一样吗?)

  • word具有的功能是(word具有的功能是自动更正)

  • 用电脑登录微信能看到聊天记录吗(用电脑登录微信手机怎样不被发现)

  • 抖音连着点赞会限流吗(抖音连着点赞会被限流吗)

  • iphone7plus录屏功能在哪(苹果七plus录屏)

  • htc m8屏幕失灵了(htc u12屏幕)

  • 苹果电池一年内可以免费换(苹果电池一年内低于多少可以免费换)

  • 哪个网盘可以免费保存视频(哪个网盘可以免费上传超过2g的视频)

  • vivo怎么修改内存(vivo手机怎样修改内存)

  • 小米note5怎么没有开发者选项(小米note5g手机)

  • 浏览器私密空间在哪(浏览器私密空间指纹进不去了怎么办)

  • 抖音网络不可用怎么回事(抖音网络无法使用)

  • 食品污染的途径(食品污染的途径包括)

  • 12306的用户名可以修改吗(12306用户名可以是汉字吗)

  • 苹果xmax双卡怎么安装方法(苹果xmax双卡怎么切换短信)

  • 红米note8是什么解锁(红米note8机型)

  • 如何把d盘空间分给c盘(如何把D盘空间移到C盘)

  • 计算机病毒危害性表现在(计算机病毒危害有哪些)

  • 小米无线车充支持哪些手机(小米无线车充支持苹果xr吗)

  • 联机宝怎么用(联机宝如何连接无线网络)

  • nova5pro耳机孔在哪里(nova5ipro耳机插口)

  • vivoz3i有没有快充(vivoz3i快捷怎么设置)

  • 小米6拍照如何开启虚化(小米拍照如何显示地理位置)

  • 同步发光萤火虫照亮了大烟山国家公园中的森林 (© Floris van Breugel/Minden Pictures)(萤火虫发光器的用途)

  • el-table懒加载,修改数据局部加载懒加载数据(el-table懒加载合并行)

  • named-checkconf命令 named配置文件语法检查(named-config)

  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设 电脑维修 湖南楚通运网络