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 相关文章推荐
JS获取整个页面文档的实现代码
Dec 15 Javascript
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
YUI模块开发原理详解
Nov 18 Javascript
ExtJs中gridpanel分组后组名排序实例代码
Dec 02 Javascript
使用focus方法让光标默认停留在INPUT框
Jul 29 Javascript
jQuery过滤选择器经典应用
Aug 18 Javascript
JavaScript实现简单的日历效果
Sep 25 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
js 显示日期时间的实例(时间过一秒加1)
Oct 25 Javascript
微信小程序wx.request拦截器使用详解
Jul 09 Javascript
vue实现购物车选择功能
Jan 10 Javascript
ES6 Generator基本使用方法示例
Jun 06 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编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
PHP7 标准库修改
2021/03/09 PHP
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
详解vue中async-await的使用误区
2018/12/05 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
办公室文秘岗位职责
2013/11/15 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
劲霸男装广告词改编版
2014/03/21 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
党支部对照检查材料
2014/08/25 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
师范生见习总结范文
2015/06/23 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android