如何从javascript文件(而不是vue组件)调度操作?

Muk*_*mar 8 vue.js vuex vuejs2

我在vue上下文之外有一个模块(javascript文件).我需要从这个javascript文件发送动作.可能吗 ?如果有,那怎么样?

jsfile.js(Javascript文件)

const detail = {};

detail.validateLocation = (location) => {
  // need to dispatch one action from here.
  // dispatch('SET_LOCATION', {city: 'California'})
  // how to dispatch action ?
}

export default detail;
Run Code Online (Sandbox Code Playgroud)

action.js

export default {
  SET_LOCATION: ({ commit}, data) => {
    commit('SET_LOCATION', data);
  },
}
Run Code Online (Sandbox Code Playgroud)

store.js

import Vue from 'vue';
import Vuex from 'vuex';
import actions from './actions';
import mutations from './mutations';
import getters from './getters';
export function createStore() {
  return new Vuex.Store({
    modules: {},
    state: {
      location: null
    },
    actions,
    mutations,
    getters,
  });
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*ert 15

首先,在store.js中创建商店.

import Vue from 'vue';
import Vuex from 'vuex';
import actions from './actions';
import mutations from './mutations';
import getters from './getters';

const store = new Vuex.Store({
    modules: {},
    state: {
      location: null
    },
    actions,
    mutations,
    getters,
  });

export default store
Run Code Online (Sandbox Code Playgroud)

然后,将商店导入jsfile.js并使用它.

import store from "./store"

const detail = {};

detail.validateLocation = (location) => {
  // Use imported store
  store.dispatch('SET_LOCATION', {city: 'California'})
}

export default detail;
Run Code Online (Sandbox Code Playgroud)

假设您有一个用于创建Vue实例的主文件或索引文件,您现在可能需要将导入从导入create函数更改为简单地导入存储.

  • 对于遇到此问题的其他人 - 如果您使用模块,则必须导入基础存储并通过正斜杠表示法引用模块,例如“store.dispatch('user/markNotificationAsRead', notification);” (5认同)
  • @MukundKumar 不要那样做。只需`从“./store”导入商店`。您没有理由需要导出函数来创建商店。只需导入商店即可。如果导出创建函数并在多个文件中创建商店,最终将得到多个商店。 (2认同)
  • 但我将 new Vuex.Store() 包装在 createStore 函数中。所以它应该有效。 (2认同)