在 Vuex 存储中使用全局变量

Posted

技术标签:

【中文标题】在 Vuex 存储中使用全局变量【英文标题】:Using global variables inside Vuex store 【发布时间】:2021-12-07 03:17:33 【问题描述】:

我将自定义全局变量注入 vue。你可以看下面的代码。

export default function (props, inject) 
    inject('models', 
        register(name) 
            const model = require(`@/models/$name.js`)
            model.default(props, inject)
        
    )

这行得通,我使用它没有问题,唯一的问题是在将它们加载到 vuex 商店时。我正在使用 Nuxt.js,其中商店与 vue.js 有点不同,但它的工作原理几乎相同。 我在 store 文件夹 中的 products.js 如下所示:

export const state = () => (
    products: [],
)

export const getters = 
    get_product: state => async id => 
        let loadedProduct = state.products.find(p => p.id == id)
        let isAllreadyLoaded = loadedProduct != null ? loadedProduct : false
        if(isAllreadyLoaded) 
        
            return loadedProduct
        
        else 
        
            let fetchedProduct = await this.$products.find(id)
            return fetchedProduct
        
    

我只是先检查我是否已经在缓存中拥有该产品,如果是,我想退回该产品,否则我想获取一个产品。 但是,我在 this.$products 上遇到了错误。错误说:

TypeError: Cannot read properties of undefined (reading '$products'). 

这就是我访问我的商店的方式:

async asyncData(store, params, $products) 
        let product = await store.getters['products/get_product'](params.id)
        return  
            product
        
,

我已经尝试在 vuex 商店中使用 Vue.prototype.$products 而不是 this.$products,但不幸的是这并没有帮助。有什么解决办法吗? 我需要在 vuex 商店中使用一个全局变量

【问题讨论】:

【参考方案1】:

在 Nuxt 中它的工作方式不同,你必须制作一个插件,然后将其注入那里。

见:https://nuxtjs.org/docs/directory-structure/plugins/#inject-in-root--context

【讨论】:

感谢建议,但我找到了解决方法。与此同时,我做了一些研究并自己尝试了一些东西。令人惊讶的是,在 js 窗口全局变量中插入了一个 $nuxt 属性。因此,您可以在 vuex 商店中使用 window.$nuxt.$products,而不是使用 this.$product 或 Vue.prototype.$product 来访问它。【参考方案2】:

与此同时,我自己也尝试了一些东西。我发现的东西也许可以帮助其他有同样问题的人。

在 vuex 存储中你不能访问自定义的全局注入变量,但是你可以访问主窗口变量。我发现,window 中插入了一个$nuxtjs 属性,因此您可以使用以下方法访问全局 nuxt 变量:

let mycustomvariable = "$products"
window.$nuxt[mycustomvariable]

【讨论】:

以上是关于在 Vuex 存储中使用全局变量的主要内容,如果未能解决你的问题,请参考以下文章

vue-cli2使用store存储全局变量

Vue总结第六天:Vuex (全局变量管理~多个页面共享数据)

vue 全局环境变量配置和自定义全局变量

vue3中使用scss全局变量

Vue之Vuex的使用

从 Vuex 商店全局访问 const 变量