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 Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
JS request函数 用来获取url参数
May 17 Javascript
JS定时关闭窗口的实例
May 22 Javascript
js中onload与onunload的使用示例
Aug 25 Javascript
JavaScript截取、切割字符串的技巧
Jan 07 Javascript
AngularJS中的过滤器filter用法完全解析
Apr 22 Javascript
JavaScript新增样式规则(推荐)
Jul 19 Javascript
详解AngularJS ng-class样式切换
Jun 27 Javascript
jQuery实现点击关注和取消功能
Jul 03 jQuery
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
使用JavaScript实现node.js中的path.join方法
Aug 12 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 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
function.inc.php超越php
2006/12/09 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
python实现html转ubb代码(html2ubb)
2014/07/03 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
简单理解Python中的装饰器
2015/07/31 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
电脑教师的教学自我评价
2013/11/26 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
运动会通讯稿300字
2015/07/20 职场文书
村主任当选感言
2015/08/01 职场文书
财务人员入职担保书
2015/09/22 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
如何书写授权委托书?
2019/06/25 职场文书
Python基础详解之描述符
2021/04/28 Python
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
Nginx 常用配置
2022/05/15 Servers