在使用 uni-app 开发项目时,会遇到需要在 onLaunch 中请求接口返回结果,并且此结果在项目各个页面的 onLoad 中都有可能使用到的需求,比如微信小程序在 onLaunch 中进行登录后取得 openid 并获得 token,项目各页面需要带上该 token 请求其他接口。
在onLaunch 中的请求是异步的,也就是说在执行 onLaunch 后页面 onLoad 就开始执行了,而不会等待 onLaunch 异步返回数据后再执行,这就导致了页面无法拿到 onLaunch 中异步获取的数据。
使用custom-hooks-plus库可以完美的帮我解决这个问题。
可以定义一个全局变量
// global.ts 文件  
import { proxyData } from 'custom-hooks-plus'  
interface GlobalData {  
  token: string  
  userInfo: number  
}  
export const globalData = proxyData({  
  token: '',  
})  
export function set<K extends keyof GlobalData>(key: K, val: GlobalData[K]) {  
  globalData[key] = val  
}  
export function get<K extends keyof GlobalData>(key: K): GlobalData[K] {  
  return globalData[key]  
}
// App.vue  
import { init } from 'custom-hooks-plus';  
init(  
  {  
    Token: {  
      key: 'token', // 监听global文件中globalData的token的变化  
    }  
  }  
);  
onLaunch(() => {  
  uni.login((res) => {  
    // 进行登录操作,修改globalData中的token  
  })  
})
// 页面中使用  
import { onCustomLoad, onCustomShow } from 'custom-hooks-plus';  
onCustomLoad((options) => {  
  console.log('globalData的token都被修改了才会触发');  
}, ['Token']);
通过上面的代码实现了,页面中的onCustomLoad的回调会等token有值后再执行,完美的解决了onLaunch和onLoad的异步问题。
具体可看:https://github.com/DBAAZzz/custom-hooks-plus
            
            
            
            
3 个评论
要回复文章请先登录或注册
1***@qq.com
superMAX1024 (作者)
superMAX1024 (作者)