返回顶部
首页 > 资讯 > 精选 >小程序如何确保每个页面都已登陆
  • 736
分享到

小程序如何确保每个页面都已登陆

2023-06-22 06:06:14 736人浏览 安东尼
摘要

这篇文章主要为大家展示了“小程序如何确保每个页面都已登陆”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何确保每个页面都已登陆”这篇文章吧。一个微信小程序中,有首页,有个人页面,还有一些列

这篇文章主要为大家展示了“小程序如何确保每个页面都已登陆”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何确保每个页面都已登陆”这篇文章吧。

一个微信小程序中,有首页,有个人页面,还有一些列表页面,详情页面等等,这些页面大部分是可以分享的。当分享出去的页面被一个另一个用户打开的时候,这个页面怎么确保这个用户已经登陆了呢?

网上有很多方案是在请求封装里面加一道拦截,如果没有token,就先调用登陆请求获取token后,再继续。这种方案没毛病,只要注意一点,当一个页面有多个请求同时触发时,当所有请求拦截后,放到一个数组里面,在获取token成功后,遍历数组一个个请求就行。

但这个需求再复杂一点,比如连便利店小程序,大部分页面都需要有一个门店(因为需要根据门店获取当前门店商品的库存、价格等),这个门店是根据当前的定位来调用后台接口获得的,这个时候如果在请求里进行封装就太麻烦了。

解决方案

首先,我们注意到,登陆,获取定位与我们的页面请求是异步的,我们需要保证页面请求是在登陆和获取定位之后,但要是我们每个页面都写一个遍,可维护性就太差了。所以我们可以抽离出一个方法来做这件事。所以代码就这样了:

const app = getApp()Page({  data: {    logs: []  },  onLoad() {    app.commonLogin(()=>{        // 处理页页面请求    })  }})

做到这里好像是解决我们的问题,但再想一想,如果还想做更多的事,比如说每个页面的onShareAppMessage统一处理,但我又不想在每个页面再写一遍,另外,我又想自己对每个页面实现一个watch,怎么做?

进一步解决方案

我们可以看到微信小程序,每个页面是一个Page(),那么我们可以给这个Page外面加一层壳子,我们可以有一个MyPage来替换这个Page,废话不多说,上代码:

tool.js 相关代码

  handlePageParamMerge(arg) {    let numargs = arg.length; // 获取被传递参数的数值。    let data = {}    let page = {}    for (let ix in arg) {      let item = arg[ix]      if (item.data && typeof (item.data) === 'object') {        data = Object.assign(data, item.data)      }      if (item.methods && typeof (item.methods) === 'object') {        page = Object.assign(page, item.methods)      } else {        page = Object.assign(page, item)      }    }    page.data = data    return page  }    mergePage() {    return this.handlePageParamMerge(arguments)  }    handleCompParamMerge(arg) {    let numargs = arg.length; // 获取被传递参数的数值。    let data = {}    let options = {}    let properties = {}    let methods = {}    let comp = {}    for (let ix in arg) {      let item = arg[ix]      // 合并组件的初始数据      if (item.data && typeof (item.data) === 'object') {        data = Object.assign(data, item.data)      }      // 合并组件的属性列表      if (item.properties && typeof (item.properties) === 'object') {        properties = Object.assign(properties, item.properties)      }      // 合组件的方法列表      if (item.methods && typeof (item.methods) === 'object') {        methods = Object.assign(methods, item.methods)      }      if (item.options && typeof (item.options) === 'object') {        options = Object.assign(options, item.options)      }      comp = Object.assign(comp, item)    }    comp.data = data    comp.options = options    comp.properties = properties    comp.methods = methods    return comp  }    mergeComponent() {    return this.handleCompParamMerge(arguments)  }    newPage() {    let options = this.handlePageParamMerge(arguments)    let that = this    let app = getApp()    //增加全局点击登录判断    if (!options.publicCheckLogin){      options.publicCheckLogin = function (e) {        let pages = getCurrentPages()        let page = pages[pages.length - 1]        let dataset = e.currentTarget.dataset        let callback = null        //获取回调方法        if (dataset.callback && typeof (page[dataset.callback]) === "function"){          callback = page[dataset.callback]        }        // console.log('callback>>', callback, app.isReGISter())        //判断是否登录        if (callback && app.isRegister()){          callback(e)        }        else{          wx.navigateTo({            url: '/pages/login/login'          })        }      }    }    const { onLoad } = options    options.onLoad = function (arg) {      options.watch && that.setWatcher(this)      onLoad && onLoad.call(this, arg)    }    const { onShow } = options    options.onShow = function (arg) {      if (options.data.noAutoLogin || app.isRegister()) {        onShow && onShow.call(this, arg)        //页面埋点        app.ga({})      }      else {        wx.navigateTo({          url: '/pages/login/login'        })      }    }    return Page(options)  }    newComponent() {    let options = this.handleCompParamMerge(arguments)    let that = this    const { ready } = options    options.ready = function (arg) {      options.watch && that.setWatcher(this)      ready && ready.call(this, arg)    }    return Component(options)  }    setWatcher(page) {    let data = page.data;    let watch = page.watch;    Object.keys(watch).forEach(v => {      let key = v.split('.'); // 将watch中的属性以'.'切分成数组      let nowData = data; // 将data赋值给nowData      for (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素,除了最后一个!        nowData = nowData[key[i]]; // 将nowData指向它的key属性对象      }      let lasTKEy = key[key.length - 1];      // 假设key==='my.name',此时nowData===data['my']===data.my,lastKey==='name'      let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法      let deep = watch[v].deep; // 若未设置deep,则为undefine      this.observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey    })  }    observe(obj, key, watchFun, deep, page) {    var val = obj[key];    // 判断deep是true 且 val不能为空 且 typeof val==='object'(数组内数值变化也需要深度监听)    if (deep && val != null && typeof val === 'object') {      Object.keys(val).forEach(childKey => { // 遍历val对象下的每一个key        this.observe(val, childKey, watchFun, deep, page); // 递归调用监听函数      })    }    var that = this;    Object.defineProperty(obj, key, {      configurable: true,      enumerable: true,      set: function (value) {        if (val === value) {          return        }        // 用page对象调用,改变函数内this指向,以便this.data访问data内的属性值        watchFun.call(page, value, val); // value是新值,val是旧值        val = value;        if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。          that.observe(obj, key, watchFun, deep, page);        }      },      get: function () {        return val;      }    })  }

页面代码:

app.tool.newPage({  data: {    // noAutoLogin: false  },  onShow: function () {    // 在这里写页面请求逻辑  }}

以上是“小程序如何确保每个页面都已登陆”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 小程序如何确保每个页面都已登陆

本文链接: https://lsjlt.com/news/302852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 小程序如何确保每个页面都已登陆
    这篇文章主要为大家展示了“小程序如何确保每个页面都已登陆”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何确保每个页面都已登陆”这篇文章吧。一个微信小程序中,有首页,有个人页面,还有一些列...
    99+
    2023-06-22
  • 微信小程序如何保证每个页面都已经登陆详解
    目录现状解决方案进一步解决方案最后现状 一个微信小程序中,有首页,有个人页面,还有一些列表页面,详情页面等等,这些页面大部分是可以分享的。当分享出去的页面被一个另一个用户打开的时候...
    99+
    2024-04-02
  • Android微信小程序怎么保证每个页面都已经登陆
    这篇文章主要介绍“Android微信小程序怎么保证每个页面都已经登陆”,在日常操作中,相信很多人在Android微信小程序怎么保证每个页面都已经登陆问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android...
    99+
    2023-06-25
  • 小程序如何设计登录/注册页面
    这篇文章主要介绍小程序如何设计登录/注册页面,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!界面设计页面引用了youzan组件进行设计,包括icon,button,tag,toast以...
    99+
    2024-04-02
  • 微信小程序如何制作登录页面
    在小程序中制作一个登录页面的方法index.wxml文件<view class="container"> <view class="login-icon"...
    99+
    2024-04-02
  • 微信小程序如何实现登录页面
    这篇文章主要讲解了“微信小程序如何实现登录页面”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序如何实现登录页面”吧!1. 在首页中加入一个弹窗作为登录窗口,效果如下图:(1)inde...
    99+
    2023-06-30
  • 小程序如何实现保留当前页面跳转到应用内的某个页面
    本文将为大家详细介绍“小程序如何实现保留当前页面跳转到应用内的某个页面”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“小程序如何实现保留当前页面跳转到应用内的某个页面”能够给你意想不到的收获,请大家跟着小编的思...
    99+
    2023-06-26
  • 如何获取小程序页面小程序码
    获取小程序页面小程序码的方法:用电脑登录微信公众平台,进入小程序管理后台。点击导航栏中的“工具”选项菜单,再选“生成小程序码”功能。填入小程序APPID进行搜索,然后点下一步。填入页面地址后,点确定生成小程序码,保存生成的小程序码图片即可。...
    99+
    2024-04-02
  • 小程序个人中心页面如何制作
    本文小编为大家详细介绍“小程序个人中心页面如何制作”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序个人中心页面如何制作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。个人中心制作1. mine.js...
    99+
    2023-06-26
  • 微信小程序如何自动登陆PHP
    这篇文章将为大家详细讲解有关微信小程序如何自动登陆PHP,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信小程序 自动登陆PHP源码实例app.js  ...
    99+
    2024-04-02
  • 如何分享小程序页面
    微信小程序不支持分享到朋友圈,但可以分享给朋友或者群,步骤如下:首先,打开微信APP,选择进入一个小程序;在小程序页面中,点击右上角的三个点的按钮;最后,在弹出的对话框中,点击“发送给朋友”,选择需要分享的朋友或群聊即可。...
    99+
    2024-04-02
  • 小程序web-view页面如何返回小程序
    小程序web-view页面返回小程序的方法:用navigateTo跳转可以返回,代码:// <script type="text/javascript" src="https...
    99+
    2024-04-02
  • 微信小程序页面中如何实现保存图片
    小编给大家分享一下微信小程序页面中如何实现保存图片,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 背...
    99+
    2024-04-02
  • 微信小程序如何切换下一个页面
    微信小程序切换下一个页面的方法:wxml页面组件跳转,可以通过设置open-type属性指明页面跳转,代码:// navigator 组件默认的 open-type 为 navigate 跳转到新页面// redirect 对应 API 中...
    99+
    2024-04-02
  • 小程序如何获取页面上多个input值
    小程序获取页面上多个input值的案例://wxml <input class="formInput" placeholder="请输入旧密码" pass...
    99+
    2024-04-02
  • h5页面如何跳到小程序支付页面
    在h5页面中调用小程序支付页面的方法H5页面代码<body ><div class="container"><button onclick="testPay()">...
    99+
    2024-04-02
  • 小程序如何改页面背景
    小程序改页面背景的方法:打开微信开发者工具打开需要修改页面的wxss文件,修改page的属性。改变“background”的颜色值即可。背景颜色为黄色的代码配置如下:Page{background:#f0ff0f;display: ...
    99+
    2024-04-02
  • html5页面如何插入小程序
    打开微信小程序开发工具,新建一个项目;在新建的页面文件中,插入按钮并添加bindtap跳转事件;<button type="primary" bindtap="jumoPage&quo...
    99+
    2024-04-02
  • 抖音页面如何放小程序
    抖音页面放小程序的步骤:打开【抖音客户端】,点击下方【+】录制视频。录制好视频后,点击下一步。在输入对视频的描述页面,点击下方的【添加小程序】菜单。在弹出的对话框里面,可以直接点击【小程序】添加,也可以选择【搜索】查找小程序。添加小程序需要...
    99+
    2024-04-02
  • 如何生成小程序页面码
    生成小程序页面码的方法:登录小程序管理后台。点击导航栏中的“工具”选项菜单,再选“生成小程序码”功能。输入小程序名称的全称,点击下一步。再点击“获取更多页面路径”。在弹出来的对话框中,“开启入口”里输入任一小程序管理成员的微信号,点击开启。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作