如何从Vue插件访问Vuex?

Ste*_*ane 5 vuex vuejs2

如何从插件访问商店?控制台返回未定义。

import store from './store';

export default {
    install(vue, opts){
        Vue.myGlobalFunction = function(){
            console.log(store);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决:似乎可以做到

import { store }
Run Code Online (Sandbox Code Playgroud)

解决它。当它让我回答时。我不完全确定为什么这样做,但我认为我的商店正在导出商店,而不是默认商店。

Tre*_*vor 6

我最近也不得不这样做来制作 pouchDb 插件,并想出了一种新方法。

当你创建你的第一个 Vue 对象时,你可以这样做。

import PouchDb from '@/pouch_db/PouchDbPlugin'

let DefaultVue = Vue.extend({
  components: {App},
  store,
  created () {
    Vue.use(PouchDb, this.$store) // Create it by passing in the store you want to use
  }
})
Run Code Online (Sandbox Code Playgroud)

我的插件添加了一个额外的商店,它有自己的突变和吸气剂。

export default {
  install (Vue, store) {
    store.registerModule('PouchDb', pds)
    const pouchDb = new PouchDb(store)
    Vue.pouchDb = pouchDb
    Vue.prototype.$pouchDb = pouchDb
  }
}
Run Code Online (Sandbox Code Playgroud)

在构造函数内部,我存储商店

class PouchDb {
  constructor (store) {
    this.store = store
    // ... etc.
  }
  // ... more functions
}
Run Code Online (Sandbox Code Playgroud)

然后在其他函数中使用

class PouchDb {
    // ... constructor and other functions
    async addSync (docId) {
       this.store.dispatch('PouchDb/addSync', docId)
    }
}
Run Code Online (Sandbox Code Playgroud)

在商店中通过有点作弊,但似乎效果很好。它可以像这样在整个应用程序中使用

// Inside vuex store
Vue.pouchDb.addSync(// ...etc)

// inside component
this.$pouchDb.removeSync(// ...etc)
Run Code Online (Sandbox Code Playgroud)


Hyb*_*dev 5

请参见官方指南这里它规定

Vue.js 插件应该公开一个安装方法。该方法将使用Vue 构造函数作为第一个参数以及可能的选项来调用:

所以你可以很容易地做到这一点。

Vue.use( {
    install(Vue){
        Vue.prototype.$something = function (){
            this.$store...etc
        }
    } 
} )
Run Code Online (Sandbox Code Playgroud)

要使用,只需在组件方法/计算等中执行 this.$something(),或直接在组件标记中作为 {{$something()}}

这将删除需要知道商店实际驻留位置的插件,同时仍然允许您在插件中使用商店。

这是因为它将继承使用它的任何组件的范围,从而提供对所有组件实例属性的访问,包括诸如 $store、$router 之类的内容以及它的任何本地属性,例如计算属性、父级等。本质上是插件的功能就像它直接是组件的一部分一样(例如,如果您将它用作 mixin)。