====== 14.vue.jsのvuexで入力フォーム ======
Vue.jsでは、『困難は分割せよ』という名言に従い、webページをコンポーネントという部品に分けて記載することにより、見通しのよいプログラミングを行っています。しかし、各コンポーネントで共通のデータをやり取りしたい場合は、データのバケツリレーのようになってしまい大混乱となります。そのため、データは、storeストアという一カ所に集めて、各コンポーネント←→ストアで、データのやり取りをする仕組みを提供するのがVuexというものです。
似たようなものに、ReactというjavascriptフレームワークのReduxがありますが、筆者には難しすぎて挫折しました。また、Angular(Ionic)というjavascriptフレームワークのproviderというものがありますが、こちらは、ソースコードを見るだけでなんとなく分かった気にはなれます。
当初、[[https://luftgarden.work/tut-nuxt-dog-part1/|Nuxt.js で簡単な画像一覧アプリを作成する]]を写経して、画像一覧アプリを作成しようとしたのですが、vuexの部分がよく分からず、しかも実際に動くアプリを作成することができませんでした。Vue.jsアプリを作成していく上で、vuexは避けて通れない難関だと認識しました。そのため、非常に簡単なサンプルコードの写経から、順番にやってみたいと思います。
また、Vuexを理解するために、以下の3つの本を繰り返し読み、出来る限り写経しました。
===== 初めてのVuex目次 =====
[[14.vue.jsのvuexで入力フォーム:index.html|14.vue.jsのvuexで入力フォーム]]
[[15.vue.jsのvuexでカウンター:index.html|15.Vue.jsのvuexでカウンター]]
[[16.vue.jsのvuexでパスワード制限:index.html|16.vue.jsのvuexでパスワード制限]]
[[17.nuxt.jsのvuexでパスワード制限:index.html|17.Nuxt.jsのvuexでパスワード制限]]
[[18.nuxt.jsとbulmaでハンバーガーメニュー:index.html|18.Nuxt.jsとBulmaでハンバーガーメニュー]]
[[19.nuxt.jsで画像一覧アプリ:index.html|19.Nuxt.jsで画像一覧アプリ]]
===== すること =====
-vuexを用いて入力フォームを作成する
今回は、https://qiita.com/Takoyaki9/items/b6638fa1aec41464fdd1を写経させていてだきました。上記サイトにも、[[https://amzn.to/2sE8zW4|基礎から学ぶ Vue.js]]
という本が元ネタですと記載してありますが、この本はVue.js初めての方に(javascriptフレームワーク初めての方にも)非常にお勧めです。
ソースコード
https://codesandbox.io/s/0409x6y00l
Demo
https://0409x6y00l.codesandbox.io/
===== 開発環境 =====
Chrome
Codesandbox
Vue 2.5.2
Vuetify 1.4.2
Vuex 3.1.0
===== CodeSandboxで新規Vue.jsアプリを作成 =====
最初に、CodeSandbox上で、新規Vue.jsアプリを作成し、CSSフレームワークVuetifyが利用できるように設定します。
-https://codesandbox.io/へ行き、画面右上の、『Create Sandbox』をクリック
-Vue をクリック
-Add Dependencyから、Vuetifyをインストール
-index.htmlの編集
-src/main.jsの編集
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-123704.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-123723.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-123749.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-123804.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-123835.png}}
index.htmlと、src/main.jsは、以下をコピペします。
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-124228.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-124252.png}}
以上で、Vue.jsで、Vuetifyを利用する準備ができました。
===== Vuetifyのテンプレートを適用 =====
src/App.vueに、以下のコードをコピペします。
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-124906.png}}
これで、App.vueの土台が出来上がりました。
===== Vue.jsにVuexをインストール =====
Vuexを利用するための準備を行います。
-Add Dependencyから、Vuexをインストール
-Add Dependencyから、babel-polyfillをインストール
-src/main.jsの編集
-src/store.jsの新規作成
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-141702.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-141741.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-141941.png}}
src/main.jsは、以下の2行を追加します。(追加する位置には注意する必要があります。)
import store from './store'
store,
(変更前)
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-142758.png}}
(変更後)
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-142928.png}}
この時点では、store.jsを作成していないので、エラーが出ます。
*src/store.jsのテンプレートの作成
src/store.jsを新規作成し、以下をコピペします。
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
const store = new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {}
});
export default store;
これでも、まだエラーが出ています。。。
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-143709.png}}
===== src/store.jsの編集 =====
今回の、フォーム入力に関する状態管理のコードを記載します。https://qiita.com/Takoyaki9/items/b6638fa1aec41464fdd1#storejsをコピペします。
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-144151.png}}
気づいたら、なぜか、エラーが消えていました。
===== src/components/EditForm.vueの作成 =====
文字入力を行うコンポーネントとして、src/components/EditForm.vueを新規作成して、https://qiita.com/Takoyaki9/items/b6638fa1aec41464fdd1#editformvueのコードを写経します。
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-144937.png}}
===== src/App.vueの編集 =====
EditForm.vue で文字を入力 → store.js に入力した文字を保持 → App.vueで文字を表示
といった感じにしたいと思います。すると、以下のようなコードになるらしいです。
最初は宇宙語ですが、『computedでstoreのゲッターを呼んで値を取得する』らしいです。
とりあえず、src/App.vueを、https://qiita.com/Takoyaki9/items/b6638fa1aec41464fdd1#appvueを少しだけ改変した以下のコードに変更します。
Vue Vuex Form
Kangaroo Valley Safari
{{ message }}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-145415.png}}
{{:14.vue.jsのvuexで入力フォーム:pasted:20190121-145438.png}}
下のフォームに文字を記入すると、上に反映されています。うまくいっているようです。
===== src/components/EditForm.vueの編集 =====
見栄えを改善するために、src/components/EditForm.vueを少しだけ変更したいと思います。
// の中の一部
//