Vue コンポーネントに渡された props の更新時に data を書き換える
備忘録。
Vue.js でコンポーネントの props が更新された時に何かしらの処理を実行する方法について。
以下のようなコンポーネントを考える。
Vue.component('foo', { props: ['x'], created() { this.y = useX(this.x) } })
foo
はプロパティとして x
を受け取り、作成時に useX
では何かしらの API 呼出しなどを行い、その結果を y
に入れている。
これだと後から x
が変更された時に y
の更新ができない。そこで beforeUpdate
フックでも同じ処理を追加して、プロパティ更新時にも useX
を呼び出すことを保証できるように見える。
beforeUpdate() { this.y = useX(this.x) }
しかし、これは無限ループに陥ることになる。y
の更新が新たな beforeUpdate
の発火につながっている模様。
解決方法
まず watch
を使って x
の更新のみをフックするという手がある。
watch: { x() { this.y = useX(this.x) } }
単純な計算で useX
の実行タイミングの制約が緩いのであれば y
は算出プロパティにしてもいいかもしれない。
computed: { y() { useX(this.x) } }
あるいは、もしコンポーネント間で x
を複雑に引き回しているなら、Vuex での管理を検討してもいい。