Vuex 4 模块不能使用全局 axios 属性

Vuex 4 Modules can't use global axios property

我有一个 Vue3(没有 Typescript)应用程序 运行 Vuex 4.0.0.

我正在尝试使用 axios 在我的一个商店模块中设置一个简单的 GET 请求,但是当我尝试通过我的一个组件,但是如果我从组件调用 this.$axios 它工作正常。出于某种原因,我的模块无法使用 this.$axios,而我可以在应用程序的其他地方使用。

我在 main.js 文件中将 $axios 声明为 globalProperty

// main.js

import { createApp } from "vue";
import App from "./App.vue";
import { router } from "./router";
import { store } from "./store";
import axios from "axios";

const app = createApp(App).use(store).use(router);
app.config.globalProperties.$axios = axios;

app.mount("#app");

商店模块看起来像这样(为了这个问题的目的而简化):

// store/modules/example.js

const state = () => ({
  message: ""
});

const mutations = {
  getMessage(state, payload) {
    state.message = payload;
  }
};

const actions = {
  async setMessage(commit) {
    this.$axios.get("example.com/endpoint").then(response => {
      commit("setMessage", response.message);
    });
  }
};

export default {
  namespaced: true,
  state,
  getters,
  actions,
  mutations
};

上面 main.js 中导入的主要 store/index.js 如下所示:

// store/index.js

import "es6-promise";
import { createStore } from "vuex";

import example from "./modules/example";

export const store = createStore({ modules: { example } });

在组件中,我有以下内容:

// MyComponent.vue

import { mapGetters, mapActions } from "vuex";

export default {
  computed: {
    ...mapGetters({
      message: "example/getMessage"
    })
  },
  methods: {
    ...mapActions({
      getMessage: "example/setMessage"
    })
  }
};

还有一个带有 @click="getMessage" 的简单按钮。但是,单击此按钮 returns Uncaught (in promise) TypeError: Cannot read property 'get' of undefined,但是如果我 copy/paste 将 setMessage 操作放入组件方法中,它就可以正常工作。

有没有办法让我将 this.$axios 公开给商店文件?

虽然这不是理想的解决方案,因为我更希望通过挂载文件中的单个声明让我的 $axios 实例在全球范围内可用,但它可能是下一个最好的选择。

我制作了一个 lib/axiosConfig.js 文件,该文件导出一个带有一些自定义 axios 选项的 axios 实例,我只在每个需要它的模块中导入那个实例。

import axios from "axios";

axios.defaults.baseURL= import.meta.env.DEV ? "http://localhost:8000": "example.com";
axios.defaults.headers.common["Authorization"] = "Bearer " + localStorage.getItem("token");
axios.defaults.headers.common["Content-Type"] = "application/json";
// etc...

export const $axios = axios.create();

在我需要 $axios 的任何模块中,我只是 import { $axios } from "./lib/axiosConfig。它并不像我提到的那样完美,因为我仍然必须在每个模块中导入它,但就我所见,它已经足够接近了,并且具有通过导入此文件在任何地方使用相同的 axios 配置的额外好处。