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 相关文章推荐
CCPry JS类库 代码
Oct 30 Javascript
JavaScript制作的可折叠弹出式菜单示例
Apr 04 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
jQuery常用且重要方法汇总
Jul 13 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
May 31 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
使用mixins实现elementUI表单全局验证的解决方法
Apr 02 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 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
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
js实现进度条的方法
2015/02/13 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
Python栈类实例分析
2015/06/15 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
Pytorch转tflite方式
2020/05/25 Python
python dict乱码如何解决
2020/06/07 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
大学中国梦演讲稿
2014/04/23 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
委托书格式要求
2015/01/28 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang