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 相关文章推荐
拖动布局之保存布局页面cookies篇
Oct 29 Javascript
js获取当前时间显示在页面上并每秒刷新
Dec 24 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
Sep 14 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
jquery实现点击页面回到顶部
Nov 23 Javascript
使用Angular缓存父页面数据的方法
Jan 03 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
Node.js 基础教程之全局对象
Aug 06 Javascript
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
对于Javascript 执行上下文的全面了解
Sep 05 Javascript
Vue.js点击切换按钮改变内容的实例讲解
Aug 22 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 程序员应该使用的10个组件
2009/10/31 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
JS跨域代码片段
2012/08/30 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
input框中的name和id的区别
2016/11/16 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
python实现石头剪刀布小游戏
2021/01/20 Python
Python sorted对list和dict排序
2020/06/09 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
自荐信的禁忌和要点
2013/10/15 职场文书
办公室副主任岗位职责
2013/11/25 职场文书
手工社团活动方案
2014/02/17 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
建筑工地宣传标语
2014/06/18 职场文书
中学生自我评价范文
2015/03/03 职场文书
社会实践单位意见
2015/06/05 职场文书