Vuexを初めから丁寧に(1)~Vuexを理解するために必須の前提知識~

## はじめに

### この記事を読むと

- Vuexを理解するために必要な知識を習得できます
- Vuexを学ぶためのマイルストーンが明確となります

### 想定読者

- Vue.js や Nuxt.js の初級〜中級者
- Vuex を何となく雰囲気で使っている

### 前提知識

JavaScript 及び Vue についての基本知識があることは前提とします。
(Vue の基本知識がない方は[Vue.js&Nuxt.js超入門](https://amzn.to/2KJYMKc)が入門書として最も最適です。)

またJavaScriptにおいては特に、オブジェクトの使い方にも慣れておくとスムーズでしょう。
([初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発](https://amzn.to/37zx0cw)
の第9章が最も良い説明だと思います。）

## Vuex の理解が難しい原因

なぜ Vuex が難しいと感じるのでしょうか？
私の場合は**専門用語の意味が省略されている**ことに起因していました。
さらに問題なのは、 「Vuexを理解するためのキーとなる用語」が、**全く違う意味で使われているにも関わらず見た目は一般的な日本語と一緒**なのでなんとなくわかった気になり、「何が分からないのか分からない」状況に陥ることです。
例えば Vuex における**「状態」**は
**「アプリケーションが保持するデータ」**
のことを指します。
なので、「Vuex は状態管理ライブラリである」「Vuex は状態を管理するために単方向データフローを採用している」といった説明や図解※を見ても、肝心の「状態」が分からないので、文章の意味が消化できないまま頭を素通りしていくだけでした。

しかし逆に言うと、用語の意味さえ押さえておけば Vuex はスラスラ理解できます。


※Vuexデータフローの図解
![Vuex図解(Vuex公式ドキュメントより)](https://vuex.vuejs.org/vuex.png)


## Vuex を理解するためのツボ

さて、前置きが長くなりましたが本題です。
たった 4 つだけです。

- **用語を正確に理解する**

  - 「状態」
  - 「データフロー」

- **「データフローの設計」と「状態管理」の意義を理解する**

  - 信頼できる唯一の情報源(Single Source of Truth)
  - 単方向フロー(one-way data flow)
  - 情報と取得のカプセル化(Encapsulation of sorce and receiving)

- **Vuex の構成要素の役割と使い方を理解する**

  - State
  - Getters
  - Mutations
  - Actions

- ※「ストアのモジュール分割」は一旦省略します

## Vuex に入る前に

いきなり Vuex に入るより、まず状態管理やデータフローの基本知識を押さえておくと、スムーズに理解が進みます。

### 「状態」とは

状態とは
**「アプリケーションが保持するデータ」**
のことです。
ユーザーの操作やイベントの発生などによってその値が更新されていきます。

例えば、EC サイトのショッピングカートです。カートは何も入っていない空の状態から始まり、ユーザーが商品をカートに入れる操作を行うことでカートは空の状態に戻り、購入処理が完了します。

規模が大きいアプリケーションは保持する状態の数、それぞれの組み合わせの数も多くなり、そのままでは扱いきれなくなります。

繰り返しになりますが、Vuex において「状態」は普段の日本語とは異なる特別な意味がある言葉なので注意してください。

### データフローとは

「データフロー」とは
**「状態を含む、アプリケーションが持つデータの流れ」**
のことを指します。
具体的には、どこにデータを保持し、データを読み込む時や更新するときはどこからどのように行うのかという点を表すことが多いです。


データフローの設計において、以下の三つのプラクティスが重要です。

### 信頼できる唯一の情報源

**「信頼できる唯一の情報源」(single source)とは、「管理する対象のデータを一箇所に集約することで管理を容易にすることを目的とする設計のパターン」**です。

- どのコンポーネントも同一のデータを参照するため、データや表示の不整合が発生しづらい
- 複数のデータを組み合わせた処理を比較できる容易に実装できる
- データの変更のログ出力、現在のデータの確認などの開発に便利なツールを作りやすい

### 「状態の取得・更新」のカプセル化

**「状態の取得・更新」のカプセル化を行うことで、状態管理のコストを下げることができます。**
例えばカウンターアプリの例では更新処理を store 内に記述することでカプセル化しており、コンポーネント側からは具体的にどのような実装がされているかは隠されています。

- 状態の取得・更新のロジックを様々な場所から利用できる
- 詳細な実装をビューから隠すことで、データ構造や取得、更新処理の変更の影響範囲を小さくする
- デバッグ時に確認する場所が限られるため、デバッグが容易になる

### 単方向データフロー

**単方向データフローにすることで、状態の取得、更新のコードが簡潔になります。**
データが単方向でないと、データの取得と更新の両方を同時にできてしまい、より複雑な処理になり理解が難しくなってしまいます。

- データを取得しつつ更新するといったようなことができなくなり、実装やデバッグが単純になる
- データを取得、更新するために何をするかの選択肢が絞られて、理解が容易なコードをかきやすい

### まとめ
ここまでデータフローの三つのプラクティスを見てきましたが、実はVuex は先ほど紹介したデータフローのプラクティスを全て満たします。

まず、Vuex はアプリケーションの状態やそれに付随するロジックが一つの場所(ストア)にまとまるように設計されているため、「信頼できる唯一の情報源」を満たします。

また、Vuex において状態の更新はミューテーションでのみ行うことができ、取得に関してもゲッターという機能で詳細な実装は隠蔽できるため「状態の取得と更新」のカプセル化も満たします。

さらに、状態の取得と更新の窓口が異なるため(冒頭の図解をもう一度参照ください)、強制的に実装が単方向データフローになります。

## おわりに
いかがだったでしょうか。VueやNuxtで開発を行う方が、Vuexを理解するための助けになれば幸いです。
「状態管理」「データフロー」についてはバッチリですか？
次の記事ではいよいよ Vuex による状態管理について見ていきます。

### 参考

[初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発](https://amzn.to/37zx0cw)
[Web制作者のためのCSS設計の教科書 モダンWeb開発に欠かせない「修正しやすいCSS」の設計手法](https://amzn.to/37BMKMf)

[Vue.js&Nuxt.js超入門](https://amzn.to/2KJYMKc)
[Vue.js入門 基礎から実践アプリケーション開発まで](Vue.js入門 基礎から実践アプリケーション開発まで)
[21Stepで体得 Vue.jsハンズオン](https://amzn.to/2WIRvxa)

[Hello!! Nuxt.js Hello!!Vue&Nuxtシリーズ](https://amzn.to/2J8yKjB)
[Nuxt.jsビギナーズガイド](https://amzn.to/3nGBmUE)

[Nuxt.jsとFirebaseを使って爆速で何か作る前に読む本](https://amzn.to/2WANomN)
[実践Firestore](https://amzn.to/2WBapWy)


<a href="https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEJavaScript-%E7%AC%AC3%E7%89%88-%E2%80%95ES2015%E4%BB%A5%E9%99%8D%E3%81%AE%E6%9C%80%E6%96%B0%E3%82%A6%E3%82%A7%E3%83%96%E9%96%8B%E7%99%BA-Ethan-Brown/dp/4873117836/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3ADSMCHME492V&dchild=1&keywords=javascript&qid=1608531406&sprefix=JavaSc,aps,-1&sr=8-18&linkCode=li2&tag=fden02-22&linkId=3d8c76b4e9298af7c7b1c0b55b2f0f28&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873117836&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4873117836" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AECSS%E8%A8%AD%E8%A8%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%A2%E3%83%80%E3%83%B3Web%E9%96%8B%E7%99%BA%E3%81%AB%E6%AC%A0%E3%81%8B%E3%81%9B%E3%81%AA%E3%81%84%E3%80%8C%E4%BF%AE%E6%AD%A3%E3%81%97%E3%82%84%E3%81%99%E3%81%84CSS%E3%80%8D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%89%8B%E6%B3%95-%E8%B0%B7-%E6%8B%93%E6%A8%B9/dp/4844336355/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=CSS%E8%A8%AD%E8%A8%88&qid=1608531524&sr=8-2&linkCode=li2&tag=fden02-22&linkId=b6383073cc173e5bb0433a0113ff9ffd&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4844336355&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=4844336355" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a href="https://www.amazon.co.jp/Vue-js-Nuxt-js%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83-ebook/dp/B07X6F1C2P/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Nuxt.js&qid=1608531192&sr=8-1&linkCode=li2&tag=fden02-22&linkId=25b32e077f19a0cec1d74fcd5fb94488&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B07X6F1C2P&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B07X6F1C2P" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/Vue-js%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7-%E5%B7%9D%E5%8F%A3-%E5%92%8C%E4%B9%9F-ebook/dp/B07J6FP6NQ/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Nuxt.js&qid=1608531192&sr=8-9&linkCode=li2&tag=fden02-22&linkId=5f606aef8f9a7081578d1f09589ecdce&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B07J6FP6NQ&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B07J6FP6NQ" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/gp/product/B08Q7STWXH/ref=as_li_ss_il?&linkCode=li2&tag=fden02-22&linkId=798d74ef02f517ee46cac2d3b556e0d0&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08Q7STWXH&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B08Q7STWXH" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

<a href="https://www.amazon.co.jp/Hello-Nuxt-js-%E3%80%88Vue-Nuxt%E3%80%89-%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-ebook/dp/B07GJM9ZRR/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Nuxt.js&qid=1608531192&sr=8-6&linkCode=li2&tag=fden02-22&linkId=732e71b00b6fa86441cc3231c8a12e6c&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B07GJM9ZRR&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B07GJM9ZRR" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/Nuxt-js%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89-%E8%8A%B1%E8%B0%B7%E6%8B%93%E7%A3%A8-ebook/dp/B07J5434JB/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Nuxt.js&qid=1608531192&sr=8-2&linkCode=li2&tag=fden02-22&linkId=30654d8f8973963fc018be61f74bd48e&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B07J5434JB&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B07J5434JB" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


<a href="https://www.amazon.co.jp/Nuxt-js%E3%81%A8Firebase%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%88%86%E9%80%9F%E3%81%A7%E4%BD%95%E3%81%8B%E4%BD%9C%E3%82%8B%E5%89%8D%E3%81%AB%E8%AA%AD%E3%82%80%E6%9C%AC-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E7%A6%8F%E7%94%B0-%E9%9B%84%E8%B2%B4-ebook/dp/B08NSZJZ4Q/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Nuxt.js&qid=1608531192&sr=8-3&linkCode=li2&tag=fden02-22&linkId=a15e8b9e7fad88e36da40b20e477ce4d&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08NSZJZ4Q&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B08NSZJZ4Q" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><a href="https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Firestore-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E7%A6%8F%E7%94%B0-%E9%9B%84%E8%B2%B4-ebook/dp/B0851BGDQG/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=firestore&qid=1608531492&sr=8-1&linkCode=li2&tag=fden02-22&linkId=2cfb673bf419462c1061db81f795cb65&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0851BGDQG&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fden02-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=fden02-22&language=ja_JP&l=li2&o=9&a=B0851BGDQG" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[Nuxt.js - Vue.js on Steroids](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fnuxtjs-vuejs-on-steroids%2F)【Udemy】

[超Vue.js 2 完全パック - もう他の教材は買わなくてOK！ (Vue Router, Vuex含む)](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fvue-js-complete-guide%2F)【Udemy】

[Nuxt JS入門決定版！Vue.jsのフレームワークNuxt JSの基本からFirebaseと連携したSPAの開発まで](https://px.a8.net/svt/ejp?a8mat=3BK8OP+16V8C2+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fnuxtjs-the-complete-guide%2F)【Udemy】