uni-app借助vuex全局跨页面回调
更新日志
使用
vuex
import { mapGetters } from 'vuex';
export default {
computed: {
...mapGetters({
get_promise: 'global/get_promise'
})
},
...mapGetters({
user_info: 'user/info',
get_promise: 'global/get_promise'
})
}
异步调用
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(){
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
}