【Vue.js】Vuexまとめ

はじめに

Vuexについて学んだことをまとめています。随時更新(4/8更新)していきます。

Vue.jsの基本と教材まとめ

Vuexとは

データとその状態に関するすべてを一元管理する「状態管理」のための拡張ライブラリ。

コンポーネントが構造化した際に、コードの構造と保守性をアップできる。

具体的には、深くネスト(親子関係を持つ)されたコンポーネントの構造でデータを共有するのに、propsと$emitを繰り返すことを防ぐ。

Vuexは状態を管理するためにstoreと呼ばれるアプリケーションのデータの状態を保持するコンテナを作成する。

前提知識~コンポーネント間のデータの受け渡し~

✅props

propsは親コンポーネントから子コンポーネントにデータを渡すときに使う。

親が定義した属性を、子コンポーネントのpropsで指定して受け取る。

その際に、v-bindなどのテータバインディングを用いて、リアクティブなデータを渡すことが可能。

この属性で渡し、propsで受け取るというデータフローをprops downと呼ぶ。

✅$emit

$emitは子コンポーネントの状態に応じて、親コンポーネントに何かアクションを起こさせたり、データを渡したい際にカスタムイベントと一緒に使用。

カスタムイベントはv-on:clickのようなフックをするためのイベントタイプをじさくできるもの。

$emitはコンポーネントに紐づいているイベントを明示的に発火させるメソッド。

この$emitで渡しonで受け取るというデータフローをevent upと呼ぶ。

storeの4つの機能

storeには「state」、「getters(コンポーネント)」、「actions」、「mutations」の4つの機能がある。(一方通行になっている。)

state

アプリケーション全体のデータの状態を管理する。コンポーネントでいうdata的役割を担う。

getters

stateを取得するための算出データ。Vueのcomputedと同様の働きをする。

算出プロパティと違い引数を渡せるが、セッター機能はない。

actions

データの加工や非同期処理を行い、mutationへコミットする。mutationsの呼び出しに加え、API通信を含めることができる。

this.$store.dispatch('アクション名')actionsを実行できる。任意で第二引数を持たせることができる。

mutations

stateを更新できる唯一のメソッド。コンポーネントでいうmethodsと同様の働きをする。

非同期通信はactionsで行うので、mutationsは同期的でなければならない。(デバッグの観点から)

storeテンプレート

デフォルトで下記のようなテンプレートが作成される。

store/index.js

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

modulesはストアの定義を複数のファイルに分割して利用する際に用いる。小規模の場合はここをgettersに変える。

個人的にはstoreは一方通行なので、以下のように入れ替えたほうが整理しやすい。

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  actions: {
  },
  mutations: {
  }
})

Vue Components

※具体的なコードは明示できておりません。猫本公式ドキュメントを参考にしていただけますと幸いです。

Stateの取得

mapStateを利用。stateで定義されたデータの名前と同じ名前の文字列でstateの値を.vueファイルで取得できる。

オブジェクトスプレッド演算子(...)を用いることで、computedのローカルのオブジェクトと一緒に定義できる。

Actionsの呼び出し

基本的に.vueファイルのmethodsオプション内でActionsをDispatch(呼ぶ)形になる。

以下、理解を深めるために前述の自作資料に追記してみました。(難しい)

localStorageの利用

※かなりざっくりです。個人的には別端末でブラウザ見ても同じ表示になるようにfirebaseやContentfulを使ったほうがいい気がします※

localStorageを用いることで、ブラウザにデータを保存して同じ状態を保つことができる。データは永続的に有効。

(ストアの状態はリロードされると初期化されてしまう。)

以下でlocalStorageに保存したリストを取得。キーと値のセット(JSON形式の文字列型)でデータを扱う。

const savedLists = localStorage.getItem('設定したキー')

保存する

localStorage.setItem('設定するキー', 文字列型のデータ)

所感

少しずつ理解できてきましたが、できればVuexは使わずにポートフォリオを作りたいなと思ってしまいました。(小規模だと逆に複雑に。)

色々と記事を読んでいると実際Vuexを使うかどうかは判断が難しい部分があるみたいですね。

参考

基礎から学ぶ Vue.js

【Vue.js】propsを使う時は命名に注意。サンプルコード有

【Vue.js】【図解】emit、propsを使ったコンポーネント間のデータのやり取り

vuexをまだ理解していない全人類に捧ぐvuexを利用したコードの図解

【Techpit】Vue.js/Vuexを使ってTrello風アプリを作成しよう!

特にTechpitの教材はがっつりVuexを使うので個人的におすすめです。

備忘録

💻【Techpit】Vue.js/Vuexを使ってTrello風アプリを作成しよう!

※5/31追記:上記教材の備忘録を追記しておきます。

main.js

Appコンポーネント、Vuexストア(store/index.js)をインポートしてマウント。

App.js

ボードコンポーネントをインポート。※記述はかなりシンプル。これBoard.vueで代替してもいい気がする。

Board.vue

ListとListAddコンポーネント、Vue.Draggableライブラリ、Vuexからmapstateでデータをインポートしてpropsで子コンポーネントに受け渡し。リスト、カード移動のメソッドをディスパッチ。

List.vue

CardとCardAddコンポーネント、Vue.Draggableライブラリをインポート。

ListAdd.vue

リスト追加をディスパッチ。

Card.vue

カード削除をディスパッチ(発信)。

CardAdd.vue

カード追加をディスパッチ。

コメントを残す