Vuex Store -- state, mutation を作成して store の外、 App.vue で呼び出す
why
仕事で store をたくさん使うから。Module export 訳がわからないよ!
CDN と npm インストール
https://unpkg.com/vuex@2.0.0
これを CDN のように利用するか
npm install vuex --save
npm でインストール
こうやって使用を宣言する。
vue cli でプロジェクト作成
React の Create React App 。基本的にこれを使ってプロジェクトを生成する。
数分かかる。なかなか重い。
vue create vuex Vue CLI v4.5.13 ✨ Creating project in /Users/kaede/code/vuex. ⚙️ Installing CLI plugins. This might take a while... ⸨ ░░░░░░░░░⸩ ⠧ reify:@vue/cli-plugin-babel: timing reify:lo added 49 packages in 12s ⚓ Running completion hooks... 📄 Generating README.md... 🎉 Successfully created project vuex.
これで生成されて走るようになった。
Terminal で vuex を入れる
npm i vuex
これはデフォでは入ってないから入れる必要がある
これで環境ができた
main.js に store/index の読み込みを書いて、store で state と commit を使う。
main.js のデフォルトを見てみる
import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false new Vue({ render: h => h(App), }).$mount('#app')
vue cli で作るとこうなっている
main.js で Vuex を import して use する
import Vuex from 'vuex' Vue.use(Vuex)
入れた npm の modules から、 vuex を呼んで、使う宣言をする
main.js で store を読み込んでマウントライフサイクルに組み込む
import store from './store' new Vue({ render: h => h(App), store, }).$mount('#app')
store の定義を別の store ファイルから export されたものを import するようにして
html div id app をマウントしているところに import されている store を追加する
store の参照元の定義を作成する
~/store/index.js を作成する
ここも vue ファイルではなく、js ファイルで書く
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex);
vue と vuex 使う宣言はここでも必要。
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++ } } }) export default store
Store は S が大文字なので注意!これがないと default.constructor がないエラーになる
Vuex store と state の定義
state に関数を加算する関数の定義を作成して
export する。最後のが一番大事。 store は作っただけではどこからでも使えることにはらない。
これによって、main 及び、main が呼び出している App でも
import すれば、この store の state 及び mutation にアクセスできるようになった。
store.commit('increment') console.log(store.state.count) // -> 1
とりあえず このストアファイル store/index.js 内で使用してみる。
ちなみに store を定義するだけで一切呼び出さないと、それはそれでエラーになる
すると App で使用されて、1 が帰ってくる
store.commit('increment') を削ると、加算されないので 0 が帰ってくる。
これで store では使えていることがわかった。
次はこれを外部コンポーネントである App.vue で呼び出してみる。
App で store の値を呼び出したり変更する。
App の computed から store の state count を呼び出す
state は計算が反映されるように computed に定義する必要があるようだ。
App で呼び出してみる。
import は App をマウント?している main.js で行われているので不要。
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> {{ count }} </div> </template> <script> export default { name: 'App', components: { }, computed: { count() { return this.$store.state.count } } } </script>
これで、store state の count の 1 が画面に描画された!
App の mounted() で html 作成後に store の mutation を commit で呼び出す
export default { name: 'App', components: { }, mounted() { this.$store.commit('increment') }, computed: { count() { return this.$store.state.count } } }
mounted() を追加し、html のレンダリング時に store の加算メソッドを呼び出す
この場合は store が変化した時点で computed が再レンダリングされるか
mounted のあとが computed なのか、mount の順序は見直す必要があるが、
とりあえず、App の中で this.$store.commit は使用できた。