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 相关文章推荐
再谈IE中Flash控件的自动激活 ObjectWrap
Mar 09 Javascript
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
php中给js数组赋值方法
Mar 10 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
javascript每日必学之多态
Feb 23 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
Vue.js进行查询操作的实例详解
Aug 25 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
判断div滑动到底部的scroll实例代码
Nov 15 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
php中cookie的作用域
2008/03/27 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
php实现可逆加密的方法
2015/08/11 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
Node.js实现文件上传
2016/07/05 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
python发送邮件接收邮件示例分享
2014/01/21 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
使用python绘制温度变化雷达图
2019/10/18 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
使用django自带的user做外键的方法
2020/11/30 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
生产厂厂长岗位职责
2013/12/25 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers