vue项目中v-model父子组件通信的实现详解


Posted in Javascript onDecember 10, 2017

前言

我们在vue项目中,经常有这样的需求,父组件绑定v-model,子组件输入更改父组件v-model绑定的数值。很多朋友对这种操作不是很清楚,这需要对v-model有比较深入的了解,今天谈谈v-model。

vue的双向数据绑定

v-model这个指令只能用在<input>, <select>,<textarea>这些表单元素上,所谓双向绑定,指的就是我们在js中的vue实例中的data与其渲染的dom元素上的内容保持一致,两者无论谁被改变,另一方也会相应的更新为相同的数据。

这个问题在很多前端面试中,会提及。面试官问你,vue的双向数据绑定原理是什么?当然,这个也是耳熟能详的问题,百度随便一搜索,到处都能找到答案。

一般都会搜索到,是用Object.defineProperty( ) ,来监听数据get和set,来实现数据劫持的。

假如对Object.defineProperty( )不是很了解,可以点击上面链接,看看其语法!

举个简单的例子:

var blog = {
 name: 'haorooms博客'
};
console.log(blog.name); // haorooms博客

如果想要在执行console.log(blog.name)的同时,直接给haorooms博客加个书名号,那要怎么处理呢?或者说要通过什么监听对象 blog的属性值。这时候Object.defineProperty( )就派上用场了,代码如下:

var blog= {}
var name = '';
Object.defineProperty(blog, 'name', {
 set: function (value) {
 name = value;
 console.log('欢迎来到' + value);
 },
 get: function () {
 return '《' + name + '》'
 }
})
blog.name = 'haorooms博客'; // 欢迎来到haorooms博客
console.log(blog.name); // 《haorooms博客》

上面代码执行一下,可以查看效果!

关于 vue的双向数据绑定,具体如何实现的?网上也有很多实现的代码,这里就不多累赘了!

v-model 的使用

上面开了一个小差,讲了那么多,其实就是为了说明Vue 是单项数据流,v-model 只是语法糖而已。

<input v-model="haorooms" />
<input v-bind:value="haorooms" v-on:input="haorooms= $event.target.value" />

第一行的代码其实只是第二行的语法糖。然后第二行代码还能简写成这样:

<input :value="haorooms" @input="haorooms= $event.target.value" />

也就是说,

<input v-model="haorooms" />

也可以写成

<input :value="haorooms" @input="haorooms= $event.target.value" />

v-model在组件上的使用

回到我们一开始的疑问了?vue中v-model如何进行父子组件的通信?如何在组件中使用呢?假如你理解了我上面的例子,那么,我们就可以很简单的在组件中使用v-model了。

父组件代码如下:

<template>
 <div id="demo">
 <test-model v-model="haorooms"></test-model>
 <span>{{haorooms}}</span>
</div>
</template>
<script>
  import testModel from 'src/components/testModel'
  export default {
   data(){
      return{
         haorooms: "haorooms"
      }
    },
    components: {
      testModel,
    }
  }
</script>
<style lang="scss" scoped>
</style>

子组件代码如下:

<template>
<span>
   <input
    ref="input"
    :value="value"
    @input="$emit('balabala', $event.target.value)"
   >
  </span>
</template>
<script>
  export default {
    data(){
      return{
      }
    },
    props: ["value"],
    model: {
      prop: 'value',
      event: 'balabala'
    }
  }
</script>
<style lang="scss" scoped>
</style>

我们可以通过上面代码,子组件修改父组件v-model绑定的值!

实现截图如下:

vue项目中v-model父子组件通信的实现详解

v-model 的缺点和解决办法

在创建类似复选框或者单选框的常见组件时,v-model就不好用了。

<input type="checkbox" v-model="haorooms" />

我们可以用如下方式解决:

<input type="checkbox" :checked="status" @change="status = $event.target.checked" />

父组件可以如下写:

<my-checkbox v-model="haorooms"></my-checkbox>

子组件:

<input 
        type="checkbox"
        <!--这里就不用 input 了,而是 balabala-->
        @change="$emit('balabala', $event.target.checked)"
        :checked="value"
       />
 export default {
    data(){
      return{
      }
    },
    props: ['checked'], //这里就不用 value 了,而是 checked
   model: {
     prop: 'checked',
     event: 'balabala'
    },
  }

关于vue的v-model就写到这里。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
基于jquery的网页SELECT下拉框美化代码
Oct 28 Javascript
基于Jquery的跨域传输数据(JSONP)
Mar 10 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 Javascript
详解JavaScript 的变量
Mar 08 Javascript
基于Vue的商品主图放大镜方案详解
Sep 19 Javascript
微信小程序swiper实现文字纵向轮播提示效果
Jan 21 Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 #Javascript
利用ES6实现单例模式及其应用详解
Dec 09 #Javascript
利用node.js如何创建子进程详解
Dec 09 #Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 #Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
Dec 09 #Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
Dec 09 #Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 #Javascript
You might like
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
深入学习python的yield和generator
2016/03/10 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python编写Windows Service服务程序
2018/01/04 Python
python文本数据相似度的度量
2018/03/12 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
六行python代码的爱心曲线详解
2019/05/17 Python
Django 开发环境配置过程详解
2019/07/18 Python
python输出带颜色字体实例方法
2019/09/01 Python
python获取array中指定元素的示例
2019/11/26 Python
应届毕业生求职信范文分享
2013/12/26 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL