предисловие
Двусторонняя привязка между родительским и дочерним компонентами очень проста, но многие люди могут начать использовать Vue 2+, могут не знать, как привязать двустороннюю привязку, конечно, самая простая двусторонняя привязка (один файл) элемент формыv-model
, Например<input type="text" />
Он будет реагировать на элемент формыvalue
свойств, когда текст поля ввода изменится, он будетvalue
значение, переданноеv-model
Связанная переменная, если она установлена одновременноv-model
а такжеvalue
,value
Недействительное свойство.
Настраиваемая двунаправленность для родительских и дочерних компонентовv-model
Когда несколько DOM инкапсулированы в компоненты, когда дочерний компонент используется в родительском компоненте, его нельзя использовать на метке дочернего компонента.v-model
, поскольку метка дочернего компонента не является элементом формы, в настоящее время нам нужно настроить то, что мы хотимv-model
правило.
<!-- children.vue -->
<template>
<h1>{{ msg }}</h1>
</template>
<script>
export default{
model:{
prop:'msg',//这个字段,是指父组件设置 v-model 时,将变量值传给子组件的 msg
event:'parent-event'//这个字段,是指父组件监听 parent-event 事件
},
props:{
msg:String //此处必须定义和model的prop相同的props,因为v-model会传值给子组件
},
mounted(){
//这里模拟异步将msg传到父组件v-model,实现双向控制
setTimeout(_=>{
let some = '3秒后出现的某个值';//子组件自己的某个值
this.$emit('parent-event',some);
//将这个值通过 emit 触发parent-event,将some传递给父组件的v-model绑定的变量
},3000);
}
}
</script>
<!-- parent.vue -->
<template>
<children v-model="parentMsg"></children>
</template>
<script>
import children from 'path/to/children.vue';
export default{
components:{
children
},
data(){
return{
parentMsg:'test'
}
},
watch:{
parentMsg(newV,oldV){
console.log(newV,oldV);
//三秒后控制台会输出
//'3秒后出现的某个值','test'
}
}
}
</script>
Вы изучаете настройку компонентов
v-model
Все же ? Если это нормальный элемент формы, то же самое, слушать формуinput
илиchange
событие в реальном времениvalue
илиchecked
пройти через$emit
Просто передайте это.
Пользовательские множественные двунаправленные значения для родительских и дочерних компонентов
В приведенном выше примере реализована двусторонняя привязка одного значения свойства.Когда требования компонента требуют сложных операций и требуется несколько двусторонних значений, как это реализуется? Здесь нам нужно использовать те, которые были заброшены vue раньше, а затем возвращены..sync
модификатор.
На самом деле это соотношениеv-model
проще
<!-- children.vue -->
<template>
<h1>{{ msg }}</h1>
</template>
<script>
export default{
props:{
msg:String
},
mounted(){
//这里模拟异步将msg传到父组件v-model,实现双向控制
setTimeout(_=>{
let some = '3秒后出现的某个值';//子组件自己的某个值
this.$emit('update:msg',some);
//将这个值通过 emit
//update为固定字段,通过冒号连接双向绑定的msg,将some传递给父组件的v-model绑定的变量
},3000);
}
}
</script>
<!-- parent.vue -->
<template>
<children :msg.sync="parentMsg"></children>
<!-- 此处只需在平时常用的单向传值上加上.sync修饰符 -->
</template>
<script>
import children from 'path/to/children.vue';
export default{
components:{
children
},
data(){
return{
parentMsg:'test'
}
},
watch:{
parentMsg(newV,oldV){
console.log(newV,oldV);
//三秒后控制台会输出
//'3秒后出现的某个值','test'
}
}
}
</script>
Обратите внимание, хотя добавление.sync
Вы можете связываться в обоих направлениях, но вам все равно придется полагаться на подкомпоненты.$emit
для запускаupdate:prop名
Реализуйте двухсторонний поток данных, изменяя значение переменного значения родительского компонента. Если свойство PROP непосредственно назначается, ошибка все равно будет происходить.
Фактически,.sync
Модификатор — это сокращение, которое делает одну вещь
<template>
<children :msg.sync="parentMsg"></children>
<!-- 等价于 -->
<children :msg="parentMsg" @update:msg="parentMsg = $event"></children>
<!-- 这里的$event就是子组件$emit传递的参数 -->
</template>
Когда вам нужно передать все свойства объекта через.sync
Когда передается двунаправленный поток данных, его можно записать более простым способом.
<template>
<children :.sync="obj"></children>
</template>
<script>
export default{
components:{
children
},
data(){
return{
obj:{
parentMsg:'test'
}
}
}
}
</script>
Когда используется этот способ записи, все свойства в объекте obj будут переданы дочернему компоненту через независимые реквизиты, и соответствующиеupdate:
, соответствующие реквизиты также должны быть объявлены в дочернем компоненте.
Суммировать
В компоненте «родитель-потомок» использование двунаправленного потока данных может дать хорошие результаты и опыт разработки в некоторых случаях, но его следует использовать умеренно, поскольку двунаправленный поток данных увеличит нагрузку на последующее обслуживание проекта.
Советы: если вы знаете, как делиться, вы пойдете дальше.