在vue的开发中,我们常常会构造自定义组件,多个自定义组件组合至父级组件中,父子组件的通信方式基本是:父组件通过Prop向子组件传递数据。

<!-- 父组件 -->
<template><child :msg="A"></child>
</template>
<script>
export default {data() {return {A:'这是一条文本数据'};}...
};
</script>
<!-- 子组件 -->
<template><div>{{msg}}</div>
</template>
<script>
export default {prop: ['msg'],...
};
</script>
复制代码

以上的示例中,每当父组件的变量A发生数据变动时,都会更新子组件中接收的msg。

但是,因为Prop的数据是单向流动的,父组件可以通过Prop向子组件传递数据,子组件却不能通过Prop将数据的变动再回传给父组件。

此时有一个问题,如果我们希望子组件也可以实时改变父组件的数据,那该如何处理?

针对子父通信,vue给出了事件监听的方式,子父组件中共同定义好相应的事件名称,子组件调用内建的$emit方法并传入事件的名字,来向父级组件触发一个事件,同$emit支持第二个参数作为数据传递。然后当在父级组件监听这个事件的时候,可以通过 $event访问到被抛出的这个值。

以上就是官方文档给出的一个子父通信方法,具体代码详见官方文档,不是本文讲解内容。

当然了,随着vuex这样的数据管控插件的加入,组件间的通信变得更加集中化,但是比起原生的通信方式成本已增大了。

很多时候,多个组件组合使用时我们希望实现子父通信,总考虑到以下问题:

若采用官方的父子组件事件监听来实现代码较为繁琐,多个组件就要定义多个监听事件,增加代码量而且不好管控。 若引入vuex集中管理,成本较大,又感觉部分功能还达不到非使用vuex不可的程度,杀鸡焉用牛刀。 那么到底有什么最优的方法呢?

此时我不禁想到vue的一个很特殊的指令v-model,vue文档中写道:

你可以用v-model指令在表单<input><textarea><select>元素上创建双向数据绑定。 v-model是一个可以实现数据双向绑定的指令,那么我们可不可以使用它来实现子父通信呢?当然是可以啦!

仔细查询文档,其实就有提到在组件上使用v-model,建议仔细阅读理解v-model机制后再继续看以下代码!

于是我们可以尝试着修改一下之前的代码:

<!-- 父组件 -->
<template><child v-model="A"></child>
</template>
<script>
export default {data() {return {A: '这是一条文本数据'};}
};
</script>
<!-- 子组件 -->
<template><input v-model="tempdata"/>
</template>
<script>
export default {prop: {value: {type: String,default: ''}},data() {return {tempdata: ''};},watch: {value: {// 若父组件的数据发生变动,及时更新,保持tempdata的值与value一致handler(val) {this.tempdata = val;},immediate: true},tempdata(val) {// 当tempdata发生变动时,触发‘input’事件向父组件执行对value的修改this.$emit('input', val);},}
};
</script>
复制代码

从以上代码可以看出,主要的修改是在于子组件,针对v-model指令的特殊性,我们定义一个临时变量tempdata用于承载子组件内的数据修改,初始化时保持其值与父组件使用v-model传递来的value一致。每当tempdata发生变动时,子组件监听其变化并将该值通过$emit('input')的方式触发父组件更新value(即父组件使用v-model传递的对象变量)。

以上就是本次分享的主要内容,不难发现,其实本次的实现方式还是基于官方给出的事件监听的方式,但巧妙地使用了v-model指令为我们减少了很多代码,且更加灵活。

转载于:https://juejin.im/post/5bdbc8baf265da61441f8044

巧用v-model实现组件间数据双向绑定相关推荐

  1. 组件间的双向绑定、如何自己定制双向绑定

    1.组件间的双向绑定 1.1 组件的双向绑定的介绍 由于vue中的单项数据流,一般来说,父组件通过自定义属性传输数据,子组件通过props字段接受数据,如果子组件想要更改父组件传过来的数据,可以通过t ...

  2. Vue之组件间的双向绑定

    何为组件间双向绑定 我们都知道当父组件改变了某个值后,如果这个值传给了子组件,那么子组件也会自动跟着改变,但是这是单向的,使用v-bind的方式,即子组件可以使用父组件的值,但是不能改变这个值.组件间 ...

  3. Angular 5 子组件与父组件实现数据双向绑定

    1. 实现父组件和子组件间 数据的双向绑定 2. 描述:子组件和父组件间,各有一个<input>标签,在父组件input 内容,子组件的input 标签上同步 ,在子组件的input 上输 ...

  4. 【Vue2 组件间数据的双向绑定】

    组件间数据的双向绑定 一.通过自定义事件 二.通过v-model 三.通过.sync修饰符 四.provide和inject 代码中的p-8,mt-8等,都是自己写的工具类,复制代码的同学,可以自行删 ...

  5. 组件间数据交互||父组件向子组件传值-基本使用|| 父组件向子组件传值-props属性名规则

    组件间数据交互 父组件向子组件传值 1. 组件内部通过props接收传递过来的值 2. 父组件通过属性将值传递给子组件 父组件向子组件传值-基本使用 <!DOCTYPE html> < ...

  6. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  7. 三、Vue(组件、组件间数据传递、slot内容分发、vue-router路由、单文件组件、vue-cli脚手架 )

    一. 组件component 1. 什么是组件?     组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码     组件是自定义元素(对象) ...

  8. uni-app 封装js方、页面的生命周期、数据双向绑定、封装组件

    1.在外部封装js方法 很多页面都会用到相同的方法,为了代码的复用,可以在外部封装相同的方法 在项目中创建一个utils目录,存放外部封装的js方法 在utils目录下创建getDate.js文件 e ...

  9. this指向-作用域、作用域链-预解析 变量提升-Vue组件传值 父子 子父 非父子-Vue数据双向绑定原理

    目录 this指向 作用域.作用域链 预解析 变量提升 Vue组件传值 父子 子父 非父子 Vue数据双向绑定原理 1.this指向 函数的this指向 看调用.不看声明 (1)普通函数调用 ①函数名 ...

最新文章

  1. canal+mysql+rocket
  2. 【python初识】列表与函数模块
  3. 不炫技,SVG+CSS3 旋转动画属性就能实现的梦幻效果
  4. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
  5. 如何入门Web前端 你可以从这几方面入手
  6. CSS对IE6、IE7、IE8支持详细的易用的参考
  7. 递归算法 流程图_什么是算法?如何学习算法?算法入门的学习路径
  8. Java面试题详解二:java中的关键字
  9. 【原】React中,map出来的元素添加事件无法使用
  10. net.java.html.boot.BrowserBuilder
  11. 世界哲学日2600年西方哲学思想发展史谱系图和哲学50命题(公号回复“西方哲学”下载PDF彩标典藏版,欢迎转发、赞赏、支持科教)
  12. html5制作国际象棋棋盘,用3DS MAX打造国际象棋的棋盘效果 -工程
  13. “新元宇宙”奇科幻小说原创作品《地球人奇游天球记》第四回飞离地球
  14. 3D建模zbrush笔刷分享
  15. 【组图】世界著名城市夜景
  16. WINCE快捷方式结构
  17. 迪文T5-T5L使用测试笔记1
  18. C++入门学习:引用和常引用
  19. 数据结构初阶——链式二叉树
  20. 评高工计算机专业是啥系列,评高级工程师需要职称计算机吗?高级工程师计算机模块是什么意思?...

热门文章

  1. 如何在软文中巧妙的植入广告?分享四个软文广告植入方法
  2. 干货收藏|百万UP主都在用的创作小帮手
  3. 最新版Photoshop 2023(ps2023)特色功能有哪些?
  4. 【Latex】制作演示文档或者课程报告 - 制作课程报告(三)
  5. 酷睿i5 12450h和i5 11260h差距 i512450h和i511260h对比
  6. 前端架构设计第一课 CI环境npm/Yarn
  7. 2013年4月广告联盟行业网站综合影响力排名
  8. 物联卡是什么卡,纯流量卡又是什么卡?搜卡之家为你介绍。
  9. JPEG图像EXIF数据信息的解析
  10. 4G DTU在电力远程自动抄表中的应用