评论

小程序app.onLaunch与page.onLoad异步问题的最佳实践

app.onLaunch与page.onLoad异步问题终极解决方案

场景:

在小程序中大家应该都有这样的场景,在onLaunch里用wx.login静默登录拿到code,再用code去发送请求获取token、用户信息等,整个过程都是异步的,然后我们在业务页面里onLoad去用的时候异步请求还没回来,导致没拿到想要的数据,以往要么监听是否拿到,要么自己封装一套回调,总之都挺麻烦,每个页面都要写一堆无关当前页面的逻辑。

直接上终极解决方案,公司内部已接入两年很稳定:

1.可完美解决异步问题

2.不污染原生生命周期,与onLoad等钩子共存

3.使用方便

4.可灵活定制异步钩子

5.采用监听模式实现,接入无需修改以前相关逻辑

6.支持各种小程序和vue架构

。。。

//为了简洁明了的展示使用场景,以下有部分是伪代码,请勿直接粘贴使用,具体使用代码看Github文档
//app.js
//globalData提出来声明
let globalData = {
  // 是否已拿到token
  token: '',
  // 用户信息
  userInfo: {
    userId: '',
    head: ''
  }
}
//注册自定义钩子
import CustomHook from 'spa-custom-hooks';
CustomHook.install({
 'Login':{
    name:'Login',
    watchKey: 'token',
    onUpdate(token){
      //有token则触发此钩子
      return !!token;
    }
  },
 'User':{
    name:'User',
    watchKey: 'userInfo',
    onUpdate(user){
      //获取到userinfo里的userId则触发此钩子
      return !!user.userId;
    }
  }
}, globalData)
// 正常走初始化逻辑
App({
  globalData,
  onLaunch() {
      //发起异步登录拿token
      login((token)=>{
          this.globalData.token = token
          //使用token拿用户信息
          getUser((user)=>{
             this.globalData.user = user
          })
     })
   }
})
//关键点来了
//Page.js,业务页面使用
Page({
  onLoadLogin() {
       //拿到token啦,可以使用token发起请求了
       const token = getApp().globalData.token
    },

  onLoadUser() {
       //拿到用户信息啦
       const userInfo = getApp().globalData.userInfo
    },

  onReadyUser() {
       //页面初次渲染完毕 && 拿到用户信息,可以把头像渲染在canvas上面啦
       const userInfo = getApp().globalData.userInfo
       // 获取canvas上下文
       const ctx = getCanvasContext2d()
       ctx.drawImage(userInfo.head,0,0,100,100)
    },

  onShowUser() {
       //页面每次显示 && 拿到用户信息,我要在页面每次显示的时候根据userInfo走不同的逻辑
       const userInfo = getApp().globalData.userInfo
       switch(userInfo.sex){
         case 0:
           // 走女生逻辑
           break
         case 1:
           // 走男生逻辑
           break
       }
    }
})


具体文档和Demo见↓

Github:https://github.com/1977474741/spa-custom-hooks

祝大家用的愉快,记得star哦

最后一次编辑于  2023-04-23  
点赞 65
收藏
评论

52 个评论

  • happy
    happy
    2024-12-12

    有点像 VUE 的Reactivity

    2024-12-12
    赞同
    回复
  • 尽善尽美
    尽善尽美
    2024-11-11
    每个页面都 要写onLoadLogin 么?这个感觉所有页面全部需要处理了?
    
    2024-11-11
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2024-11-19
      onLoad 本身就是基于页面的钩子,用来处理页面内的业务
      2024-11-19
      回复
  • 🌙
    🌙
    2024-10-18

    直接运行原生的demo/miniprogram报错 跑不起来呀

    2024-10-18
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2024-10-18
      报什么错
      2024-10-18
      回复
  • biu
    biu
    2024-08-29

    请问vue3的uniapp支持吗?

    2024-08-29
    赞同
    回复
  • 侯新爽
    侯新爽
    2024-08-26

    小程序原生组件怎么调用,我直接写在data同级不会触发

    

    2024-08-26
    赞同
    回复 2
    • Q.ZHANG
      Q.ZHANG
      2024-08-26
      贴下代码
      2024-08-26
      回复
    • 侯新爽
      侯新爽
      2024-08-27回复Q.ZHANG
      可以了, 原来的不是最新的版本
      2024-08-27
      回复
  • hqzh
    hqzh
    2024-07-23

    兄弟,24年了,依旧优秀

    2024-07-23
    赞同
    回复
  • 💭
    💭
    2024-07-09

    大佬大佬,uniapp vue3的setup怎么实现呀,使用会报 onLoadXXX is not defined

    2024-07-09
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2024-07-10
      不支持setup
      2024-07-10
      回复
  • K
    K
    2024-03-31

    可以不用globaldata? 可以用getStorageSync?

    2024-03-31
    赞同
    回复 1
  • LijtStrongest
    LijtStrongest
    2024-03-01

    朋友圈分享不执行onLoadLogin的方法,onLoad正常;麻烦看看这个问题,急

    2024-03-01
    赞同
    回复 4
    • Q.ZHANG
      Q.ZHANG
      2024-03-01
      有完全打开吗,还是说是预览?
      2024-03-01
      1
      回复
    • Q.ZHANG
      Q.ZHANG
      2024-03-01
      排查下Login对应数据是否满足条件
      2024-03-01
      1
      回复
    • Q.ZHANG
      Q.ZHANG
      2024-03-01
      已排查到原因,朋友圈预览模式下wx.login不可用,导致Login对应数据没满足条件
      2024-03-01
      2
      回复
    • 本
      2024-08-18
      请问解决了吗
      2024-08-18
      回复
  • 正希
    正希
    2024-02-28

    楼主请问如果token 的过期或者不存在,怎么再次获取?app.js 只在加载第一次的时候运行,过期了或者获取失败,怎么处理呢


    2024-02-28
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2024-02-28
      你意思是前端有token但是token不能用是吧,那就走重新拿token的逻辑,看你是跳重新登录的页面还是静默拿token,如果是前者就清除旧token后跳登录页,后者的话建议在请求侧去做失效获取重发的处理,应该有对应的请求库吧
      2024-02-28
      回复

正在加载...

登录 后发表内容