如何从javascript / typescript模块文件(导入/导出)访问Vuex存储?

时间:2018-09-29 07:30:53

标签: javascript typescript vue.js vue-component vuex

我有一个vue申请。

如何从javascript / typescript模块文件(导入/导出)访问商店?

例如,我创建用于导出状态,操作,突变的身份验证模块。

export const auth = {
  namespaced: true,
  state,
  actions,
  mutations,
  getters,
};

在我的应用中,我将该模块导入到我的商店中:

Vue.use(Vuex);

export const store = new Vuex.Store({

  modules: {
    auth,
  }
});

现在,我想为我的http调用创建拦截器(在我的身份验证模块内部),以从商店添加令牌。

Vue.http.interceptors.push((request: any) => {
    // ---> store.state.token???
    // request.headers.set('Authorization', 'Bearer TOKEN');
  });

但是如何不依赖于我的应用程序就可以访问商店的状态? import {store} from './store',但可以从vuevuex模块导入商店实例。

1 个答案:

答案 0 :(得分:1)

您可以使用插件来实现。

  1. 使用插件时,您将获得商店实例。
  2. 订阅实例,您将获得状态,从状态中提取令牌并将其保存到本地变量。
  3. 在“拦截器”中读取此模块全局变量。

这是我为您打造的解决方案:

StoreTokenInterceptorPlugin.ts

import Vue from 'vue';
import VueResource from 'vue-resource';
import { get } from 'lodash';

Vue.use(VueResource);

export const StoreTokenInterceptorPlugin = (store: any) => {
  let token: string | null = null;

  (Vue.http.interceptors as any).push((request: any) => {
    if (token && !request.headers.get('Authorization')) {
      request.headers.set('Authorization', `Bearer ${token}`);
    }
  });

  store.subscribe((mutation: any, state: any) => {
    token = get(state, 'auth.token') || null;
  });
};

在您的应用商店中:

import Vue from 'vue';
import Vuex from 'vuex';

import { auth, StoreTokenInterceptorPlugin } from '@modules/auth';

Vue.use(Vuex);

export const store = new Vuex.Store({
  state,

  modules: {
    auth,
  } as any,
  ....
  plugins: [StoreTokenInterceptorPlugin],
});