千家信息网

Android微信小程序怎么保证每个页面都已经登陆

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Android微信小程序怎么保证每个页面都已经登陆",在日常操作中,相信很多人在Android微信小程序怎么保证每个页面都已经登陆问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
千家信息网最后更新 2026年11月02日Android微信小程序怎么保证每个页面都已经登陆

这篇文章主要介绍"Android微信小程序怎么保证每个页面都已经登陆",在日常操作中,相信很多人在Android微信小程序怎么保证每个页面都已经登陆问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Android微信小程序怎么保证每个页面都已经登陆"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

现状

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

网上有很多方案是在请求封装里面加一道拦截,如果没有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  }  /***   * 合并页面方法以及数据, 兼容 {data:{}, methods: {}} 或 {data:{}, a:{}, b:{}}   */  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  }  /**   * 组件混合 {properties: {}, options: {}, data:{}, methods: {}}   */  mergeComponent() {    return this.handleCompParamMerge(arguments)  }  /***   * 合成带watch的页面   */  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)  }  /**   * 合成带watch等的组件   */  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 () {    // 在这里写页面请求逻辑  }}

到此,关于"Android微信小程序怎么保证每个页面都已经登陆"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

页面 登陆 程序 组件 保证 方法 监听 参数 属性 方案 门店 处理 学习 代码 对象 数组 更多 定位 函数 大部分 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江苏根荣互联网科技 科技互联网企业 互联网金融科技创新 无线互联网科技 广州紫鲸互联网科技 互联网科技公司招聘 云创客互联网科技公司 南山科技园互联网公司有哪些 互联网科技革命什么开始 青岛科技大学互联网大赛研究生 晓花互联网科技有限公司网址 互联网科技产业特征 高科技互联网发展前景如何 互联网时代的科技公司 吉林省码上互联网科技电话 互联网科技新闻 科技和互联网行业的特点 安徽九吞吴互联网科技有限公司 优雇互联网科技有限公司 小牛互联网科技有限公司地址 智网互联网科技 高科技互联网发展前景如何 黑科技 体验场景 互联网大会 雨阳互联网卡科技有限公司 昆明中奇联合互联网科技 长沙渺峰互联网科技有限公司 保山互联网科技靠谱吗 青岛互联网科技园 广东猫王互联网科技有限公司电话 现代科技的标志之一的互联网
0