项目场景:
提示:这里简述项目相关背景:
将根据segmentId查出来的合同信息托管到vuex中,让每个人都可以获取到合同信息
描述以及问题点
1:调用vuex异步函数的语法是
this.$store.dispatch('actions方法名',值)
2:在computed(计算属性)中使用mapState语法糖
computed: {
...mapState({
contractCode:state => state.contractInfo.contractCode,
})
},
3:调用成功后有可能读取不到值
首先我们要明白发送请求属于异步任务中的微任务,所以在你读取的时候,有可能还没有赋值成功,所以,你需要监听这个值,如下:
watch: {
// 监听
"contractCode":function(val){
if(val!=""||val!=null||val!=undefined){
console.log("vuex异步调用后获取数据=========监听",this.contractCode)
}
}
},
事件循环机制 注:
- 整体的script(作为第一个宏任务)开始执行的时候,会把所有代码分为两部分:“同步任务”、“异步任务”;
- 同步任务会直接进入主线程依次执行;
- 异步任务会再分为宏任务(进入宏任务队列) 和 微任务(进入微任务队列)。
- 当主线程内的任务执行完毕(主线程为空时),会检查微任务的任务队列,如果有任务,就进入主线程全部执行,如果没有就从宏任务队列读取下一个宏任务执行;
- 每执行完一个宏任务就清空一次微任务队列,此过程会不断重复,这就是Event Loop;
实例:
提示:这里填写该问题的具体解决方案:
1:在store中新建一个js文件
/*
*@Author: FangbinGuo
*@Date:2023-09-11 10:19:56
*@Description:
*/
// 合同信息的接口
import {getHTMC,} from "@/api/payment/projectInspect/payoff";
const state= {
contractCode:"",
contractName:"",
}
const mutations= {
SET_ContractCode: (state, contractCode) => {
state.contractCode = contractCode
},
SET_ContractName: (state, contractName) => {
state.contractName = contractName
},
}
const actions = {
getHTInfo({ commit }, segmentId) {
getHTMC({
segmentId:segmentId
}).then(res=>{
// console.log("根据标段id获取合同信息========",res)
commit('SET_ContractCode', res.data.contractCode);
commit('SET_ContractName', res.data.contractName);
}).catch(err=>{
console.log(err)
})
}
}
export default{
state,
mutations,
actions,
}
2:在store的index文件中引入后抛出
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import contractInfo from './modules/contractInfo'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
contractInfo,
},
getters
})
export default store
3:页面dispatch调用
created() {
this.$store.dispatch('getHTInfo',this.segmentId);
},
4:页面引入mapState语法糖
5:在计算属性中使用mapState语法糖
computed: {
...mapState({
contractCode:state => state.contractInfo.contractCode,
})
},
6:监听这个变量
watch: {
// 监听
"contractCode":function(val){
if(val!=""||val!=null||val!=undefined){
console.log("vuex异步调用后获取数据=========监听",this.contractCode)
}
}
},