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 相关文章推荐
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
jQuery Ajax使用FormData对象上传文件的方法
Sep 07 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
JS自定义混合Mixin函数示例
Nov 26 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
Aug 17 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 Javascript
javascript遍历对象的五种方式实例代码
Oct 24 Javascript
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
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
一些PHP写的小东西
2006/12/06 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
详解动画插件wow.js的使用方法
2017/09/13 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
信息系统专业个人求职信范文
2013/12/07 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
初三化学教学反思
2016/02/22 职场文书
如何用Navicat操作MySQL
2021/05/12 MySQL
浅谈如何保证Mysql主从一致
2022/03/13 MySQL