评论

小程序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 个评论

  • 🇨🇳李先生
    🇨🇳李先生
    2023-05-20

    onLoginAttached

    这个不生效呀

    2023-05-20
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2023-05-22
      排查吧,就这两个条件,看login对应的值和逻辑和原生attached钩子是否触发
      2023-05-22
      回复
  • 景锵。
    景锵。
    2023-04-25

    看起来不错 用下试试

    2023-04-25
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2023-04-25
      试试,有什么疑问或者感受回来告诉我
      2023-04-25
      回复
  • K
    K
    2023-04-25

    vue3+uniapp项目中怎么使用

    2023-04-25
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2024-01-23
      vue3还不支持
      2024-01-23
      回复
  • 淼淼
    淼淼
    2023-04-04

    请问uniapp怎样用这个方案


    2023-04-04
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2023-04-06
      Github有,包含了uni-app和原生小程序各自的使用方式
      2023-04-06
      回复
  • 王馥桂
    王馥桂
    2023-03-03

    请问一下, 在组件中该如何处理呢? 组件中有类似于示例中的 onLoadLogin 吗?

    2023-03-03
    赞同
    回复 2
    • Q.ZHANG
      Q.ZHANG
      2023-12-08
      组件中使用就和组件里的原生钩子搭配起来就好了,比如onAttachedLogin,onCreatedLogin等等
      2023-12-08
      回复
    • Q.ZHANG
      Q.ZHANG
      2024-02-29
      安装下最新版本,支持所有原生小程序的组件,包括lifetimes和pageLifetimes
      2024-02-29
      回复
  • .
    .
    2022-12-28

    您好 这个uniapp 怎么使用 有文档么?

    2022-12-28
    赞同
    回复
  • 行者
    行者
    2022-12-18

    支持typescript吗?

    2022-12-18
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2024-01-22
      库是js写的,ts兼容js,可用
      2024-01-22
      回复
  • Q1ng
    Q1ng
    2022-11-07

    unniapp 小程序体验版,触发不了自己定义的函数。但是打开开发调试 vconsole 就能触发。 这是什么原因

    2022-11-07
    赞同
    回复 2
    • Q.ZHANG
      Q.ZHANG
      2022-11-07
      跟调试有关的只有请求了,是不是这个钩子依赖的属性是请求拿来的,然后你没加安全域名
      2022-11-07
      回复
    • Kitakaze
      Kitakaze
      2022-11-07
      可能是域名没配置导致的吧,vconsole打开时会忽略合法域名检测
      2022-11-07
      回复
  • 倩倩倩倩倩
    倩倩倩倩倩
    2022-05-27

    需要同时编译到不同平台,比如小程序和H5 时,可以用这个方式嘛?还是小程序可以用这个,H5需要另外兼容?尝试了一下发现页面onLoadxxx这个钩子方法中会丢页面query参数,原始的onLoad中可以拿到query

    2022-05-27
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2022-11-07
      抱歉,这是个bug,原本我以为uniapp没做兼容,试了下是有做兼容的h5平台下也可以拿到,目前已经修复了,安装1.2.6及以上版本就可以
      2022-11-07
      回复
  • 🇹 🇴 🇲 🇲 🇾
    🇹 🇴 🇲 🇲 🇾
    2022-05-17

    vue3 setup中支持不

    2022-05-17
    赞同
    回复 1
    • Q.ZHANG
      Q.ZHANG
      2022-05-18
      vue3没刻意做兼容,你可以试试
      2022-05-18
      回复

正在加载...

登录 后发表内容