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面向对象编程代码
Dec 19 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
Apr 03 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
Jun 28 Javascript
jquery过滤特殊字符',防sql注入的实现方法
Aug 17 Javascript
js实现显示手机号码效果
Mar 09 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
vue webpack打包优化操作技巧
Feb 22 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
Jun 19 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
JS模拟浏览器实现全局搜索功能
Sep 11 Javascript
Vue中正确使用Element-UI组件的方法实例
Oct 13 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在网页中动态生成PDF文件详细教程
2014/07/05 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
原生js实现购物车功能
2020/09/23 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
python如何实现复制目录到指定目录
2020/02/13 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
Python 必须了解的5种高级特征
2020/09/10 Python
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
司机的工作范围及职责
2013/11/13 职场文书
应届毕业生求职信
2013/11/30 职场文书
董事长助理岗位职责
2014/02/18 职场文书
企业领导对照检查材料
2014/08/20 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书
Pandas数据类型之category的用法
2021/06/28 Python