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
ます。