What is the best way to declare global variables in Vue.js?

What is the best way to declare global variables in Vue.js?

As you need access to your hostname variable in every component, and to change it to localhost while in development mode, or to production hostname when in production mode, you can define this variable in the prototype.

Like this:

Vue.prototype.$hostname = http://localhost:3000

And $hostname will be available in all Vue instances:

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

In my case, to automatically change from development to production, Ive defined the $hostname prototype according to a Vue production tip variable in the file where I instantiated the Vue.

Like this:

Vue.config.productionTip = false
Vue.prototype.$hostname = (Vue.config.productionTip) ? https://hostname : http://localhost:3000

An example can be found in the docs:
Documentation on Adding Instance Properties

More about production tip config can be found here:

Vue documentation for production tip

Warning: The following answer is using Vue 1.x. The twoWay data mutation is removed from Vue 2.x (fortunately!).

In case of global variables—that are attached to the global object, which is the window object in web browsers—the most reliable way to declare the variable is to set it on the global object explicitly:

window.hostname = foo;

However form Vues hierarchy perspective (the root view Model and nested components) the data can be passed downwards (and can be mutated upwards if twoWay binding is specified).

For instance if the root viewModel has a hostname data, the value can be bound to a nested component with v-bind directive as v-bind:hostname=hostname or in short :hostname=hostname.

And within the component the bound value can be accessed through components props property.

Eventually the data will be proxied to this.hostname and can be used inside the current Vue instance if needed.

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
  }
});
<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>

In cases that we need to mutate the parents data upwards, we can add a .sync modifier to our binding declaration like :foo.sync=foo and specify that the given props is supposed to be a twoWay bound data.

Hence by mutating the data in a component, the parents data would be changed respectively.

For instance:

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
  }
});
<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>

What is the best way to declare global variables in Vue.js?

I strongly recommend taking a look at Vuex, it is made for globally accessible data in Vue.

If you only need a few base variables that will never be modified, I would use ES6 imports:

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

// .vue file
import config from config.js

console.log(config.hostname)

You could also import a json file in the same way, which can be edited by people without code knowledge or imported into SASS.

Leave a Reply

Your email address will not be published.