将全局变量应用于 Vuejs

Apply global variable to Vuejs

我有一个 javascript 变量,我想在实例化时将其全局传递给 Vue 组件,因此每个注册的组件都将其作为 属性 或者可以全局访问。

注意::我需要将 vuejs 的这个全局变量设置为 READ ONLY 属性

您可以使用 Global Mixin 来影响每个 Vue 实例。您可以将数据添加到此 mixin,使 value/values 可用于所有 vue 组件。

要将该值设置为只读,您可以使用 this Stack Overflow answer 中描述的方法。

这是一个例子:

// This is a global mixin, it is applied to every vue instance. 
// Mixins must be instantiated *before* your call to new Vue(...)
Vue.mixin({
  data: function() {
    return {
      get globalReadOnlyProperty() {
        return "Can't change me!";
      }
    }
  }
})

Vue.component('child', {
  template: "<div>In Child: {{globalReadOnlyProperty}}</div>"
});

new Vue({
  el: '#app',
  created: function() {
    this.globalReadOnlyProperty = "This won't change it";
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.3/vue.js"></script>
<div id="app">
  In Root: {{globalReadOnlyProperty}}
  <child></child>
</div>

Adding Instance Properties

比如所有的组件都可以访问一个全局的appName,你只要写一行代码:

Vue.prototype.$appName = 'My App'

或者在vue3中 app.config.globalProperties.$http = axios.create({ /* ... */ })

$ 不是魔法,它是 Vue 用于所有实例都可用的属性的约定。

或者,您可以 write a plugin 包括所有全局方法或属性。

您可以像这样使用 mixin 和更改 var。

// This is a global mixin, it is applied to every vue instance
Vue.mixin({
  data: function() {
    return {
      globalVar:'global'
    }
  }
})

Vue.component('child', {
  template: "<div>In Child: {{globalVar}}</div>"
});

new Vue({
  el: '#app',
  created: function() {
    this.globalVar = "It's will change global var";
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.3/vue.js"></script>
<div id="app">
  In Root: {{globalVar}}
  <child></child>
</div>

如果全局变量不应该被任何东西写入,包括 Vuejs,您可以使用 Object.freeze 来冻结您的对象。将它添加到 Vue 的视图模型不会解冻它。 另一种选择是为 Vuejs 提供对象的冻结副本,如果该对象打算全局写入而不是由 Vue 写入:var frozenCopy = Object.freeze(Object.assign({}, globalObject))

你可以使用 Vuex 来处理你所有的全局数据

一种可能是在 index.html 处声明变量,因为它确实是全局变量。可以将 javascript 方法添加到 return 变量的值,并且它将是只读的。我确实喜欢:

假设我有 2 个全局变量(var1 和 var2)。只需将此代码添加到 index.html header:

  <script>
      function getVar1() {
          return 123;
      }
      function getVar2() {
          return 456;
      }
      function getGlobal(varName) {
          switch (varName) {
              case 'var1': return 123;
              case 'var2': return 456;
              // ...
              default: return 'unknown'
          }
      }
  </script>

可以为每个变量执行一个方法或使用一个带有参数的方法。

这个解决方案适用于不同的 vuejs mixins,它是一个真正的全局值。

在带有 createApp() 的 VueJS 3 中,您可以使用 app.config.globalProperties

像这样:

const app = createApp(App);

app.config.globalProperties.foo = 'bar';

app.use(store).use(router).mount('#app');

并像这样调用您的变量:

app.component('child-component', {
  mounted() {
    console.log(this.foo) // 'bar'
  }
})

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

如果您的数据是反应性的,您可能需要使用 VueX。

在您的 main.js 文件中,您必须像这样导入 Vue :

import Vue from 'vue'

然后你必须像这样在 main.js 文件中声明你的全局变量:

Vue.prototype.$actionButton = 'Not Approved'

如果你想从另一个组件更改全局变量的值,你可以这样做:

Vue.prototype.$actionButton = 'approved'

https://vuejs.org/v2/cookbook/adding-instance-properties.html#Base-Example

in main.js(或任何其他 js 文件)

export const variale ='someting' 在 app.vue(或任何其他组件)

import {key} from '../main.js' (file location) 在数据方法中定义变量的键并使用它。

如果你想在多个组件中使用一个变量,但又不想污染全局作用域。在这些情况下,您可以通过在 Vue prototype:

上定义它们来使它们对每个 Vue instance 可用
Vue.prototype.$yourVariable = 'Your Variable'

请记住在您的项目入口点创建 Vue instance 之前添加此行,大多数时候它是 main.js

现在 $yourVariable 可用于所有 Vue instances,甚至在创建之前。如果我们 运行:

new Vue({
  beforeCreate: function() {
    console.log(this.$yourVariable)
  }
})

然后"Your Variable"将被记录到控制台!

doc: https://vuejs.org/v2/cookbook/adding-instance-properties.html#Base-Example

如果想让这个变量不可变,可以使用静态方法Object.defineProperty():

Object.defineProperty(Vue.prototype, '$yourVariable', {
  get() {
    return "Your immutable variable"
  }
})

默认情况下,此方法将防止您的变量从 Vue prototype

中删除或替换

如果您想更进一步,假设您的变量是一个对象,并且您不希望对您的对象应用任何更改,您可以使用 Object.freeze():

Object.defineProperty(Vue.prototype, '$yourVariable', {
  get() {
    return Object.freeze(yourGlobalImmutableObject)
  }
})