在Vue.js中声明全局变量的最佳方法是什么?

Dmi*_*kov 40 global-variables vue.js

我需要hostname在每个组件中访问我的变量.

把它放进去是个好主意data吗?

我是否正确理解如果我这样做,我将能够到处调用它this.hostname

Jos*_*ros 44

由于您需要访问每个组件中的hostname变量,并在开发模式下将其更改为localhost,或者在生产模式下更改为www.your-api.com,您可以在原型中定义此变量.

像这样:

Vue.prototype.$hostname = 'http://localhost:3000'
Run Code Online (Sandbox Code Playgroud)

$ hostname将在所有Vue实例中可用:

new Vue({
  beforeCreate: function () {
    console.log(this.$hostname)
  }
})
Run Code Online (Sandbox Code Playgroud)

在我的例子中,为了自动从开发变为生产,我根据我实例化Vue的文件中的Vue生产提示变量定义了$ hostname原型.

像这样:

Vue.config.productionTip = false
Vue.prototype.$hostname = (Vue.config.productionTip) ? 'https://www.your-api.com' : 'http://localhost:3000'
Run Code Online (Sandbox Code Playgroud)

可以在文档中找到一个示例: 有关添加实例属性的文档

有关生产技巧配置的更多信息,请访问:

生产技巧的Vue文档

  • 为清楚起见,第一行是main.js (5认同)
  • 你应该更喜欢 `Object.defineProperty(Vue.prototype, '$hostname', { value: 'http://localhost:3000' }` 因为变量默认是 _read-only_。你可以在这篇文章中看到更多细节:https://dzone.com/articles/use-any-javascript-library-with-vuejs (3认同)
  • 我可以问为什么“$hostname”而不是“hostname”吗?它只是自定义属性的样式约定,还是避免属性名称冲突......? (2认同)
  • 来自文档的@DigitalNinja:“这里没有发生魔术。$是Vue对所有实例可用的属性使用的约定。这避免了与任何定义的数据,计算的属性或方法的冲突。” [docs](https://vuejs.org/v2/cookbook/adding-instance-properties.html#The-Importance-of-Scoping-Instance-Properties) (2认同)
  • @DigitalNinja,所以这是一个不会发生意外冲突的约定 (2认同)

Has*_*ami 12

警告:以下答案使用Vue 1.x. 该twoWay数据突变从Vue公司2.X删除(幸运的!).我会尽快更新答案.

如果是"全局"变量 - 附加到全局对象(Web浏览器中的窗口对象) - 声明变量的最可靠方法是将其明确地设置在全局对象上:

window.hostname = 'foo';
Run Code Online (Sandbox Code Playgroud)

但是,根据Vue的层次结构透视图(根视图模型和嵌套组件),数据可以向下传递(如果指定了twoWay绑定,则可以向上突变).

例如,如果根视图模型具有hostname数据,则可以使用v-bind指令将该值绑定到嵌套组件 v-bind:hostname="hostname",简而言之:hostname="hostname".

在组件中,可以通过组件的props属性访问绑定值.

最终,数据将被代理到this.hostname并且可以在当前Vue实例内使用(如果需要).

var theGrandChild = Vue.extend({
  template: '<h3>The nested component has also a "{{foo}}" and a "{{bar}}"</h3>',
    props: ['foo', 'bar']
});

var theChild = Vue.extend({
  template: '<h2>My awesome component has a "{{foo}}"</h2> \
             <the-grandchild :foo="foo" :bar="bar"></the-grandchild>',
  props: ['foo'],
  data: function() {
    return {
      bar: 'bar'
    };
  },
  components: {
    'the-grandchild': theGrandChild
  }
});


// the root view model
new Vue({
  el: 'body',
  data: {
    foo: 'foo'
  },
  components: {
    'the-child': theChild
  }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script>
<h1>The root view model has a "{{foo}}"</h1>
<the-child :foo="foo"></the-child>
Run Code Online (Sandbox Code Playgroud)


在我们需要向上改变父数据​​的情况下,我们可以在.sync绑定声明中添加一个修饰符,:foo.sync="foo"并指定给定的'props'应该是twoWay绑定数据.

因此,通过改变组件中的数据,父母的数据将分别改变.

例如:

var theGrandChild = Vue.extend({
  template: '<h3>The nested component has also a "{{foo}}" and a "{{bar}}"</h3> \
             <input v-model="foo" type="text">',
    props: {
      'foo': {
        twoWay: true
      },  
      'bar': {}
    }
});

var theChild = Vue.extend({
  template: '<h2>My awesome component has a "{{foo}}"</h2> \
             <the-grandchild :foo.sync="foo" :bar="bar"></the-grandchild>',
  props: {
    'foo': {
      twoWay: true
    }
  },
  data: function() {
    return { bar: 'bar' };
  },  
  components: {
    'the-grandchild': theGrandChild
  }
});

// the root view model
new Vue({
  el: 'body',
  data: {
    foo: 'foo'
  },
  components: {
    'the-child': theChild
  }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script>
<h1>The root view model has a "{{foo}}"</h1>
<the-child :foo.sync="foo"></the-child>
Run Code Online (Sandbox Code Playgroud)

  • 请定义"很快". (29认同)
  • 我猜他的意思是"从不". (12认同)
  • 他不需要.Vue更快,并重新实现它:https://vuejs.org/v2/guide/components.html#sync-Modifier (4认同)

KuN*_*KuN 7

对于任何单个文件组件用户,以下是我设置全局变量的方法

  1. 假设您使用的是Vue-Cli的webpack模板
  2. 在某个变量.js中声明你的变量

    const shallWeUseVuex = false;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将其导出为variable.js

    module.exports = { shallWeUseVuex : shallWeUseVuex };
    
    Run Code Online (Sandbox Code Playgroud)
  4. Require 并在您的vue文件中分配它

    export default {
        data() {
            return {
                shallWeUseVuex: require('../../variable.js')
            };
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

参考:https://vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch

  • 遗憾的是,weWeseVuex是在data(){}中定义的变量,即它可以被更改.唉,您不能在模板或HTML中使用'const shallWeUseVuex',而是必须从data(){}引用变量版本 - 如上所述,这不是常量. (2认同)

ira*_*ari 7

一个vue3更换这个答案

// Vue3

const app = Vue.createApp({})
app.config.globalProperties.$hostname = 'http://localhost:3000'


app.component('a-child-component', {
  mounted() {
    console.log(this.$hostname) // 'http://localhost:3000'
  }
})
Run Code Online (Sandbox Code Playgroud)


Fab*_*rts 5

我强烈建议您看一下Vuex,它是为Vue中可全局访问的数据而设计的。

如果您只需要一些永远不会被修改的基本变量,那么我将使用ES6导入:

// config.js
export default {
   hostname: 'myhostname'
}

// .vue file
import config from 'config.js'

console.log(config.hostname)
Run Code Online (Sandbox Code Playgroud)

您也可以json用相同的方式导入文件,该文件可以由不具备代码知识的人编辑或导入到SASS中。