実現したいこと
Vueでinputタグの中に入力された値を使って、計算するプログラムを作っています。
inputタグには上限(100)と下限(0)を設定し、それを超えて入力された場合には、強制的にその値に置き換える(100を超えて入力できなくする)プログラムを書こうとしています。
前提
Vue CLI
で作成したプロジェクトを使っています。
値の管理はVuexを使って行っています。
inputタグにはv-model
でデータバインディングを行い、computed
プロパティで受け取っています。
UIコンポーネントのVuetifyを使用しているため、ソースコードではinputタグの拡張であるv-text-field
を使用しています。
発生している問題・エラーメッセージ
初回のみ999→100のように更新をしてくれるのですが、その後、1009,10099,100999となってしまいます。
計算結果には反映されているようなのですが、入力を抑制することができていません。
該当のソースコード
vue
1<template> 2 <div> 3 <v-text-field type="number" v-model="a"></v-text-field> 4 <v-text-field type="number" v-model="b"></v-text-field> 5 <p>a + b = {{ a + b }}</p> 6 </div> 7</template> 8 9<script> 10export default { 11 computed: { 12 a: { 13 get() { 14 return Number(this.$store.getters.a); 15 }, 16 set(value) { 17 if (value > 100) { 18 value = 100; 19 } else if (value < 0) { 20 value = 0; 21 } 22 this.$store.commit("update_a", value); 23 }, 24 }, 25 b: { 26 get() { 27 return Number(this.$store.getters.b); 28 }, 29 set(value) { 30 if (value > 100) { 31 value = 100; 32 } else if (value < 0) { 33 value = 0; 34 } 35 this.$store.commit("update_b", value); 36 }, 37 }, 38 }, 39}; 40</script> 41 42
JavaScript
1import Vue from "vue"; 2import Vuex from "vuex"; 3 4Vue.use(Vuex); 5 6export default new Vuex.Store({ 7 state: { 8 a: 0, 9 b: 0, 10 }, 11 getters: { 12 a: (state) => state.a, 13 b: (state) => state.b, 14 }, 15 mutations: { 16 update_a(state, value) { 17 state.a = value; 18 }, 19 update_b(state, value) { 20 state.b = value; 21 }, 22 }, 23}); 24
試したこと
ライフサイクルフックであるupdated
内でif文の処理を行うことで、想定していた動作をさせることができました。
しかし、updated
内でパラメーターを更新するのは、無限ループに陥るリスクがある点、他の箇所の更新時にも発火してしまう点を考慮すると、あまり好ましくはありません。
できれば、computed
やwatch
、methods
を使って解決したいと考えています。
v-model
を:value
と@input
に分けてmethods
で変更させたり、Vuexで受け取ったあとにmutation
の中で処理させたり、もちろんwatch
での更新も試しましたが、いずれもうまくいかない状況です。
何か良い方法があれば、ご教授いただきたいです。
補足情報(FW/ツールのバージョンなど)
"core-js": "^3.6.5", "vue": "^2.6.11", "vue-router": "^3.2.0", "vuetify": "^2.2.11", "vuex": "^3.4.0"
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。