定义了一个vue全局方法 不能再vuex中进行调用

2018-05-18 10:40:11javascript问题

定义了一个vue的全局方法,但是可以在组件中调用,确不能再vuex中调用,提示undefined

Vue.prototype.ajax = function (){
    alert('aaaaaaa');
};

var store = new Vuex.Store({
    state: {
        user: {},
    },
    actions: {
        signout: function(context) {
            this.ajax();
            //undefined
        }
    }
});

网友回答:

  • zollero zollero 2018-5-18 10:47 回复:
    已被采纳

你把函数定义在 Vue 的原型链上,只能在 Vue 的实例里才能取到这个方法。

vue组件 是一个Vue 的实例,所以你当然能在这里调用到 ajax 方法。

而,vuex 只是一个 vue插件,在 vuex 里的 this 不是指向 vue实例的,所以肯定是取不到 ajax 方法的。

建议:把 ajax 函数放在一个单独的模块里定义,这样你在项目的不同地方,可以通过 import 的方式引入使用。

  • jsoncode jsoncode 2018-5-18 10:49 回复:zollero
    除了这个方法没有别的方法了吗?

  • zollero zollero 2018-5-18 10:51 回复:zollero

    要么你可以直接挂在 window 下或者 Vue 对象下面,这样就可以直接 ajax() 或者 Vue.ajxa() 这样调用

  • jsoncode jsoncode 2018-5-26 4:28 回复:zollero
    根据你的思路,我吧vuex对象打印了出来,看到一个_vm的子对象,然后我发现,这个子对象,就是vue对象,然后我就可以在vuex中使用vue的全局方法了,哈哈::

在vuex的actions中进行调用:this._vm.ajax();就好了。多谢了


  • Raymond Raymond 2020-6-11 5:55 回复:

    参考 :


  • 改名字很伤神 改名字很伤神 2018-5-18 10:45 回复:

    这里的this怎么可能是Vue是实例,而且Vuex也不是这样用的。。。

    • jsoncode jsoncode 2018-5-18 10:48 回复:改名字很伤神
      请教,改怎么在vuex中使用vue的全局方法呢

    • 改名字很伤神 改名字很伤神 2018-5-18 10:53 回复:改名字很伤神

      @jsoncode 从实现来讲,你可以在VuexVue中都定义这个方法,如果你只是想在这里使用也可以import进来,但是个人都并不推荐,参考下面这图,我建议是把signout放在一个的vue组件中。
      vuex


  • Meathill Meathill 2018-5-18 10:46 回复:

    你的方法定义在 Vue 原型链上,在 Vuex 实例中当然用不到呀。

另外这个方法也不需要挂在 Vue 上,直接写个函数 import 进来用就好了。

  • jsoncode jsoncode 2018-5-18 10:48 回复:Meathill
    我没有用打包工具,就是在浏览器里写了测试demo,我想把这个方法放到全局vue中,怎么用呢?

  • Meathill Meathill 2018-5-18 10:49 回复:Meathill

    Vue.ajax = function () {} JS 里万物皆对象,除非人为拒绝写入,不然到处都可以挂。


  • jsoncode jsoncode 2018-5-18 11:36 回复:

    踩问题的哥们,给提点建议呗,别光踩啊