如何在 store/index.js 中访问导出之外的状态?

Posted

技术标签:

【中文标题】如何在 store/index.js 中访问导出之外的状态?【英文标题】:How to access state outside export in store/index.js? 【发布时间】:2021-09-19 05:12:39 【问题描述】:

我在商店操作中使用 Axios,并希望根据某些状态设置 Axios 标头(以更改接受语言的请求标头)。尝试访问导出之外的商店时,我收到错误“找不到未定义的属性状态”。我的store/index.js 文件:

import Vue from "vue";
import Vuex,  Store  from "vuex";
import Axios from "axios";
Vue.use(Vuex);

Axios.defaults.headers['Accept-Language'] = store.state.Lang

const store = new Vuex.Store(
  state: 
    Lang: "en",
    ApiConf: [],
    Token: null,
    Session: null,
  
...

export default store

您将如何访问定义商店的同一文件中的商店和状态?或者你将如何在不进入商店并为每个动作定义的情况下实现这个依赖于状态的 Axios 标头?

【问题讨论】:

Axios.defaults.headers['Accept-Language'] 如果更改状态值,则不会神奇地更新 @LawrenceCherone 我忽略了这一点,但我相信我迟早会意识到这一点!谢谢 【参考方案1】:

store 在访问时未定义。 Vuex 存储通常在单独的模块中定义,因此它已经在导入它的模块中可用并且不会导致竞争条件。

另一个问题是,当Axios.defaults.headers 被分配一次存储值时,无法保留反应性,Accept-Language 将始终是初始值,除非在请求标头中指定。

这应该在 Axios 拦截器中完成:

Axios.interceptors.request.use(config => 
  config.headers['Accept-Language'] = store.state.Lang;
  return config;
);

【讨论】:

这解决了我的未定义存储问题,我忘记了 Axios 拦截器——正是我需要的!谢谢【参考方案2】:

您的代码的问题是您在声明 store 变量之前访问它,因此出现错误。

移动线:

Axios.defaults.headers['Accept-Language'] = store.state.Lang

出口声明上方:

import Vue from "vue";
import Vuex,  Store  from "vuex";
import Axios from "axios";
Vue.use(Vuex);

const store = new Vuex.Store(
  state: 
    Lang: "en",
    ApiConf: [],
    Token: null,
    Session: null,
  
...

Axios.defaults.headers['Accept-Language'] = store.state.Lang

export default store

【讨论】:

谢谢!我之前试过这个,我没有收到错误,但我的请求标头语言没有改变。劳伦斯的评论可能会解释为什么会这样..

以上是关于如何在 store/index.js 中访问导出之外的状态?的主要内容,如果未能解决你的问题,请参考以下文章

vue学习笔记——vuex—store配置

store---index.js

25vuex改变store中数据

使用vuex中的store存储数据

Vuex进阶使用之modules模块化划分mapStatemapActions辅助函数的使用

Vue.js 以特定方式自动注册 Vuex 模块