Vue中实现父子组件双向数据传递的方式

tech2025-08-13  5

文章目录

双向数据传递v-modemodel.sync

双向数据传递

这里提到的父子组件双向数据传递,即父子组件可以进行互相修改我们知道一般父向子传值,子通过props进行接收,子向父传值,是通过$emit发布一个事件,父通过事件的监听获取到子的值,详细可见vue-组件之间的通信这里我们通过v-model,model及sync来实现父子双向的数据传递

v-mode

在vue中的一些表单中,我们经常通过v-mode来实现数据的双向绑定,但其实v-model的本质是一个语法糖,如下代码<input v-model="test">本质上是<input :value="test" @input="test = $event.target.value">即对input绑定了value的属性,并监听了input事件我们通过v-model这种语法糖的形式,实现自定义的一个VModel组件,从而实现父子的双向数据传递,代码如下: // home.vue <template> <div> <div> V-MODEL-INPUT:<VModel v-model="VModelVal"></VModel> V-MODEL-INPUT-PARENT: <input type="text" v-model="VModelVal"> </div> </div> </template> <script> import VModel from './VModel'; export default {   data() {     return { VModelVal:'VModelVal'     };   },   components:{ VModel } } </script> // VModel.vue <template> <div class="v-model-wrapper"> <input type="text" :value="value" @input="handleInput"> </div> </template> <script> export default { data(){ return {} }, props:{ value: String, default:'' }, methods:{ handleInput(e){ this.$emit('input', e.target.value); } } } </script>

model

默认情况下,一个组件的v-model会把value用作prop, 且把input用过event当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,model选项就派上用场了,在定义组件的时候,指定prop的值和监听的事件。如下:我们通过修改prop及event来实现一个自定义的v-model,从而实现父子组件的双向数据传递 // home.vue <template> <div> <div> MODEL-INPUT:<Model v-model="ModelVal"></Model> MODEL-INPUT-PARENT: <input type="text" v-model="ModelVal"> </div> </div> </template> <script> import Model from './Model'; export default {   data() {     return { ModelVal:'ModelVal'     };   },   components:{ Model } } </script> // Model.vue <template> <div> <input type="text" :value="val" @keyup="handleInput"> </div> </template> <script> export default { model:{ prop:'val', event: 'keyup' }, data(){ return {} }, props:{ val: { type: String, default: '' } }, methods:{ handleInput(e){ this.$emit('keyup', e.target.value); } } } </script>

.sync

当子组件变更父组件数据时,推荐以update:myPropName的模式触发事件举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图 this.$emit('update:title', newTitle) 然后父组件可以监听那个事件并根据需要更新一个本地的数据 property。例如: <text-document v-bind:title="doc.title" v-on:update:title="doc.title = $event" ></text-document> 为了方便起见,我们为这种模式提供一个缩写,即 .sync 修饰符, 用法如下: // home.vue <template> <div> <div> SYNC-INPUT:<SYNC :syncVal.sync='SyncVal'></SYNC> SYNC-INPUT-PARENT: <input type="text" v-model="SyncVal"> </div> </div> </template> <script> import SYNC from './Model'; export default {   data() {     return { SyncVal:'SyncVal'     };   },   components:{ SYNC } } </script> // sync.vue <template> <div> <input type="text" :value="syncVal" @keyup="handleInput"> </div> </template> <script> export default { data(){ return {} }, props:{ syncVal: { type: String, default: '' } }, methods:{ handleInput(e){ this.$emit('update:syncVal', e.target.value); } } } </script>

文章参考: Vue.js vue的model选项 Vue中从v-model,model,.sync到双向数据传递,再到双向数据绑定

最新回复(0)