前置き
ログイン情報の保持や
APIのデータ保存など
とにかく便利なVuex🌟
さぁ、やってみよう!💪
と思っても1から理解するのは大変ですよね?
「忙しいのに
また新しいことやるのか…😔💦」
そんな方へ向けて超簡単に
最低限ここさえ分かればOK!
な部分をまとめました。
導入の仕方や
ディレクトリ 構成は
基礎編でどうぞ!
メリット
どこからでもアクセスできること
これが最大のメリットです👍
複数のコンポーネントで
同じデータを保有したい場合、
propsや$emitでもできますが
ネスト(階層, 入れ子)が深いと
受け渡しの関係が分かりにくく
複雑になってしまいます🌪
それを1箇所にまとめてくれるのがVuex🌟
コードもシンプルで分かりやすくなります!
状態管理パターン
データの状態管理の仕方です。
4つあり、一方通行(単一フロー)で操作します。
actionsとmutationsが
methodsのような役割をしています。
- state
data保管庫 - getters
stateの情報を取得
別gettersの呼び出しも可能 - actions
storeの上書き以外の処理や非同期通信
別actionsの呼び出しも可能 - mutations
stateの上書き(代入)
例
buttonクリックでcounterの数字を1増やしたい
- state: counter
- getters: counterを取得
- actions: なし
- mutations: state.counter++
これをpagesで呼び出していきます🌟
基本の呼び出し方
- state: 直接呼び出すことはない
- getters: (return) this.$store.getters['{関数名}']
- actions: this.$store.dispatch('{関数名}')
- mutations: this.$store.commit('{関数名}')
関数名の部分はディレクトリ に応じて
書き方が変わります。
- this.$store.getters['hoge']
store/index.jsのgetters hogeを指定 - this.$store.getters['sample/hoge']
store/sample/index.jsのgetters hogeを指定
state
) file
1 2 3 |
export const state = () => ({ hoge: [], }) |
) pages
一応直接呼び出しもできます。
1 2 3 4 5 6 7 8 9 10 |
<template> <div class="page"> <p>{{ $store.state.hoge }}</p> </div> </template> <script> export default { } </script> |
が、gettersを通して呼びましょう。
それぞれ役割が決まっているためです。
アーキテクチャやMVVMを見てみると
良いかもしれません👀
getters
gettersの時だけ関数名を[ ]で囲みます!
) file
1 2 3 4 5 |
export const getters = { hoge: state => { return state.hoge }, } |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<template> <div class="page"> <p>{{ hoge }}</p> </div> </template> <script> export default { computed: { hoge () { return this.$store.getters['hoge'] } }, } </script> |
actions
非同期通信やAPI通信など。
stateの上書きはmutationsに任せるので
mutationsの呼び出し(commit)をします。
サンプルコードは特にactionsを通さず
mutationsで事足りるのですが
あえて分かりやすく書くとこうなります。
) file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
export const state = () => ({ counter: 1, }) export const getters = { counter (state) { return state.counter }, } export const actions = { countAction ({ commit }) { commit('countUp') } } export const mutations = { countUp (state) { state.counter++ }, } |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<template> <div class="page"> <button type="button" @click="count" > {{ counter }} </button> </div> </template> <script> export default { computed: { counter () { return this.$store.getters['counter'] }, }, methods: { count () { return this.$store.dispatch('countAction') }, }, } </script> |
mutations
) file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
export const state = () => ({ counter: 1, }) export const getters = { counter (state) { return state.counter }, } export const mutations = { countUp (state) { state.counter++ }, } |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<template> <div class="page"> <button type="button" @click="count" > {{ counter }} </button> </div> </template> <script> export default { computed: { counter () { return this.$store.getters['counter'] }, }, methods: { count () { return this.$store.commit('countUp') }, }, } </script> |
map系
値がたくさんあって楽をしたい時に使います!
ただあまり使うことはありません。
基本的に書き方が少し変わるだけで
やっていること自体に変化はありません。
) file
1 2 3 4 5 6 7 8 9 |
export const state = () => ({ hoge: 'mapGetters' }) export const getters = { hoge (state) { return state.hoge }, } |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<template> <div class="page"> {{ hoge }} </div> </template> <script> import { mapGetters } from 'vuex' export default { computed: { ...mapGetters(['hoge']) }, } </script> |