Vueパターンがprops上下しeventsています。シンプルに聞こえますが、カスタムコンポーネントを作成するときに忘れがちです。
Vue 2.2.0以降では、vモデル(計算されたプロパティ)を使用できます。この組み合わせにより、コンポーネント間にシンプルでクリーンで一貫性のあるインターフェイスが作成されることがわかりました。
propsコンポーネントに渡されたものはすべて無効のままです(つまり、複製されずwatch、変更が検出されたときにローカルコピーを更新する機能も必要ありません)。
- 変更は自動的に親に送信されます。
- 複数のレベルのコンポーネントで使用できます。
計算されたプロパティを使用すると、セッターとゲッターを別々に定義できます。これにより、Taskコンポーネントを次のように書き換えることができます。
Vue.component('Task', {
template: '#task-template',
props: ['list'],
model: {
prop: 'list',
event: 'listchange'
},
computed: {
listLocal: {
get: function() {
return this.list
},
set: function(value) {
this.$emit('listchange', value)
}
}
}
})
モデルプロパティ定義propに関連付けられv-model、イベントが変更に放出されます。次に、このコンポーネントを親から次のように呼び出すことができます。
<Task v-model="parentList"></Task>
listLocal計算されたプロパティは、(プライベート変数であることのようにそれを考える)コンポーネント内の単純なゲッターとセッターのインターフェイスを提供します。#task-templateあなたの中でレンダリングすることができlistLocal、それは反応的なままです(つまり、parentList変更するとTaskコンポーネントを更新します)。listLocalセッター(例:)を呼び出しthis.listLocal = newListて変更することもでき、変更を親に送信します。
このパターンの優れている点はlistLocal、Task(を使用してv-model)の子コンポーネントに渡すことができ、子コンポーネントからの変更が最上位コンポーネントに伝達されることです。
たとえばEditTask、タスクデータになんらかの変更を加えるための個別のコンポーネントがあるとします。同じv-modelプロパティと計算されたプロパティのパターンをlistLocal使用して、コンポーネントに(を使用してv-model)渡すことができます。
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
EditTask変更を発行する場合、それは適切に呼び出さset()れlistLocal、それによってイベントをトップレベルに伝播します。同様に、EditTaskコンポーネントはを使用して他の子コンポーネント(フォーム要素など)を呼び出すこともできv-modelます。