【发布时间】:2021-01-18 23:19:12
【问题描述】:
我想在组件和它的子组件之间有一个双向属性。在这个例子中,我有一个共享字符串被发送到我的子组件:
<template>
<div>
<foobar title="Foo" :value.sync="shared"></foobar>
<foobar title="Bar" :value.sync="shared"></foobar>
</div>
</template>
<script>
import Sub from './sub'
export default {
components: {
'foobar': Sub
},
watch : {
shared() {
console.log("Shared value was updated")
}
},
data() {
return {
shared: "Content"
}
}
}
</script>
每个子组件只是绑定到此共享属性的文本输入:
<template>
<b-form-group :description="title">
<b-form-input v-model="value"></b-form-input>
</b-form-group>
</template>
<script>
export default {
props: {
value: String,
title: String
}
}
</script>
预期的行为是始终在两个文本输入中看到相同的值。如果我修改Foo,Bar 会更新,观察者将触发事件Shared value was updated。
我得到了错误:
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten
whenever the parent component re-enters.
【问题讨论】:
-
你不能改变一个 prop 并期望 parent 中的值改变(除非你正在改变一个对象的属性),正确的方法是在 child 中 $emit 将更新的数据发送给 parent并在父级中使用 v-on 更新数据。
-
@ChrisLi 是否可以利用
.sync? -
.sync 和 v-model 没有太大区别,.sync 可以让你使用除 'value' 以外的 props 进行两种方式绑定,但你仍然需要在你的孩子中 $emit 事件组件。
-
@ChrisLi 是的,这就是 Vue 3 中没有
sync的原因。相反,您可以有多个v-models 同步多个道具...
标签: javascript vue.js vue-component