前置き
v-model(input)
の値をVuex
に保存してみましょう🌟
通常はページ遷移をすると
入力した値が消えてしまいます💥
そこでデータ保存のできるVuex
を使うわけです💡💕
具体的な使用例は…
性格診断🕵️♀️
各入力項目ごとに
ページ遷移しても
最後にその結果を反映して
こんな性格です!
と再表示させる
ショッピングサイト🛍
買い物カゴに追加した商品が
ページ遷移しても
残ったままにする
などがあります✨🍎
サーバーで保存したいんだけど💡
という方、
その場合でもVuex
の使用は必須になるので
ぜひやってみてください🍀😄
この辺りは次で説明します✍️
⬇️Vuexとは何か、メリットなどは
こちらをご覧ください✨👀
【Nuxt.js】Vuex基礎編:コードをスッキリさせよう
【Nuxt.js】Vuexまとめ編:はじめる前に、簡単理解!
保存の種類と段階について
データ保存には段階があります👣
- Vuexで管理をするようにする
- Cookieで管理をするようにする
- サーバーで管理をするようにする
2なら1は必須、
3でも1は必須で、2はやった方が良い
という物になります🌟
いずれにしてもVuex
は使用するので
やっておきましょう💫🧙♀️
1番良いのはサーバー保存ですが、
通信の増加に伴って
サーバー料金も増えたりします💰
その対策としてVuex
のみを使用することもあります🍒
ただしデータ保存といっても
リロードすると初期状態に
戻ってしまうため、
リロードしてはいけない場所で使います💡
getterとsetterを使う
computed
のgetter
とsetter
でstore
から呼び出します🌟
命名はstate
とgetters
の違いなどを
分かりやすくするためにgettersMessage
などにしています。
その時の役割で
命名してあげてください🍎
⬇️computedについて
【Nuxt.js】Nuxt文法編:computed
役割が分かれているので、state
を直接呼び出さないように
注意してください💥✋
シンプルver.
まずはページ遷移などなしに
簡単に呼び出してみます。
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 26 |
<template> <div class="page"> <input v-model="message"> <p> 送信内容: {{ message }} </p> </div> </template> <script> export default { computed: { message: { get () { return this.$store.getters['gettersMessage'] }, set (value) { this.$store.commit('updateMessage', value) } } } } </script> <style lang="scss" scoped> </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
export const state = () => ({ obj: { message: '', } }) export const getters = { gettersMessage: state => { return state.obj.message }, } export const mutations = { updateMessage(state, message) { state.obj.message = message } } |
遷移ver.
input
をコンポーネントにします。
アトミックデザインでの分類を
するほど数がないのでcomponents
の直下にInputDefault.vue
で作成しています。
コンポーネントのimport
や
登録は面倒なので
自動で行っています🌟
06: 自動でインポートする
directory
components/
--| InputDefault.vue
pages/
--| index.vue
--| result.vue
store/
--| index.js
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 26 |
<template> <div class="page"> <input v-model="message"> <p> 送信内容: {{ message }} </p> </div> </template> <script> export default { computed: { message: { get () { return this.$store.getters['gettersMessage'] }, set (value) { this.$store.commit('updateMessage', value) } } } } </script> <style lang="scss" scoped> </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
export const state = () => ({ obj: { message: '', } }) export const getters = { gettersMessage: state => { return state.obj.message }, } export const mutations = { updateMessage(state, message) { state.obj.message = message } } |
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"> <InputDefault /> <nuxt-link to="/result" class="link" > 遷移! </nuxt-link> </div> </template> <script> export default { } </script> <style lang="scss" scoped> .page { > .link { text-decoration: none; color: deepskyblue; } } </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<template> <div class="page"> <p>{{ message }}</p> </div> </template> <script> export default { computed: { message: { get () { return this.$store.getters['gettersMessage'] }, } } } </script> <style lang="scss" scoped> </style> |
補足: mapを使う場合
gettersが複数ある場合に有効です!
今回は1つしかないので
あくまで書き方の参考に
してもらえると良いかと思います🌟
また、setterを使う必要はありません💡
⬇️mapについてはこちらをご覧ください
【Nuxt.js】Nuxt文法編:Vuexのmapって結局なに??
computed
map
を使ってstore
を呼び出します💡methods
でmutation
を呼び出してstore
の値を書き換えています✍️
v-model
v-model
がない!?
と混乱した方!!!✋v-model
はv-on
とv-bind
を
まとめて1行で書くための
シュガーシンタックスです!
今回は値をバインドする必要がないので@input
のみを使用しています。
⬇️v-modelについて
【Nuxt.js】Nuxt文法編:v-model①
【Nuxt.js】Nuxt文法編:v-model②
その他
コンポーネントのimport
や
登録は面倒なので
自動で行っています🌟
06: 自動でインポートする
store/index.js
index.vue
この2つはパターン1と全く同じです🌟
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 26 27 28 |
<template> <div class="page"> <input @input="updateMessage" > <p> 送信内容: {{ gettersMessage }} </p> </div> </template> <script> import { mapGetters } from 'vuex' export default { computed: { ...mapGetters(['gettersMessage']) }, methods: { updateMessage (e) { this.$store.commit('updateMessage', e.target.value) }, }, } </script> <style lang="scss" scoped> </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<template> <div class="page"> <p>{{ gettersMessage }}</p> </div> </template> <script> import { mapGetters } from 'vuex' export default { computed: { ...mapGetters(['gettersMessage']) }, } </script> <style lang="scss" scoped> </style> |
まとめ
Vuexやcomputed, v-modelなど
様々な知識を使うようになってきました🌟
そのため初心者タグから
中級者にしております❤️👏