全局跨页面回调

uni-app借助vuex全局跨页面回调

更新日志

  • 2022-8-11
  • 2022-8-12

使用

vuex

	import { mapGetters } from 'vuex';
	export default {
		computed: {
			...mapGetters({
				get_promise: 'global/get_promise'
			})
		},
		...mapGetters({
			user_info: 'user/info',
			get_promise: 'global/get_promise'
		})
	}

异步调用

	/**
	 *   @params [data] 非必须,调用时需要传递给接收方的数据
	 *   @params [key] 非必须,设置本次调用事件的id
	 *   
	*/
	this.$store.dispatch("global/wait_do", {data, key}).then(({key, promise})=>{
		uni.navigateTo({
			url: `url?promise_key=${key}`
		});
		promise().then(res=>{
			uni.navigateBack();
			setTimeout(()=>{ // 等待页面动画播放完毕
				uni.showLoading({
					title: '更新中...'
				});
			}, 300);
		});
	});

同步调用

	let {key, promise} = await this.$store.dispatch("global/wait_do", data);
	uni.navigateTo({
		url: `url?promise_key=${key}`
	});
	let res = await promise();

被调用方的响应代码

	// onLoad时保存promise_key
	onLoad(){
		this.promise_key= promise_key;
	},
	// 页面卸载,触发失败回调
	onUnload(){
		try{
			this.$store.getters["global/get_promise"](this.promise_key).instance.reject();
		}catch(err){
			console.info({err});
		}
	}
	
	// 调用成功,响应成功回调
	try{
		this.$store.getters["global/get_promise"](this.promise_key).instance.resolve();
	}catch(err){
		console.info({err});
	};

源代码

// 跨页面回调
let state = {
		promises: {},
	},
	getters = {
		get_promise(state) {
			return (key) => {
				if (!key) console.error("invalid key in get_promise");
				return state.promises[key];
			}
		}
	},
	mutations = {
		set_promises(state, [key, payload]) {
			state.promises[key] = {
				...state.promises[key],
				...payload
			};
		},
	},
	actions = {
		wait_do(store, {
			data = {},
			key
		} = {}) {
			if (!key) key = `xz${Date.now()}`;
			store.commit("set_promises", [key, {
				data
			}]);
			console.log({
				key
			});
			return {
				key,
				promise: () => {
					return new Promise((resolve, reject) => {
						store.commit("set_promises", [key, {
							instance: {
								resolve,
								reject
							}
						}]);
					});
				}
			};
		},
	}
export default {
	namespaced: true,
	state,
	getters,
	mutations,
	actions
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行囊电子商务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值