鍍金池/ 問(wèn)答/HTML/ 如何在vuex的action里 調(diào)用axios的promise方法并return

如何在vuex的action里 調(diào)用axios的promise方法并return出去方便組件調(diào)用

我在store.js里定義了一個(gè)axios請(qǐng)求方法

clipboard.png

但是由于在store.js里寫(xiě)axios成功不能調(diào)用vue路由的跳轉(zhuǎn)以及調(diào)用elementUI的組件,所以我只是想把請(qǐng)求封裝到actions里,成功失敗后的回調(diào)(.then .catch)還是在組件里寫(xiě)
我看了下官方文檔

clipboard.png
可以return一個(gè)promise對(duì)象,axios官方文檔也說(shuō)可以調(diào)用promise方法,我在login.vue里是這樣寫(xiě)的
login.vue

clipboard.png

clipboard.png

但是無(wú)效,請(qǐng)問(wèn)我在actions里應(yīng)該如何調(diào)用axios的promise方法,第一次寫(xiě)這個(gè)一點(diǎn)頭緒都沒(méi),求高人指點(diǎn)

回答
編輯回答
巴扎嘿

首先axios方法得到的是一個(gè)promise,所以你只要在actions的login里return axios()就行了

2018年5月7日 06:37
編輯回答
汐顏
state: {
    userList: [],
},
mutations: {
    // 簡(jiǎn)化mutatios的代碼量
    updateData(state, data) {
        state[data.key] = data.value;
    }
},
actions:{      
   getUserList: async function(contex) {
        let value = await axios('you api url').then(res => res.data);
        contex.commit("updateData", {
            key: "userList",
            value
        });
    }
 }

上面是一個(gè)直接更新到store的一個(gè)例子,如果要返回可以像下面這樣,在組件里面可以同步使用返回的數(shù)據(jù):

// actions.js
getUserList: async function(contex) {
    let value = await axios('you api url').then(res => res.data);
    return value;
}


// ***.vue

methods:{
    ...mapActions(["getUserList"]),
    getData(){
        const userList = this.getUserList();
        // 后續(xù)的處理
    }
}

如果要想把回調(diào)寫(xiě)在組件里面就應(yīng)該是這樣:

// actions.js
getUserList(contex) {
    return axios('you api url').then(res => res.data);
}

// ***.vue

methods:{
    ...mapActions(["getUserList"]),
    getDataAsync(){
        this.getUserList().then(res=>{
            // 后續(xù)的處理
        });
    },
    getDataSync:async function(){
        const data = await this.getUserList().then(res=>res.data);
        // 后續(xù)的處理
    }
}

對(duì)于題主的問(wèn)題,建議在更新store.state,如果只是一個(gè)ajax請(qǐng)求,其返回的數(shù)據(jù)不在組件間共享,那么可以直接寫(xiě)在組件內(nèi)部,不用走vuex。

2018年1月5日 16:53