Mastering Vuex — Zero to Hero

Mastering Vuex — Zero to Hero

Vuex is a state management pattern + library for Vue.js applications. In this article you'll learn mastering Vuex from zero to hero

Vuex is a state management pattern + library for Vue.js applications. In this article you'll learn mastering Vuex from zero to hero

The official documentation of Vuex defines it as a state management pattern+ library for Vue.js applications. But what does this mean? What is a state management pattern?

Imagine working on a large web app with hundreds of routes and components. Wouldn't it be easier if we could store all the data we ever need inside the app, in one centralized storage location?

Every component or route inside our application will request data from the Vuex state and commits modified data back to the state.

In essence, the Vuex state can be viewed as a single source of truth for the entire application.

Data is stored inside the state as a single JSON object. For example :

state : {
    name : “John Doe”,
    age : “28”,
}

But how can our components and routes access the data stored in our state? We define Getters inside our Vuex store which returns the data from our store back to our components. Let’s see how a simple Getter, to retrieve the name stored in our state looks like.

getters : {
  NAME : state => {
    return state.name
  }
}

Notice that, we have capitalized the name of the getter. This is just a recommended coding convention and it’s not absolutely necessary for you to follow the same if you are not a fan of it.

Now that we have defined a getter for the name, it’s incredibly easy to fetch the value of name inside our component, as shown in the snippet below.

let name = this.$store.getters.NAME

We have figured out how to get data from the state, let’s see how we can setdata into our state. We define setters, right? Except, Vuex setters are named slightly different. We define a Mutation to set data into our Vuex state.

mutations : {
  SET_NAME : (state,payload) => {
    state.name = payload,
  }
}

What the heck is a payload? A payload is simply the data passed to our mutation from the component committing the mutation. How do we do that ? Simple…

this.$store.commit(“SET_NAME”,your_name)

This snippet of code will mutate the state and set whatever value that is assigned to your_name, to the name property inside our Vuex state.

Mutations are synchronous
Imagine we have a list of names, stored in a database on a remote server. The server provides us an API endpoint that returns an array of names, which can be consumed in our Vue.js application. Of course, we can use **Axios **to make a get request to the API endpoint and retrieve the data.

let { data } = await Axios.get(‘https://myapiendpoint.com/api/names')

We could then commit the returned array in to our Vuex store via mutation. Simple.. right? Well, not so much. Mutations are synchronous and we cannot run asynchronous operations such as API calls inside a mutation.

So what do we do now. ? We create Actions.

Actions are similar to mutation, but instead of mutating the state directly they commit a mutation. Confused? Let’s inspect an action declaration.

actions : {
  SET_NAME : (context,payload){
     context.commit("SET_NAME",payload);
  }
}

We have defined an action called SET_NAME which accepts context and payload as parameters. The action commits the mutation SET_NAME created earlier with the payload passed to it, that is your_name.

Now instead of committing the mutation directly, our components dispatch an action SET_NAME, with the new name as payload as follows:

this.$store.dispatch("SET_NAME",your_name)

The action then commits the mutation with the payload passed to it, that is your_name.

But why ?

You might be wondering why an action declaration is required when we could simply commit our mutations with the new value directly from our components. As mentioned above mutations are synchronous but actions are not.

In the above example, consider a case when you have to update the value of name, not just in your state but also on a database running on a remote server. I am pretty sure this is how you are going to use Vuex in a real project 99% of the time. Take a look at the following code snippet.

mutations : {
  SET_NAME : (state,name) => {
    state.name = name
  }
},
actions : {
  SET_NAME : async (context, name) => {
    let { data } = await Axios.post('http://myapiendpoint.com/api/name',{name : name})
    if(data.status == 200){
      context.dispatch('SET_NAME', name)
    }
  }
}

The code itself is self-explanatory. We use Axios to post the name to an API end-point. If the POST request is successful that is the value of the field name has been successfully changed in the server, we commit the SET_ NAME mutation to update the value of name inside our state as well.

Mutations are synchronous#### Setting up a Vuex store in Vue.JS

Let’s dive in deeper and learn how we can actually implement Vuex in a real application.

Setp 1. Install Vuex

npm install --save vuex

Step 2. Creating a Vuex Store

  1. Create a folder named store inside your root directory.
  2. Create an index.js file inside the newly added store folder and use the snippet below to create a new store.
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);

export const store = new Vuex.Store({
  state: {},
  getters : {},
  mutations: {},
  actions : {}  
})

Step 3. Add Vuex store to our Vue.Js application

  1. Create a folder named store inside your root directory.
  2. Create an index.js file inside the newly added store folder and use the snippet below to create a new store.
import { store } from './store'

  1. Attach the store to our Vue instance as shown below.
new Vue({
  el: '#app',
  store,
  router,
  render: h => h(App)
})

And we are done. Now we can add state variablesgettersmutations and actions inside our Vuex store.

An Example

Take a look at the Vuex store of a simple to-do list application. “Not another TODO list !!” Right? Well, don’t worry. By the end of this article, you will be well equipped to use Vuex in all its might and glory.

import Vue from 'vue'
import Vuex from 'vuex'
import Axios from 'axios'

Vue.use(Vuex);

export const store = new Vuex.Store({
  state: {
    todos : null
  },
  getters : {
    TODOS : state => {
      return state.todos;
    }
  },
  mutations: {
    SET_TODO : (state,payload) => {
      state.todos = payload
    },
    ADD_TODO : (state,payload) => {
      state.todos.push(payload)
    },
  },
  actions:{
   GET_TODO : async (context,payload) => {
      let { data } = await Axios.get('http://yourwebsite.com/api/todo')
      context.commit('SET_TODO',data)
   },
   SAVE_TODO : async (context,payload) => {
      let { data } = await Axios.post('http://yourwebsite.com/api/todo')
      context.commit('ADD_TODO',payload)
   },
 },
})

Adding a new item to the to-do list

Inside your component, dispatch an action SAVE_TODO with the to-do item as payload as shown in the code snippet below.

let item = "Get groceries"
this.$store.dispatch('SAVE_TODO',item)

The action **SAVE_TODO **makes a POST request to your API end-point and then commits a mutation ADD_TODO, which pushes the to-do list item to the state variable todos.

Fetching your to-do list

Inside the mounted() block in your component, dispatch the second action GET_TODO, which fetches all the to-do items from your API end-point and saves it to the state variable todos, by committing a mutation SET_TODO

mounted(){
    this.$store.dispatch('GET_TODO')
}

Accessing the to-do list inside your component

Create a computed property as shown in the snippet below, to access the todos item inside your component.

computed : {
  todoList(){
     return this.$store.getters.TODOS
  }
}

Inside your component you can access the computed property as shown below.

<div class="todo-item" v-for="item in todoList"></div>

Using Map Getters method

There is an even simpler way of accessing your todos list inside you component using the mapGetters method provided by Vuex.

import {mapGetters} from 'vuex
computed : {
...mapGetters(['TODOS']),
  //Other computed properties
}

You might have already guessed this, but the code inside your template definition have to modified as shown in the snippet below.

<div class="todo-item" v-for="item in TODOS"></div>

Notice how we have used the ES6 spread operator [ … ] inside our computed properties.

Mutations are synchronous
This needs a little bit of explanation. We already learned to define Actions to get and set the todos item in our state. What if we had to update the item and mark it complete ? Where do we run the code for this ?

You might find contrasting opinions on the subject all over the Internet, and there is no clear guidelines specified in the documentation as well.

I would recommend keeping all your API calls inside Actions in your Vuex store. This way every change that gets committed to your state only comes from inside the store and makes it easier for you to debug and make the code easier to understand. It also has the added benefit of making edits in your code easier.

Now, how do we delete and update an item from the todos list ? Try implementing an action and mutation to update and remove items from your todos list and let me know in the comments below.

Organizing your code

Saving all your state variables, getters, actions, and mutations in one single file will quickly become cumbersome once you start working on medium to large sized real-world applications. Let’s see how we can organize our store into multiple files as modules.

Create a new folder inside your store called modules. Add a new file called todos.js inside the modules folder.

const state = {}
const getters = {}
const mutations = {}
const actions = {}
export default{
    state,getters,mutations,actions
} 

Now you can move your state variables, getters, mutations and actions from index.js into todos.js file. Don’t forget to import Axios. All we need to do now is let Vuex know we have created a store module and where to find it. Your new index.js file should look something like this.

import Vue from 'vue'
import Vuex from 'vuex'
import Axios from 'axios'
import todos from './modules/todos'

Vue.use(Vuex);

export const store = new Vuex.Store({
  
  state: {},
  getters : {},
  mutations: {},
  actions:{},
  
  modules : {
    todos
  }
})

And your todos.js file will be as shown in the gist below.

import Axios from 'axios'

state = {
    todos : null
},
getters = {
   TODOS : state => {
     return state.todos;
   }
},
mutations = {
  SET_TODO : (state,payload) => {
     state.todos = payload
  },
  ADD_TODO : (state,payload) => {
     state.todos.push(payload)
  },
},
actions = {
  GET_TODO : async (context,payload) => {
      let { data } = await Axios.get('http://yourwebsite.com/api/todo')
      context.commit('SET_TODO',data)
  },
  SAVE_TODO : async (context,payload) => {
      let { data } = await Axios.post('http://yourwebsite.com/api/todo')
      context.commit('ADD_TODO',payload)
  }
}

export default {
  state,getters,mutations,actions
}

Important Takeaways

  1. Create a folder named store inside your root directory.
  2. Create an index.js file inside the newly added store folder and use the snippet below to create a new store.

Vuex makes working with Vue so much easier and fun. If you are a beginner there might be instances where it’s tough for you to decide if you need to use Vuex or not in certain areas of your application. Follow your gut. You will be up-to-speed pretty quick.

What are the differences between the various JavaScript frameworks? E.g. Vue.js, Angular.js, React.js

What are the differences? Do they each have specific use contexts?

What are the differences? Do they each have specific use contexts?

Ember.js vs Vue.js - Which is JavaScript Framework Works Better for You

Ember.js vs Vue.js - Which is JavaScript Framework Works Better for You

In this article we will discuss full details and comparison of both Ember.js and Vue.js

JavaScript was initially created to work for web applications. But today they have become the favorite of mobile app developers. Most of the developers prefer to work with frameworks based on JavaScript. It simplifies coding. You can use JavaScript with almost any framework.

The use of a particular framework will decide how easy and fast it is to create the app. So, you must choose the best one suited for the app that you are planning to build. You must make a wise choice so that you benefit in the end. Among the crowded market, two of the frameworks stand out. We will make a comparison between Ember.js and Vue.js.

Why Do You Select A Particular Framework?

Before we start comparing the two frameworks, we should understand the factors that lead to the choice of a framework. Each developer chooses a framework before he or she goes to work on an app. Let us see the reasons for the selection.

● The codes must be easy to understand and transparent.

● The framework should give the maximum power with the least amount of coding.

● The framework should provide a well laid out structure to work on.

● Does the framework support an in-built router or an external plug-in router?

● The framework should be able to transfer more data on a full page-load so that it becomes a single-page app. A single-page app is more beneficial for the application.

● In single page architectures if there is a need for users to share links to sub-screens within the interface, then the framework should have the capacity to route based on the URL.

● A tighter template option can help in enabling two-way binding.

● The framework should not conflict any third-party library.

● Testing the codes inside the framework should be easy.

● The framework should provide the HTTP client service for AJAX calls

● The documentation is essential. It should be complete and up-to-date.

● The framework should be compatible with the latest version of the browser.

● The framework has to fulfill the above conditions for easy construction of the app. You must ensure that the framework you choose meets the conditions.

Vue.js Explained

Developers are always looking at new frameworks to build their apps. The main requirements are speed and low cost. The framework should be easy to use by even new developers. You should be able to use it at low cost. Other considerations are about simple coding, proper documentation, etc.

Vue.js combines a lot of good when it comes to software language for web app development. The architecture of Vue.js is easy to put in use. The apps developed using Vue.js are easy to integrate with new apps.

Vue.js is a very lightweight framework. It makes it fast to download. It is also much faster than other frameworks. The single-file component nature of the framework is also beneficial. The size has made it very popular.

You can further decrease weight. With Vue.js you can separate the template-to-virtual DOM and compiler. You can only deploy the minified and zipped interpreter which is only 12 KB. You can compile the templates in your machine.

Another significant advantage of Vue.js is that it can integrate easily with existing applications created with JavaScript. It will make it easy for using this framework to make changes to applications already present.

Vue.js also integrates easily with other front-end libraries. You can plug in another library and make up for any deficiency in this framework. This feature makes this tool a versatile one.

Vue.js uses the method of rendering on the streaming-side server. You can render your component and get a readable stream. You can then send this to the HTTP server. It makes the server highly responsive. Your users will get the rendered content very quickly.

Vue.js is very SEO friendly. As the framework supports server-side rendering, the views are rendered directly on the server. The search engines list these.

But the most important thing for you is the ease with which you can learn Vue.js. The structure is elementary. Even new developers will find it easy to use it to build their apps. This framework helps in developing both small and large templates. It helps to save a lot of time.

You can go back and check your errors very easily. You can travel back and inspect all the states apart from testing your components. It is another important feature as far as any developer is concerned.

Vue.js also has very detailed documentation. It helps in writing your applications very quickly. You can build a web page or app with the basic knowledge of HTML or JavaScript.

● Vue.js has pure architecture. It helps in integration with other apps

● Vue.js is lightweight and fast. It can be made lighter by deploying only the interpreter

● You can separate the compiler and the template-to-virtual DOM.

● Due to smooth integration, you can use this to make changes to existing apps

● To make up for any shortfall, you can plug-in any library and makeup.

● As Vue.js uses streaming-side server rendering, your users can get quick responses.

● The server-side rendering also helps in being ranked higher by search engines.

● It has a simple structure. Easy to use for any new developer

● You can go back and check and correct your errors.

● You can check all the existing states.

● Detail documentation also helps build the web page or application very quickly.

Ember.js Decoded

Ember.js is an MVVM model framework. It is open-source software. This platform is mostly used for creating complex multi-page applications. It maintains up-to-date features without discarding any of the old features.

With this framework, you have to follow the architecture of the framework strictly. The JS framework is very tightly organized. It reduces the flexibility that other frameworks might offer.

There is a very refined and developed control system for its platforms and tools. You can integrate it with the new version with the tools provided. There is strict guidance about avoiding outdated APIs.

You can understand Ember’s APIs easily. They are also easy to work. You can make use of highly complex functionalities simply and straightforwardly.

The performance is better as similar jobs are processed together. It creates batches of similar bindings and DOM updates to improve the performance. It means that the browser needs to process them in one go. It will avoid recomputing for each task, wasting a lot of time.

You can write the codes in a simple manner and modules. You can use any of Ember’s APIs. It is possible due to the presence of Promises everywhere.

Ember comes with a well-written guide. The API is recorded in a useful manner. It is a front-end framework that is loaded. Ember has a router, pipeline, services, etc. of its own.

The basis for views, controllers, models, and framework is the Ember Object Model. All components come from the same objects. The framework is firm and steady. The reason is that all elements have similar jobs and characteristics.

Ember has made the general application, organization, and structure clear so that you don’t make any mistakes. You will have no chance to complicate the application unnecessarily. If you have to go out of the defined limits, you will have to force your way out.

The language used for templating in Embers is Handlebars. This language helps Embers to keep its logic out of view. The clean syntax of Handlebars makes it easy for you to read and understand the templates. Handlebar templates are faster to load.

Another advantage you gain from Handlebar is that you don’t have to update your template every time you add or remove data from the page. It will be done automatically by the language itself.

A community that is continually improving the framework supports Ember. They are updating the framework with the latest technology. They also make sure that backward compatibility is possible.

● Ember.js is an open-source MVVM model framework suitable for complex multiple-page applications.

● It offers both the latest and old features.

● It has a very tightly structured framework which doesn’t offer much flexibility

● A very refined control system helps you to integrate with new versions without any problem.

● There is strict guidance about avoiding outdated API versions.

● Ember’s APIs help you to use complex functionalities in a simple manner

● There is no recomputing for each task as the framework allows the browser to do similar functions together.

● Promises allow you to write modular and straightforward code using any API of Ember.js.

● Ember.js is a fully loaded, front-end framework.

● The framework is stable because all components have the same functionalities and properties.

● It has well-defined limitations which will prevent your complicating your application

● Handlebars, the language used by Ember.js allows you to read and understand templates easily. It also helps to load the templates faster.

● Handlebars will ensure to update the template every time you add or remove data.

● Ember.js has an active community that updates the framework regularly and facilitates backward compatibility.

A Comparison Between Ember.js And Vue.js

This article intends to compare the features of both frameworks. Let us see how the characteristics of these frameworks compare. It will help you to make use of the right framework for your web application.

When you need a modern engine for an old application, it is Vue.js which will help you. It combines the best properties of other frameworks. Vue.js is a developing framework. A ready-to-use library of interface elements does not exist. However, many third-party libraries can help you.

Ember.js offers you a well-organized and trustworthy framework. When the development team is big, this is the framework that suits best. It allows everyone to understand the written code and contribute to a common project. The technology will be up-to-date, and the platform will be stable.

Vue.js can help you use the syntax of different kinds. It helps in writing the codes with ease. It is also an SEO friendly framework. Ember is a fully loaded front-end framework and can help you develop the applications very fast. But it is not suitable for developing small projects.

It is not easy to say this is better than that. It will depend on what kind of project you have undertaken. Both have their pluses and minuses. The below table will help in a better comparison.

Final Thoughts

It is not easy to conclude as to which is better. It all depends on the application that you want to develop. Both frameworks are developing. Both are getting updates. Both the communities are working on the frameworks.

While Vue.js is more comfortable for writing codes, Ember is a full-stack framework allowing the development of apps very fast. It is suitable for big projects. It is too complicated to be used for smaller projects.

We hope you had a great time reading this article. If you’ve any questions or suggestions related to this blog, then feel free to ask them in the comment section. Thank You.!