admin管理员组文章数量:1134585
How to add a global variable in Vue.js 3?
In Vue.js 2 we use this in the main.js
file:
Vue.prototype.$myGlobalVariable = globalVariable
How to add a global variable in Vue.js 3?
In Vue.js 2 we use this in the main.js
file:
Vue.prototype.$myGlobalVariable = globalVariable
Share
Improve this question
edited Jul 21, 2023 at 9:23
bluish
27.3k28 gold badges125 silver badges184 bronze badges
asked Jul 26, 2020 at 13:16
Adri HMAdri HM
3,0303 gold badges22 silver badges31 bronze badges
3
- 1 stackoverflow.com/a/40897670/2815635 – Niklesh Raut Commented Jul 26, 2020 at 13:19
- 1 You can use Vuex to handle all global data – nassim miled Commented Jul 26, 2020 at 13:20
- 3 Yes of course, i can use the store or use a global mixin but I'm asking to use a prototype – Adri HM Commented Jul 26, 2020 at 13:21
7 Answers
Reset to default 131The most direct replacement is app.config.globalProperties
. See:
https://vuejs.org/api/application.html#app-config-globalproperties
So:
Vue.prototype.$myGlobalVariable = globalVariable
becomes:
const app = createApp(RootComponent)
app.config.globalProperties.$myGlobalVariable = globalVariable
This is scoped to a particular application rather than being global as it was with Vue.prototype
. This is by design, all 'global' configuration options are now scoped to an application.
The relevant RFC is here:
https://github.com/vuejs/rfcs/blob/master/active-rfcs/0009-global-api-change.md
Properties added to globalProperties
will be available via the component instance for all components within the application. So if you're using the Options API you'll be able to access them using this.$myGlobalVariable
, just like you could with Vue.prototype
. They'll also be available in the template without the this.
, e.g. {{ $myGlobalVariable }}
.
If you're using the Composition API then you'll still be able to use these properties within the template, but you won't have access to the component instance within setup
, so these properties won't be accessible there.
While hacks involving getCurrentInstance()
can be used to access globalProperties
within setup
, those hacks involve using undocumented APIs and are not the recommended approach.
Instead, application-level provide
/inject
(also discussed in that RFC) can be used as an alternative to Vue.prototype
:
const app = createApp(RootComponent)
app.provide('myGlobalVariable', globalVariable)
In the descendant component this can then be accessed using inject
. e.g. With <script setup>
:
<script setup>
import { inject } from 'vue'
const myGlobalVariable = inject('myGlobalVariable')
</script>
Or with an explicit setup
function:
import { inject } from 'vue'
export default {
setup() {
const myGlobalVariable = inject('myGlobalVariable')
// Expose it to the template, if required
return {
myGlobalVariable
}
}
}
Or with the Options API:
export default {
inject: ['myGlobalVariable']
}
Docs: https://vuejs.org/api/application.html#app-provide
The idea here is that the component can explicitly declare the property rather than inheriting it by magic. That avoids problems like name collisions, so there's no need to use a $
prefix. It can also help to make it clearer where exactly a property is coming from.
It is common for the inject
function to be wrapped in a composable. For example, the useRoute
composable exposed by Vue Router is just a wrapper around inject
.
In addition to globalProperties
and provide
/inject
, there are various other techniques that might be used to solve the same problems as Vue.prototype
. For example, ES modules, stores, or even global mixins. These aren't necessarily direct answers to the specific question posted here, but I've gone into more detail describing the various approaches at:
https://skirtles-code.github.io/vue-examples/patterns/global-properties.html
Which approach you prefer will depend on your circumstances.
How to add a global variable using Vue 3 and vue-cli (or Vite)
Note: You can drop the dollar sign from your $globalVariable
and just use globalVariable
, just like in the documentation.
Initially your main.js file looks something like this (adding router for common use case):
import { createApp } from 'vue'
import { App } from './App.vue'
import { router } from './router'
createApp(App).use(router).mount('#app')
To use add the global variable using Vue 3 and the vue-cli or Vite:
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')
Then to access the variables in components like this:
<script>
export default {
data() {
return {
myVar: this.globalVar
}
}
}
</script>
like in the template like this:
<template>
<h1>{{ globalVar }}</h1>
</template>
And that's it. Happy coding!
About Global Variables and Composition API
According to the very bottom of samayo's answer on this post, global variables are only available on the Options API.
Quoting the bottom of his answer:
Note: This is only for the Options API. Evan You (Vue creator) says: "config.globalProperties are meant as an escape hatch for replicating the behavior of Vue.prototype. In setup functions, simply import what you need or explicitly use provide/inject to expose properties to app.
I recommend to use provide/inject
approach as follows :
in main.js :
import {createApp} from 'vue'
const app=createApp({
provide:{
globalVariable:123
}
}).$mount('#app')
in some child or grand-child component do :
export default{
name:'some-compo',
inject:['globalVariable'],
//then access this.globalVariable as property in you component
...
}
for composition api and script setup :
import { inject } from 'vue'
const globalVar=inject('globalVariable')
If possible you should use imports or provide/inject. Another way to define global variables/functions and use them would be using globalProperties (although this seems to be considered more of an anti-pattern). But if a library you use uses globalProperties then you can use it like this. This also works with global functions.
const app = Vue.createApp({})
app.config.globalProperties.$http = () => {} // global function
app.config.globalProperties.$globalVariable = 'Jimmy' // global variable
1. Using options API
mounted() {
console.log(this.$globalVariable)
}
2. Using setup method
<script setup>
import { getCurrentInstance } from 'vue'
const app = getCurrentInstance()
const progressBar = app.appContext.config.globalProperties.$globalVariable
console.log(this.$globalVariable)
</script>
Vue 3:
import { getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
"proxy" will be contain the value from globalProperties. For example:
app.config.globalProperties.$toast = {...}
and then:
proxy.$toast.success()
For those of you who are confused about how to access globalProperties
in the setup()
method, you can use getCurrentInstance()
as in the following documentation.
https://v3.vuejs.org/api/composition-api.html#getcurrentinstance
In my case I had to create a global var and get the data from a script.
Used provide and inject:
In main.js
:
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App);
app.provide('message',document.querySelector('script[name="nameSCRIPT"]').innerHTML.split('=').slice(1).join('=').slice(1,-1));
app.mount('#app')
In index.html
:
<script name="nameSCRIPT">nameSCRIPT="HELLO"</script>
In child component:
inject:['message'],
mounted(){
console.log(this.message)
},
本文标签: javascriptAdd global variable in Vuejs 3Stack Overflow
版权声明:本文标题:javascript - Add global variable in Vue.js 3 - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736834595a1954842.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论