Vue 模式是向下和向上的。这听起来很简单,但在编写自定义组件时很容易忘记。props
events
从 Vue 2.2.0 开始,你可以使用 v-model(具有计算属性)。我发现这种组合在组件之间创建了一个简单,干净且一致的界面:
- 传递给组件的任何内容都是反应式的(即,它不是克隆的,也不需要在检测到更改时更新本地副本的函数)。
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)
}
}
}
})
model 属性定义哪个与 相关联,以及在发生更改时将发出哪个事件。然后,您可以从父级调用此组件,如下所示:prop
v-model
<Task v-model="parentList"></Task>
计算属性在组件中提供了一个简单的 getter 和 setter 接口(可以将其视为私有变量)。在你可以渲染的情况下,它将保持反应性(即,如果更改,它将更新组件)。您也可以通过调用 setter(例如 ,)来进行更改,它将向父级发出更改。listLocal
#task-template
listLocal
parentList
Task
listLocal
this.listLocal = newList
此模式的优点在于,您可以将 传递给 (using ) 的子组件,并且从子组件的更改将传播到顶级组件。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