Vue父子组件双向绑定传值的实现方法


Posted in Javascript onJuly 31, 2018

父子组件之间的双向绑定非常简单,但是很多人因为是从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('praent-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 传递就可以了。

父子组件的自定义多个双向值

上述例子,是实现单个prop值的双向绑定,当组件的需求需要复杂的操作,需要多个双向值,是如何实现的呢。这里需要用到以前被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" @updata: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对象中的所有属性都通过独立的props传递给子组件,并监听对应的 update: ,此时在子组件中也要声明对应的props。

总结

以上所述是小编给大家介绍的Vue父子组件双向绑定传值的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 设计模式学习 Factory
Jul 29 Javascript
JavaScript(js)设置默认输入焦点(focus)
Dec 28 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
jquery ajax 局部无刷新更新数据的实现案例
Feb 08 Javascript
jQuery性能优化的38个建议
Mar 04 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
Oct 08 Javascript
JavaScript截取、切割字符串的技巧
Jan 07 Javascript
jQuery如何解决IE输入框不能输入的问题
Oct 08 Javascript
socket.io学习教程之基本应用(二)
Apr 29 Javascript
jQuery回调方法使用示例
Jun 26 jQuery
js实现鼠标跟随运动效果
Aug 02 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
Jan 27 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 #Javascript
vue2.0页面前进刷新回退不刷新的实现方法
Jul 31 #Javascript
Node.js log4js日志管理详解
Jul 31 #Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 #jQuery
JS实现移动端触屏拖拽功能
Jul 31 #Javascript
JavaScript new对象的四个过程实例浅析
Jul 31 #Javascript
Vue 路由 过渡动效 数据获取方法
Jul 31 #Javascript
You might like
PHP生成静态页
2006/11/25 PHP
php获取地址栏信息的代码
2008/10/08 PHP
PHP抽象类 介绍
2012/06/13 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
keras中的backend.clip用法
2020/05/22 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
机械制造专业毕业生求职信
2014/03/02 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers