无法访问动作 vuex 中的 vue 资源

Posted

技术标签:

【中文标题】无法访问动作 vuex 中的 vue 资源【英文标题】:can't access vue resource inside action vuex 【发布时间】:2018-01-19 20:46:29 【问题描述】:

大家好,我正在尝试在 vuex 端的操作中发出请求,但出现此错误:

Cannot read property '$http' of undefined

我在 main.js 文件中以这种方式设置我的 vue 资源:

import Vue from 'vue'
import VueResource from 'vue-resource'
import VueRouter from 'vue-router'
import App from './App.vue'
import routes from './routes';
import store from './store/store';
import VModal from 'vue-js-modal'

Vue.use(VModal)
Vue.use(VueResource);
Vue.use(VueRouter);

const router = new VueRouter(
  routes
);

new Vue(
  el: '#app',
  store,
  router,
  render: h => h(App)
)

然后上商店:

addStyle(state,newStyleObj) 
    console.log(newStyleObj);
    var vm = this;
    this.$http.post('http://localhost:16339/api/Styles/PostStyle/', newStyleObj)
        .then(response => 
            state.tableStyles = response.body;
            console.log(state.tableStyles)
            console.log(response.body)
        , error => 
            console.log(error);
        );

有什么帮助吗?

【问题讨论】:

试试Vue.$http.post 而不是this.$http.post 还是什么都没有:/ 状态只能在突变中改变。不在行动中。 有人建议我这样做,因为动作是异步的 我昨晚尝试了同样的方法并收到错误消息,迫使我在触发突变的操作中执行异步获取。你不能在突变中进行异步操作。 【参考方案1】:

尝试通过这种方式访问​​ vue 属性this._vm.$yourDesiredPropertyName 例如this._vm.$http等 它对我有用。 您可以访问所有正确注册到 vue 实例的属性

【讨论】:

【参考方案2】:

您可以使用 this._vm 从商店访问 Vue 实例。

this._vm.$http.post()

【讨论】:

【参考方案3】:

通过Vue.prototype.$http访问axios

login(commit, loginFormData) 
            return new Promise((resolve, reject) => 
                commit('auth_request');
                Vue.prototype.$http(url: '/user/login', data: loginFormData, method: 'POST')
                    .then(resp => 
                        const token = resp.data.data.token;
                        const user = resp.data.data.profile;
                        localStorage.setItem('token', token);
                        localStorage.setItem('user', JSON.stringify(user));
                        Vue.prototype.$http.defaults.headers['Authorization'] = 'Bearer ' + token;
                        this.state.user = JSON.parse(localStorage.getItem('user')) || '';
                        this.state.token = localStorage.getItem('token') || '';
                        commit('auth_success', token, user);
                        resolve(resp)
                    )
                    .catch(err => 
                        commit('auth_error');
                        localStorage.removeItem('token');
                        localStorage.removeItem('user');
                        reject(err)
                    )
            )
        ,

【讨论】:

【参考方案4】:
import axios from 'axios'
import Vue from 'vue'
import Vuex from 'vuex'

const axiosInstance = axios.create(
    baseURL: '',
    withCredentials: true,
)

Vue.prototype.$axios = axiosInstance
Vuex.Store.prototype.$axios = axiosInstance

这对我有用。

现在您可以在 Vue 和 Vuex 中通过 this.$axios 访问。

【讨论】:

【参考方案5】:

vue 外部实例(本例中为store)使用Vue.http(不带美元符号),内部实例使用this.$http

您可以在github 上找到更多信息。

【讨论】:

或 this._vm.$http.get... 在任何 vuex 操作中避免每次都必须导入 Vue 实例【参考方案6】:

这里对$http在vuexhttps://***.com/a/42571288/6355502内无法访问的问题做一个正确的解释

状态只能在突变中改变。不在行动中。只需从动作内部提交一个突变来改变状态。

我昨晚尝试了同样的方法并收到错误消息,迫使我在触发突变的操作中执行异步获取。你不能在mutations中做异步操作,也不能在actions中改变状态,所以你必须拆分代码。

// in actions
addStyle ( commit, state , newStyleObj) 
    console.log(newStyleObj);
    var vm = this;
    this.$http.post('http://localhost:16339/api/Styles/PostStyle/', newStyleObj)
        .then(response => 
            commit("setTableStyles", response.body);
            console.log(state.tableStyles)
            console.log(response.body)
        , error => 
            console.log(error);
        );


// in mutations
setTableStyles(state, payload)
state.tableStyles = payload; // or state.tableStyles.push(...payload) if tableStyles is an Array 

【讨论】:

那么我的请求在哪里? 在组件端,那么它应该调用调用动作的突变吗? 你能举一个简单的例子来说明你是如何做我想做的事情的吗? 你的解决方案没有改变我的问题,我无法访问 vue-resource,这是我的问题 这个例子并不完美。请查看 vuex 文档,了解从调用到操作的正确突变。

以上是关于无法访问动作 vuex 中的 vue 资源的主要内容,如果未能解决你的问题,请参考以下文章

无法在模块之外访问 Vuex getter

在模板中时无法访问 Vue 商店中的 getter,因为它“不是函数”

在 NUXT 中使用 vue-apollo 从 Vuex 商店访问 this.$apollo?

无法将存储数据访问到 vuex 中的组件中

vuex物理存储在哪里?

无法通过getter vuex vuejs访问状态