Vuex & Data: Keeping it clean
Introduction #
Vuex is a state management library, centralized storage of data for your whole application. It’s well documented, beautiful, and easy to use with Vue. The part I want to talk about today is the data portion.
I have increasingly seen cases where the data state of Vuex gets transformed and represents something more than just plain-old data ; that’s a problem in the long run.
The Problem #
A simple example…
Step 1 #
An external API request is sent out through an action to get a list of books.
Step 2 #
That book data is then sent to the mutation handler where the developer would map the data to a model class: const bookCollection = books.map(book => new Book(book));
.
Step 3 #
This transformed data gets committed to the state afterwards with state.books = bookCollection;
.
All-Together #
At first, this seems convenient to the developer, because in any part of their code, they can utilize their models such as: const authorsNotOnSale = state.books.filter(book => !book.isOnSale()).map(book => book.getAuthor())
.
But, what happens when you want to serialize that data to JSON? Store it somewhere else outside of Vuex? Such as using a library like vuex-persist
?
You’ll immediately loose all those nice model functions you’ve built out and you can not easily restore the state because its more than just data at this point.
The Solution #
The proper solution would be to utilize Vuex getters to transform that data into something more usable in your application.
const bookCollection = state => state.books.map(book => new Book(book));
Keep the data clean, lean, and plain. Think of the data this way: can I serialize this? If the answer is no, you may need to dig into why.