Vue模式props
向下和events
向上。听起来很简单,但是在编写自定义组件时很容易忘记。
从Vue 2.2.0开始,您可以使用v模型(具有计算属性)。我发现这种组合在组件之间创建了一个简单,干净且一致的接口:
props
传递给您组件的任何内容都将保持反应性(即,它不会被克隆,也不需要watch
检测到更改时需要更新本地副本的函数)。
- 更改会自动发送给父级。
- 可以与多个级别的组件一起使用。
计算属性允许setter和getter分别定义。这样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
计算出的属性在组件内提供了一个简单的getter和setter接口(认为它像被一个私有变量)。在其中#task-template
可以进行渲染listLocal
,并且它将保持反应性(即,如果进行parentList
更改,它将更新Task
组件)。您也可以listLocal
通过调用setter(例如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
。