A beginners guide to Vuex

A beginners guide to Vuex

In this article, I’ll offer you a high-level overview of Vuex and demonstrate how to implement it into a simple app.

In single-page applications, the concept of state relates to any piece of data that can change. An example of state could be the details of a logged-in user, or data fetched from an API.

Handling state in single-page apps can be a tricky process. As an application gets larger and more complex, you start to encounter situations where a given piece of state needs to be used in multiple components, or you find yourself passing state through components that don’t need it, just to get it to where it needs to be. This is also known as “prop drilling”, and can lead to some unwieldy code.

Vuex is the official state management solution for Vue. It works by having a central store for shared state, and providing methods to allow any component in your application to access that state. In essence, Vuex ensures your views remain consistent with your application data, regardless of which function triggers a change to your application data.

A Shopping Cart Example

Let’s consider a real-world example to demonstrate the problem that Vuex solves.

When you go to a shopping site, you’ll usually have a list of products. Each product has an Add to Cart button and sometimes an Items Remaining label indicating the current stock or the maximum number of items you can order for the specified product. Each time a product is purchased, the current stock of that product is reduced. When this happens, the Items Remaining label should update with the correct figure. When the product’s stock level reaches 0, the label should read Out of Stock. In addition, the Add to Cart button should be disabled or hidden to ensure customers can’t order products that are currently not in inventory.

Now ask yourself how you’d implement this logic. It may be trickier than you think. And let me throw in a curve ball. You’ll need another function for updating stock records when new stock comes in. When the depleted product’s stock is updated, both the Items Remaining label and the Add to Cart button should be updated instantly to reflect the new state of the stock.

Depending on your programming prowess, your solution may start to look a bit like spaghetti. Now, let’s imagine your boss tells you to develop an API that allows third-party sites to sell the products directly from the warehouse. The API needs to ensure that the main shopping website remains in sync with the products’ stock levels. At this point you feel like pulling your hair out and demanding why you weren’t told to implement this earlier. You feel like all your hard work has gone to waste, as you’ll need to completely rework your code to cope with this new requirement.

This is where a state management pattern library can save you from such headaches. It will help you organize the code that handles your front-end data in a way that makes adding new requirements a breeze.

Prerequisites

Before we start, I’ll assume that you:

  • have a basic knowledge of Vue.js
  • are familiar with ES6 and ES7 language features

You’ll also need to have a recent version of Node.js that’s not older than version 6.0. At the time of writing, Node.js v10.13.0 (LTS) and npm version 6.4.1 are the most recent.

Finally, you should have the most recent version of the Vue CLI installed:

npm install -g @vue/cli 

Build a Counter Using Local State

In this section, we’re going to build a simple counter that keeps track of its state locally. Once we’re done, I’ll go over the fundamental concepts of Vuex, before looking at how to rewrite the counter app to use Vue’s official state management solution.

Getting Set Up

Let’s generate a new project using the CLI:

vue create vuex-counter 

A wizard will open up to guide you through the project creation. Select Manually select features and ensure that you choose to install Vuex.

Next, change into the new directory and in the src/components folder, rename HelloWorld.vue to Counter.vue:

cd vuex-counter
mv src/components/HelloWorld.vue src/components/Counter.vue

Finally, open up src/App.vue and replace the existing code with the following:


  
    # Vuex Counter

    
  




You can leave the styles as they are.

Creating the Counter

Let’s start off by initializing a count and outputting it to the page. We’ll also inform the user whether the count is currently even or odd. Open up src/components/Counter.vue and replace the code with the following:


  
    
Clicked {{ count }} times! Count is {{ parity }}.

  




As you can see, we have one state variable called count and a computed function called parity which returns the string even or odd depending on the whether count is an odd or even number.

To see what we’ve got so far, start the app from within the root folder by running npm run serve and navigate to http://localhost:8080.

Feel free to change the value of the counter to show that the correct output for both counter and parity is displayed. When you’re satisfied, make sure to reset it back to 0 before we proceed to the next step.

Incrementing and Decrementing

Right after the computed property in the `


Since Vuex stores are reactive, whenever the value of `$store.state.count` changes, the view will change as well. All this happens behind the scenes, making your code look simple and cleaner.

#### The `mapState` Helper

Now, suppose you have multiple states you want to display in your views. Declaring a long list of computed properties can get verbose, so Vuex provides a [mapState](https://vuex.vuejs.org/api/#mapstate) helper. This can be used to generate multiple computed properties easily. Here’s an example:

Welcome, {{ loggedInUser.name }}.

Count is {{ count }}.


Here’s an even simpler alternative where we can pass an array of strings to the `mapState` helper function:

export default {
computed: mapState([
'count', 'loggedInUser'
])
}


This version of the code and the one above it do exactly the same thing. You should note that `mapState` returns an object. If you want to use it with other computed properties, you can use the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax). Here’s how:

computed: {
...mapState([
'count', 'loggedInUser'
]),
parity: function() {
return this.count % 2 === 0 ? 'even' : 'odd'
}
}


### **Getters**

In a Vuex store, getters are the equivalent to Vue’s computed properties. They allow you to create _derived state_ that can be shared between different components. Here’s a quick example:

getters: {
depletedProducts: state => {
return state.products.filter(product => product.stock <= 0)
}
}


Results of `getter` handlers (when accessed as properties) are cached and can be called as many times as you wish. They’re also reactive to state changes. In other words, if the state it depends upon changes, the `getter` function is automatically executed and the new result is cached. Any component that has accessed a `getter` handler will get updated instantly. This is how you can access a `getter` handler from a component:

computed: {
depletedProducts() {
return this.$store.getters.depletedProducts;
}
}


#### The `mapGetters` Helper

You can simplify the `getters` code by using the `mapGetters` helper:

import { mapGetters } from 'vuex'

export default {
//..
computed: {
...mapGetters([
'depletedProducts',
'anotherGetter'
])
}
}


There’s an option for passing arguments to a `getter` handler by returning a function. This is useful if you want to perform a query within the `getter`:

getters: {
getProductById: state => id => {
return state.products.find(product => product.id === id);
}
}

store.getters.getProductById(5)


Do note that each time a `getter` handler is accessed via a method, it will always run and the result won’t be cached.

Compare:

// property notation, result cached
store.getters.depletedProducts

// method notation, result not cached
store.getters.getProductById(5)


### **Changing State with Mutations**

An important aspect of the Vuex architecture is that components never alter the state directly. Doing so can lead to odd bugs and inconsistencies in the app’s state.

Instead, the way to change state in a Vuex store is by committing a _mutation_. For those of you familiar with Redux, these are similar to _reducers_.

Here is an example of a mutation that increases a `count` variable stored in `state`:

export default new Vuex.Store({
state:{
count: 1
},
mutations: {
increment(state) {
state.count++
}
}
})


You can’t call a mutation handler directly. Instead, you trigger one by “committing a mutation” like this:

methods: {
updateCount() {
this.$store.commit('increment');
}
}


You can also pass parameters to a mutation:

// store.js
mutations: {
incrementBy(state, n) {
state.count += n;
}
}

// component
updateCount() {
this.$store.commit('incrementBy', 25);
}


In the above example, we’re passing the mutation an integer by which it should increase the count. You can also pass an object as a parameter. This way, you can include multiple fields easily without overloading your mutation handler:

// store.js
mutations: {
incrementBy(state, payload) {
state.count += payload.amount;
}
}

// component
updateCount() {
this.$store.commit('incrementBy', { amount: 25 });
}


You can also perform an _object-style commit_ that looks like this:

store.commit({
type: 'incrementBy',
amount: 25
})


The mutation handler will remain the same.

#### The `mapMutations` Helper

Similar to `mapState` and `mapGetters`, you can also use the `mapMutations` helper to reduce the boilerplate for your mutation handlers:

import { mapMutations } from 'vuex'

export default{
methods: {
...mapMutations([
'increment', // maps to this.increment()
'incrementBy' // maps to this.incrementBy(amount)
])
}
}


On a final note, mutation handlers must be synchronous. You can attempt to write an asynchronous mutation function, but you’ll come to find out later down the road that it causes unnecessary complications. Let’s move on to actions.

### **Actions**

Actions are functions that don’t change the state themselves. Instead, they commit mutations after performing some logic (which is often asynchronous). Here’s a simple example of an action:

//..
actions: {
increment(context) {
context.commit('increment');
}
}


Action handlers receive a `context` object as their first argument, which gives us access to store properties and methods. For example:

*   `context.commit`: commit a mutation
*   `context.state`: access state
*   `context.getters`: access getters

You can also use _argument destructing_ to extract the store attributes you need for your code. For example:

actions: {
increment({ commit }) {
commit('increment');
}
}


As mentioned above, actions can be asynchronous. Here’s an example:

actions: {
incrementAsync: async({ commit }) => {
return await setTimeout(() => { commit('increment') }, 1000);
}
}


In this example, the mutation is committed after 1,000 milliseconds.

Like mutations, action handlers aren’t called directly, but rather via a dedicated `dispatch` method on the store, like so:

actions: {
incrementAsync: async({ commit }) => {
return await setTimeout(() => { commit('increment') }, 1000);
}
}


You can dispatch an action in a component like this:


this.$store.dispatch('increment')



#### The `mapActions` Helper

Alternatively, you can use the `mapActions` helper to assign action handlers to local methods:

actions: {
incrementAsync: async({ commit }) => {
return await setTimeout(() => { commit('increment') }, 1000);
}
}


## Re-build Counter App Using Vuex

Now that we’ve had a look at the core concepts of Vuex, it’s time to implement what we’ve learned and rewrite our counter to make use of Vue’s official state management solution.

If you fancy a challenge, you might like to have a go at doing this yourself before reading on …

When we generated our project using `Vue CLI`, we selected `Vuex` as one of the features. A couple of things happened:

1.  `Vuex` was installed as a package dependency. Check your `package.json` to confirm this.
2.  A `store.js` file was created and injected into your Vue.js application via `main.js`.

To convert our “local state” counter app to a Vuex application, open `src/store.js` and update the code as follows:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
state: {
count: 0
},
getters: {
parity: state => state.count % 2 === 0 ? 'even' : 'odd'
},
mutations: {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
},
actions: {
increment: ({ commit }) => commit('increment'),
decrement: ({ commit }) => commit('decrement'),
incrementIfOdd: ({ commit, getters }) => getters.parity === 'odd' ? commit('increment') : false,
incrementAsync: ({ commit }) => {
setTimeout(() => { commit('increment') }, 1000);
}
}
});


Here we can see how a complete Vuex store is structured in practice. Please go back over the theory part of this article if anything here is unclear to you.

Next, update the `src/components/Counter.vue` component by replacing the existing code within the `` block. We’ll switch the local state and functions to the newly created ones in the Vuex store:

import { mapState mapGetters, mapActions } from 'vuex'

export default {
name: 'Counter',
computed: {
...mapState([
'count'
]),
...mapGetters([
'parity'
])
},
methods: mapActions([
'increment',
'decrement',
'incrementIfOdd',
'incrementAsync'
])
}


The template code should remain the same, as we’re sticking to the previous variable and function names. See how much cleaner the code now is.

If you don’t want to use the state and getter map helpers, you can access the store data directly from your template like this:

Clicked {{ $store.state.count }} times! Count is {{ $store.getters.parity }}.


After you’ve saved your changes, make sure to test your application. From an end-user perspective, the counter application should function exactly the same as before. The only difference is that the counter is now operating from a Vuex store.

[https://codepen.io](https://codepen.io/SitePoint/pen/ZmaMKO)

## Conclusion

In this article, we’ve looked at what Vuex is, what problem it solves, how to install it, as well as its core concepts. We then applied these concepts to refactor our counter app to work with Vuex. Hopefully this introduction will serve you well in implementing Vuex in your own projects.

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.!