微信小程序做全局登录弹窗

news2025/1/11 14:50:46

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

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

注意:封装弹窗组件踩的第一个坑,我当时使用到了微信小程序的page-container组件,使用show来控制弹窗的显示与隐藏,在全局注册并使用分包的情况下,小程序会报一个错误
渲染层错误 Component : Only one instance can exist.
大致意思就是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://jmqfile.oss-cn-hangzhou.aliyuncs.com/admin/0/20221214/f92b62cc50174d9d8d412fe97ea19d4c.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. 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark入门指南

文章目录什么是SparkSpark学习路线Spark入门指南什么是Spark Apache Spark 是一个开源集群运算框架&#xff0c;最初是由加州大学伯克利分校 AMP 实验室所开发。相对于 Hadoop 的 MapReduce 会在运行完工作后将中间数据存放到磁盘中&#xff0c;Spark 使用了存储器内存运算技术…

SpringMVC之请求与响应

目录 一&#xff1a;设置请求映射路径 1. 环境准备 二&#xff1a;问题分析 三&#xff1a;设置映射路径 四&#xff1a;请求参数 一&#xff1a;设置请求映射路径 1. 环境准备 创建一个Web的Maven项目 pom.xml添加Spring依赖 <?xml version"1.0" encodi…

基于Android的电子影院系统

需求信息&#xff1a; 客户端&#xff1a; 1&#xff1a;用户注册登录&#xff1a;通过手机号码、用户名称以及密码完成用户的注册和登录 2&#xff1a;影院信息&#xff1a;用户可以查看发布的影院信息以及查看影院具体反映的电影信息以及可以查看电影的宣传片&#xff1b; 3&…

Linux - Linux命令大全

阅读前可参考 https://blog.csdn.net/MinggeQingchun/article/details/128547426 一、Linux系统管理 &#xff08;一&#xff09;查看Linux系统版本 1、查看Linux内核版本 1、cat /proc/version&#xff1a;Linux查看当前操作系统版本信息 2、uname -a&#xff1a;Linux查看…

STM32--SPI、I2C、CAND等常用通信外设总线概括

1. SPI SPI是串行外设接口&#xff08; Serial Peripheral Interface&#xff09;的缩写。 SPI&#xff0c;是一种高速的&#xff08;之前做学传输比特115200 112k, 而SPI传输速度为10Mbps&#xff09;&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管…

Allegro如何改变线宽操作指导

Allegro如何改变线宽操作指导 用Allegro做pcb设计的时候,改变走线线宽是非常常用的功能,如下图 线宽目前是12mil,需要把线宽改成15mil 具体操作如下 选择Edit选择Change

摆脱银行询证函的烦恼,契约锁推出银行询证函数字化解决方案

近日&#xff0c;中国财政部会同银保监会印发“财会[2022]39号文件”&#xff0c;明确要加快推进银行函证数字化建设。鼓励具备条件的会计师事务所和银行通过银行函证平台&#xff08;包括第三方函证平台和银行自建函证平台&#xff09;开展数字化函证&#xff0c;有效提升函证…

Jenkins集群配置/并发构建

Jenkins集群配置/并发构建1、集群配置步骤1.1 Jenkins服务器规划1.2 添加节点1.2.1 添加Jenkins-02节点1.2.2 添加Jenkins-03节点1.3 Item配置1.4 执行构建任务测试是否成功集群化构建可以有效提升构建效率&#xff0c;尤其是团队项目比较多或是子项目比较多的时候&#xff0c;…

2023前端调试技巧

前端工作中&#xff0c;不仅编码很重要&#xff0c;重现bug&#xff0c;解决bug的能力同样重要。而这些都离不开代码调试。大厂面试题分享 面试题库前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库PC调试console.log()…

支付宝调用支付流程(沙箱环境)

文章目录实现效果&#xff1a;前提准备支付流程方案一1. 导入依赖2. 配置文件3. 支付宝初始化4. 唤起支付方案二1. 导入依赖2. 唤起支付实现效果&#xff1a; 前提准备 由于本文只是提及支付的流程及其一些相关知识点&#xff0c;所以前提数据自行准备&#xff0c;参考支付宝支…

Micropython ESP32

Micropython ESP32模块列表network模块WIFI STA模式WIFI AP模式machine模块CPU主频GPIO端口GPIO输入模式GPIO输出模式GPIO中断模式ADC模数转换DAC数模转换PWM脉冲宽度调制UART串口Timer定时器官方文档 下载固件 模块列表 network模块 help(network) object <module ‘net…

域名基础知识

1.域名的概念及作用 域名&#xff08;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 由于IP地址…

vulnhub之PRIME (2021): 2

1.信息收集 输入arp-scan 192.168.239.0/24发现192.168.239.168主机存活。 使用nmap对目标主机192.168.239.168进行端口收集,&#xff0c;发现存活端口&#xff1a;22、80、139、445、10123。 访问http://192.168.239.168/&#xff0c;没有发现可用的信息。 使用gobuster进…

1、Maven——Maven项目管理工具基本设置、把Maven集成到IDEA2022

目录 一、Maven相关参数配置 1、配置依赖&#xff08;jar包&#xff09;存储位置&#xff08;本地仓库&#xff09; 2、 配置依赖下载地址 二、把Maven集成到IDEA2022 一、Maven相关参数配置 1、配置依赖&#xff08;jar包&#xff09;存储位置&#xff08;本地仓库&#…

vue使用echarts 仪表盘样式不对 | 使用echarts5.0

最近在使用Echarts官网样例的仪表盘图时候发现自己用的和官网的样例样式完全不一样。 无论怎么调整参数都还是没有办法解决。如果有同学碰到和我一样的问题可以尝试一下使用最新版的Echarts&#xff08;5.0以上&#xff09;。 因为曾经也怀疑过Echarts版本问题因此npm install…

MySQL详解(五)——高级 3.0

查询截取分析 慢查询日志 MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;它用来记录在MySQL中响应时间超过阀值的语句&#xff0c;具体指运行时间超过long_query_time值的SQL&#xff0c;则会被记录到慢查询日志中。 具体指运行时间超过long_query_time值的SQL&am…

汇编语言-实现一个简单的主引导记录(MBR)引导用户程序

本文参考李忠老师的《X86汇编语言&#xff1a;实模式到保护模式》 前言 自己手动实现一个简单的主引导记录来引导用户程序&#xff0c;有助于了解 主引导程序的工作流程在汇编代码层面如何调用函数&#xff08;函数调用的原理&#xff09;在汇编代码层面如何读写硬盘&#xf…

Android中级——滑动分析

SrcollAndroid坐标系视图坐标系常见方法实现滑动layout()offsetLeftAndRight()和offsetTopAndBottom()LayoutParamsscrollTo()与scrollBy()ScrollerVierDragHeplerAndroid坐标系 将屏幕左上角的顶点作为Android坐标系的原点&#xff0c;向右为X轴正方向&#xff0c;向下为Y轴正…

uni-app中uni-ui组件库的使用

介绍uni-ui是DCloud提供的一个跨端ui库&#xff0c;它是基于vue组件的、flex布局的、无dom的跨全端ui框架。uni-ui不包括基础组件&#xff0c;它是基础组件的补充特点高性能&#xff08;自动差量更新数据&#xff0c;优化逻辑层和视图层通讯折损&#xff0c;背景停止&#xff0…

Leetcode力扣秋招刷题路-0337

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 337. 打家劫舍 III&#xff08;Mid&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一…