在 Vue.js 3 中添加全局变量

Adr*_* HM 19 javascript vue.js vue-component vuejs2 vuejs3

有人知道如何在 Vue 3 中添加全局变量吗?

在 Vue 2 中,我们在main.js文件中使用它:

Vue.prototype.$myGlobalVariable = globalVariable
Run Code Online (Sandbox Code Playgroud)

Zac*_*ché 43

如何使用 Vue 3 和 vue-cli(或 Vite)添加全局变量

注意:您可以删除您的美元符号$globalVariable并只使用,就像文档中globalVariable一样。

最初,您的 main.js 文件看起来像这样(为常见用例添加路由器):

import { createApp } from 'vue'
import { App } from './App.vue'
import { router } from './router'

createApp(App).use(router).mount('#app')
Run Code Online (Sandbox Code Playgroud)

要使用 Vue 3 和 vue-cliVite添加全局变量:

import { createApp } from 'vue'
import { App } from './App.vue'
import { router } from './router'

// 1. Assign app to a variable
let app = createApp(App)

// 2. Assign the global variable before mounting
app.config.globalProperties.globalVar = 'globalVar'

// 3. Use router and mount app
app.use(router).mount('#app')
Run Code Online (Sandbox Code Playgroud)

然后像这样访问组件中的变量:

<script>
export default {
    data() {
        return {
            myVar: this.globalVar
        }
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

就像在模板中这样:

<template>
  <h1>{{ globalVar }}</h1>
</template>
Run Code Online (Sandbox Code Playgroud)

就是这样。快乐编码!

关于全局变量和组合 API

根据samayo 在这篇文章中的回答的最底部全局变量仅在选项 API 上可用。

引用他的答案的底部:

注意:这仅适用于选项 API。Evan You(Vue 创建者)说:“config.globalProperties 是用于复制 Vue.prototype 行为的逃生舱口。在设置函数中,只需导入您需要的内容或显式使用提供/注入来向应用程序公开属性。

  • 用某种“特殊字符”作为变量前缀可以更容易地在代码中表明该变量确实是特殊的并且可能来自其他地方。这使得编码人员更有意识,开发也更不容易出错。 (3认同)
  • 嘿,太棒了!非常感谢!!=) (2认同)
  • 不,但这是污染全球范围的事情的常见做法。想想例如 jQuery 和他们的 $. 该方法也常用于 Vue 2 文档中。与往常一样,您可以自由地使用任何您想要的东西,就像您可以自由地驶离路边而不是跟随它一样。你可能应该查一下罗塞塔石碑。经验告诉我们,让它们脱颖而出(以某种方式)可以让它们的重要性更容易被看到。 (2认同)
  • @db2 刚刚更新。显然这不是合成 API 的功能。 (2认同)

ski*_*tle 17

最直接的替换是app.config.globalProperties。看:

https://v3.vuejs.org/api/application-config.html#globalproperties

所以:

Vue.prototype.$myGlobalVariable = globalVariable
Run Code Online (Sandbox Code Playgroud)

变成:

const app = Vue.createApp({})
app.config.globalProperties.$myGlobalVariable = globalVariable
Run Code Online (Sandbox Code Playgroud)

请注意,这仅限于特定应用程序,而不是像Vue.prototype. 这是设计使然,所有全局配置选项现在都适用于应用程序。

相关的 RFC 在这里:

https://github.com/vuejs/rfcs/blob/master/active-rfcs/0009-global-api-change.md

请注意,应用程序级provide/ inject(也在该 RFC 中讨论)也是使用的替代方法Vue.prototype

const app = Vue.createApp({})

app.provide('myGlobalVariable', globalVariable)

// In the descendant component
export default {
  inject: ['myGlobalVariable']
}
Run Code Online (Sandbox Code Playgroud)

文档:https : //v3.vuejs.org/api/application-api.html#provide

这里的想法是组件可以显式声明属性而不是通过魔法继承它。这避免了名称冲突等问题,因此无需使用$前缀。它还可以帮助更清楚地了解房产的确切来源。

您更喜欢哪种方法取决于您的情况。


Mar*_*tin 16

如果可能,您应该使用导入或提供/注入。定义全局变量/函数并使用它们的另一种方法是使用 globalProperties (尽管这似乎更多地被认为是一种反模式)。但是如果您使用的库使用 globalProperties 那么您可以像这样使用它。这也适用于全局函数。

const app = Vue.createApp({})
app.config.globalProperties.$http = () => {} // global function
app.config.globalProperties.$globalVariable = 'Jimmy' // global variable
Run Code Online (Sandbox Code Playgroud)

1. 使用选项API

mounted() {
  console.log(this.$globalVariable)
}
Run Code Online (Sandbox Code Playgroud)

2.使用设置方法

<script setup>
    import { getCurrentInstance } from 'vue'

    const app = getCurrentInstance()
    const progressBar = app.appContext.config.globalProperties.$globalVariable

    console.log(this.$globalVariable)
</script>
Run Code Online (Sandbox Code Playgroud)


Bou*_*him 8

我建议使用provide/inject如下方法:

在 main.js 中:

import {createApp} from 'vue'

let app=createApp({
  provide:{
    globalVariable:123
  }

}).$mount('#app')
Run Code Online (Sandbox Code Playgroud)

在某些子组件或孙组件中执行以下操作:

export default{
 name:'some-compo',
 inject:['globalVariable'],
 //then access this.globalVariable as property in you component
...
}

Run Code Online (Sandbox Code Playgroud)

  • 在我的示例中,createApp 正在传递一个组件,该组件具有 &lt;script setup&gt;。那么在这种情况下如何传递provide呢? (4认同)
  • @WM是的,你可以使用选项api,但在组合一中,你应该将每个注入的项目分配在一个特定的变量中 (2认同)
  • 您当前仅链接到选项 API 提供/注入页面,您还应该链接到组合 API 提供/注入页面:https://vuejs.org/api/composition-api-dependency-injection.html (2认同)

Ter*_*esa 7

对方法中如何访问感到困惑globalProperties的小setup()伙伴,可以getCurrentInstance()参考以下文档中的方法使用。

https://v3.vuejs.org/api/composition-api.html#getcurrentinstance

  • 从文档中可以看出:“getCurrentInstance 仅针对高级用例公开,通常在库中。强烈建议不要在应用程序代码中使用 getCurrentInstance。不要将其用作逃生口以在 Composition API 中获得等效的内容。” (3认同)

use*_*515 6

视图3:

import { getCurrentInstance } from "vue";

const { proxy } = getCurrentInstance();
Run Code Online (Sandbox Code Playgroud)

“proxy”将包含 globalProperties 的值。例如:

app.config.globalProperties.$toast = {...}
Run Code Online (Sandbox Code Playgroud)

进而:

proxy.$toast.success()
Run Code Online (Sandbox Code Playgroud)