使用 axios 响应中的操作改变 vuex 存储状态 - 提交不起作用

Posted

技术标签:

【中文标题】使用 axios 响应中的操作改变 vuex 存储状态 - 提交不起作用【英文标题】:Mutate vuex store state with action within axios response - commit does not work 【发布时间】:2018-11-08 17:56:35 【问题描述】:

序言

我完全被这个难住了。答案很明显,我很确定,但我看不到。

问题:

我无法使用 Axios 响应写入我的 vuex 存储。我已经阅读并尝试了 async/await,认为我对 Promise 有很好的理解,并逐字复制了示例。没有骰子。

这是我的 mutator,当在 axios 之外传递有效载荷时它可以工作:

mutations: 
    setDays (state, payload) 
        state.savedDays = payload
    

此操作是为调试目的而创建的,它使用单词“cheese”正确更新存储并将预期的响应对象记录到控制台:

getDays (commit) 
    axios.get('/days/')
    .then( (response) => 
        console.log(response.data)
    )
    commit('setDays', "cheese")

此操作不会更新商店,但仍会正确登录到控制台:

getDays (commit) 
    return axios.get('/days/')
    .then( (response) => 
        // response object removed for debugging
        commit('setDays', "cheese")
        console.log(response.data)
    
)

我在这里阅读了 Vuex 文档和许多其他解决方案,尝试了很多东西,包括以下内容(不起作用):

async getDays (commit) 
    const response = await axios.get('/days/')
    commit('setDays', response)
)

我没有收到错误消息,请使用 chrome vue-devTools。 提前谢谢你。


好的,我这样做是为了根据下面的 cmets 进一步测试:

async getDays (commit) 
    commit('setDays', "crackers")
    const response = await axios.get('/days/byType/30/1')
    console.log("Response:", response.data)
    commit('setDays', response.data)
    return response

当这个action被调度时,store值被成功地变异为“crackers”。

console.log 成功记录响应对象。

第二次提交什么也不做,即使我尝试提交一个字符串而不是 response.data 对象。

【问题讨论】:

提交('setDays_',响应)。 setDays_ 是类型错误吗? 我不确定你是否可以在一个动作中提交多个 即使我删除了第一个,第二个也不会提交。一定有一些潜在的配置问题。我将在 vue-cli 的香草应用程序中重建并从那里开始。感谢您的帮助。 【参考方案1】:

您的第三个和第四个代码示例很接近。 axios.get() 返回一个承诺。所以你要么必须使用async await.then。 为了使您的第四个示例工作,您所要做的就是提交response.data

async getDays (commit) 
    const response = await axios.get('/days/')
    commit('setDays', response.data)
)

为了返回值,请使用以下几行

async getDays (commit) 
    const response = await axios.get('/days/')
    commit('setDays', response.data)
    return response.data
)

仅供参考,您也可以使用Object destructuring

const  data  = await axios.get('/days/')
commit('setDays', data)
return data

【讨论】:

我认为 axios 存在潜在问题。使用你的方法(这是有道理的,谢谢)我得到:“Uncaught (in promise) TypeError: Cannot read property 'data' of undefined”。 尝试使用第二个代码示例(没有对象解构)和console.log('Response:', response) 在那里你可以检查response.data 是否存在

以上是关于使用 axios 响应中的操作改变 vuex 存储状态 - 提交不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Vuex以及axios

Vuex以及axios 看这个

Vuex以及axios的使用

存储在 vuex axios 响应中无法正常工作

Vuex:Axios GET 请求在组件内部返回未定义

Axios 拦截器 - 如何从 vuex 商店返回响应