Vuexに関する用語集

状態を管理してくれるらしい。状態って何。分からない。

いつも通り、アウトプットありきのインプットをしていこうと思う。

Installation | Vuex

Vuexとは

状態管理ライブラリ。データフローが単方向になるように設計されている。

大きなアプリケーション開発に使われることが多いらしい。

例えばログインの状態を全てのページで管理したい場合、このライブラリが使えるらしい。

コンポーネントで定義していた算出メソッドやルーティング等をStoreという場所に集約している。

mapGettersやgettersを使うことで、コンポーネントの受け渡しをスムーズにしてくれている。

this.$store.getters.メソッド名

Store

Vuexの根幹部分。1アプリにつき最大1つ存在する。

new Vuex.Store({⇦ここ
	state{},
	getters{},
	mutations{},
	actions{},
})

この中に大きく4つのメソッドがある。

・state ・getter(値を返す) ・mutation(stateを更新する) ・action(非同期処理や外部APIとのやりとりを行う

この4つそれぞれが働きあってコンポーネント間で値の状態管理がうまい具合に行われているとのこと。

下記のような流れで値の状態管理が行われいる。

コンポーネント⇨②アクション⇨③ミューテーション⇨④ステート⇨⑤ゲッター①に戻る

コア機能

State

アプリケーションレベルの状態が全て含まれており、"信頼できる唯一の情報源 (single source of truth)" として機能します

使い方

// let's create a Counter component
const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return store.state.count
    }
  }
}

store.state.countが変化するたびに、computedにあるpropertyがリアクティブに変化する、それに連動して、DOMが更新される。

rootディレクトリ(storeファイル)に下記コードを記述することで、子コンポーネントの変化を全てのコンポーネントに自動で反映させることができる。this.はself.と同じ感じ?

const Counter = {
  template: `<div>{{ count }}</div>`,
  computed: {
    count () {
      return this.$store.state.count
    }
  }
}

this.$storeを前につけることで、Storeにアクセスできる。

Getters

Storeに入っている算出プロパティやルーティングにアクセスできる中継地点。その名の通り、ゲッターとしての役割を持つ。

例えばこの算出プロパティを他のコンポーネントで使用したい時があるとする。

computed: {
  doneTodosCount () {
    return this.$store.state.todos.filter(todo => todo.done).length
  }
}

ここでgettersの登場。

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

他のコンポーネントは、computedの中にthis.$store.getters.doneTodosを書き込むだけで、doneTodesを使用することができる。

mapGetters

...mapGettersを使うことで、$store.gettersを省略することができる。

this.$store.getters.getter1 //通常
this.getter1 //mapGetters使用

実際の使い方。

import { mapGetters } from 'vuex'

export default {
  // ...
  computed: {
    // ゲッターを、スプレッド演算子(object spread operator)を使って computed に組み込む
    ...mapGetters([
      'doneTodosCount',
			#本来はthis.$store.getters.doneTodosCountと書く必要がある。
      'anotherGetter',
      // ...
    ])
  }
}

Mutations

特徴

  • 同期処理である必要がある。
  • stateを変更することができる。
  • 直接呼び出すことができないので、store.commitにミューテーション名や引数(ペイロードと呼びます)を与えて呼び出すことでstateを更新することができる。
const store = new Vuex.Store({
  state: {
    count: 10
  },
  mutations: {
    increment (state) {
      // 状態を変更する
      state.count++
    }
  }
})
console.log(store.state.count)//→10
store.commit('increment')//incrementミューテーションを呼び出す
console.log(store.state.count)//→11

store.commitの第二引数に値を与えると渡される。(この値をペイロードと呼ぶ)

mutations:{
    increment(state,payload){
        state.count = state.count + payload.amount
     }
}
console.log(store.state.count)//→10
store.commit('increment',{amount:5})//
console.log(store.state.count)// →15

Actions

下記の特徴を持ちます。

  • アクションは、状態を変更するのではなく、ミューテーションをコミットします。
  • アクションは任意の非同期処理を含むことができます。
  • 非同期処理や外部APIとの通信を行い、最終的にミューテーションを呼び出すために使う
//アクションを定義
actions:{
    incrementAction(ctx){
//incrementミューテーションを実行する
        ctx.commit('increment')
     }
 }

ミューテーションと同様に直接呼び出すことはできない。

だから、store.dispatchにアクション名を与えて呼び出す。

#初期の値
console.log(store.state.count)// -> 10
#直接アクセスすることができないので、dispatchを使用する。
store.dispatch('incrementAction')//incrementActionを呼び出す
#もう一度呼び出してみる。
console.log(store.state.count)// ->11

Redux,Flux

Flux(フラックス)はFacebook社が提唱している、クライアントサイドのWebアプリケーション開発のためのアプリケーション・アーキテクチャ(設計思想)です。 単方向のデータフローを構築できることが最大の特徴で、開発の規模が大きくなってもデータの流れを見失いづらいことが大きなメリットです。

ReduxはReactの状態管理ライブラリ。

もともとVuexはfacebook社が開発したFluxという技術からインスパイアされている。

まとめ

  • Vuexは状態管理ライブラリ。データフローが単方向になるように設計されている。
  • Storeという大きな箱の中に4つのプロパティを保管している。
  • Stateでアプリの状態を管理している。
  • GettersはStoreに入っている算出プロパティやルーティングにアクセスできる中継地点。
  • ...mapGettersを使うことで、$store.gettersを省略することができる。
  • Mutationsで値を更新することができる。
  • Actionsで外部APIを叩くことができる。

ステート | Vuex

ゲッター | Vuex

アクション | Vuex

ミューテーション | Vuex

Vuexをわかりやすく知りたい|あきな@旅、本、プログラミング。|note