将自定义商店注入应用程序

时间:2017-01-04 14:45:54

标签: vue.js

Vuex允许您将商店注入您的根实例,使其可以通过this.$store在所有子组件中访问。

如果没有Vuex,是否可以将自定义商店实现注入子组件?

e.g。

// main.js
let app = new Vue({router, store, ...App}).$mount("#flightdeck-app")
export { app, store, router }

// SomeComponent.vue
export default {
  name: "Overview",

  components: { "credentials": Credentials },

  computed: {
    count() {
      // injected store; is currently undefined.
      return this.$store.state.items.length
    }
  },

尝试访问this.$store会导致子组件中的未定义,因为Vuex似乎有额外的钩子来实现这一点。

2 个答案:

答案 0 :(得分:2)

您可以为vue创建一个自定义插件,用于注册初始化您的自定义商店(或任何内容,我只是为了演示而创建一个记录器对象)。

例如,您可以

//myLogger.js
export default {

  install(Vue, options) {
     function log(type, title, text) {
       console.log(`[${type}] ${title} - ${text}`);
     }

     Vue.prototype.$log = {
       error(title, text) { log('danger', title, text) },
       success(title, text) { log('success', title, text) },
       log
     }
  }
}

在您的主Vue实例告诉您注册插件之前

//main.js
import Logger from './path/to/myLogger';

Vue.use(Logger);

var vm = new Vue({
  el: '#app',
  template: '<App/>',
  components: { App }
})

现在,您可以在任何子组件上调用this.$log

//myComponent.vue
export default {
  data() {
    return {};
  },
  methods: {
    Save() {
      this.$log.success('Transaction saved!');
    }
  }
}

希望有所帮助,有关详细信息,请参阅Vue plugins documentation

答案 1 :(得分:1)

只需在组件文件中使用:

import store from './vuex/store.js'
  1. 将您的商店放在单独的文件中以清楚说明。
  2. 将商店导入到您需要商店的每个组件。