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 相关文章推荐
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
Java/JS获取flash高宽的具体方法
Dec 27 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
Mar 11 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
Angular 2.x学习教程之结构指令详解
May 25 Javascript
web前端vue filter 过滤器
Jan 12 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
vue项目动态设置页面title及是否缓存页面的问题
Nov 08 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
Nov 05 Javascript
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
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
php5.2.0内存管理改进
2007/01/22 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
php获取linux命令结果的实例
2017/03/13 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
javascript中Function类型详解
2015/04/28 Javascript
Position属性之relative用法
2015/12/14 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
Python脚本实现格式化css文件
2015/04/08 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
python制作mysql数据迁移脚本
2019/01/01 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
大学教师个人总结
2015/02/10 职场文书
南极大冒险观后感
2015/06/05 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python