A Vue application is a tree of components. Each component has 0 or 1 parents and 0 or more children.
In Vue, you usually send information from one component to another in a straight line, up or down.
You use props to pass data down the component tree, and events to pass it back up.
This isn't so great if you've got a really big tree. Passing hundreds of notes back and forth gets to be a real pain.
Another option is to put all your data in JavaScript singletons, like a bunch of cardboard boxes that your application can pass around to whoever needs it.
This isn't a bad solution, necessarily, but what if it could be better?
Vuex is like a train where each car has the same shape.
The first train car, the locomotive, has all the data your components need to share. Whenever you want to change that data, you commit an action or a mutation. This is like adding another car to the train. It has the same shape as the locomotive, just different data inside.
Why is this better than cardboard boxes? Because if something goes wrong while you're watching, you can pause the train or put it in reverse. You can inspect two cars and see what's different between them. You can debug the entire train instead of just one car.
Vuex also works really well with the Vue Devtools, an official browser extension, so you can easily watch what actions/mutations are happening and how the data is changing.
So Vuex makes it super easy to organize data, share it between components, and observe when it changes. How do you use it?
A Vuex store is a blueprint for one of those train cars. It looks like this:
Usually you would do this in a computed method, so that every time dataToShare changes, your component gets updated. This is another advantage of Vuex: it hooks into Vue's reactivity system, so when data updates, your application updates too.
Assuming the Vuex store and the global service are both local (no HTTP requests or anything), the differences are:
Vue knows about the Vuex store, so it can do change tracking on it. If something changes in the Vuex store, the Vue app can update computed properties and watchers and re-render the DOM where necessary. If something changes in a global service, Vue won't know about it.
A global service is mutable, so it's harder to track changes to it as the application runs. A Vuex store is immutable--every time you change the state, a new object is created to hold the data. This means you can find out what changed between one state and the next by comparing the objects.
Vuex stores have some extra functionality, like NPM packages and plugins that can help you organize your state or even persist it to LocalStorage automatically.
A Vue application is a tree of components. Each component has 0 or 1 parents and 0 or more children.
In Vue, you usually send information from one component to another in a straight line, up or down.
You use props to pass data down the component tree, and events to pass it back up.
This isn't so great if you've got a really big tree. Passing hundreds of notes back and forth gets to be a real pain.
Another option is to put all your data in JavaScript singletons, like a bunch of cardboard boxes that your application can pass around to whoever needs it.
This isn't a bad solution, necessarily, but what if it could be better?
Vuex is like a train where each car has the same shape.
The first train car, the locomotive, has all the data your components need to share. Whenever you want to change that data, you commit an action or a mutation. This is like adding another car to the train. It has the same shape as the locomotive, just different data inside.
Why is this better than cardboard boxes? Because if something goes wrong while you're watching, you can pause the train or put it in reverse. You can inspect two cars and see what's different between them. You can debug the entire train instead of just one car.
Vuex also works really well with the Vue Devtools, an official browser extension, so you can easily watch what actions/mutations are happening and how the data is changing.
So Vuex makes it super easy to organize data, share it between components, and observe when it changes. How do you use it?
A Vuex store is a blueprint for one of those train cars. It looks like this:
And you can register it like this:
Then in a Vue component, in any method or lifecycle hook, you can do this:
Voila! Now
dataToShare
is equal to 1. If you're debugging and need to rewind it to 0, you can do so using the Vue Devtools.To access
dataToShare
in any component, you can do this:Usually you would do this in a
computed
method, so that every timedataToShare
changes, your component gets updated. This is another advantage of Vuex: it hooks into Vue's reactivity system, so when data updates, your application updates too.That's pretty much it! Any questions?
What a great answer!!! Thank you very much!.
Sorry for my english, I try to write the best I can.
I have a question. Maybe you just answered and I don't realized.
What's the difference between a store and a global service that I can access and get data? (Is the cardboard example?)
Thanks!
Your English is excellent.
Assuming the Vuex store and the global service are both local (no HTTP requests or anything), the differences are:
Excellent answer. Very clear for me!
Thank you very very much!