在使用 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 (作者)