【发布时间】:2018-08-05 09:15:51
【问题描述】:
以下是我当前的结构(不起作用)。
父组件:
<template>
<field-input ref="title" :field.sync="title" />
</template>
<script>
import Field from './input/Field'
export default {
components: {
'field-input': Field
},
data() {
return {
title: {
value: '',
warn: false
}
}
}
}
</script>
子组件:
<template>
<div>
<input type="text" v-model="field.value">
<p v-bind:class="{ 'is-invisible' : !field.warn }">Some text</p>
</div>
</template>
<script>
export default {
props: ['field']
}
</script>
要求是:
- 如果 parent 的数据
title.warn在 parent 中发生变化,则应该更新 child 的class绑定 (field.warn)。 - 如果孩子的
<input>已更新(field.value),则应更新父母的title.value。
实现这一目标的最简洁有效的解决方案是什么?
【问题讨论】:
-
所有的 props 在子属性和父属性之间形成一个单向向下的绑定:当父属性更新时,它会向下流向子属性,反之则不会.这可以防止子组件意外改变父组件的状态,从而使您的应用程序的数据流更难理解。 [...] 这意味着您应该不尝试改变子组件内的道具。如果你这样做了,Vue 会在控制台中警告你。 vuejs.org/v2/guide/components.html#One-Way-Data-Flow
-
对于您的第一个用例,只需将 title.warn 作为道具传递给孩子。对于您的第二个用例,将对处理程序的引用传递给子级。在子节点上,发出触发此处理程序的事件。
-
您基本上是在自制
v-model,文档中概述了如何操作。绑定 prop 并发出事件。 -
你的代码应该符合要求,见codesandbox.io/s/421m2611p4,但你说不行?也许是其他问题。请查看有关同步的 vue 文档,因为您没有正确使用它vuejs.org/v2/guide/components.html#sync-Modifier
标签: vue.js vuejs2 vue-component