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的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
Oct 10 Javascript
在Javascript中处理字符串之big()方法的使用
Jun 08 Javascript
vue.js绑定class和style样式(6)
Dec 09 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 Javascript
angular.JS实现网页禁用调试、复制和剪切
Mar 31 Javascript
Ionic3 UI组件之Gallery Modal详解
Jun 07 Javascript
js实现鼠标拖拽多选功能示例
Aug 01 Javascript
vue中的scope使用详解
Oct 29 Javascript
JavaScript 点击触发复制功能实例详解
Nov 02 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
Nov 15 Javascript
微信小程序人脸识别功能代码实例
May 07 Javascript
vue下的@change事件的实现
Oct 25 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
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
浅谈python之新式类
2018/08/12 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
python 爬虫请求模块requests详解
2020/12/04 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
信访工作汇报材料
2014/10/27 职场文书
会计电算化实训报告
2014/11/04 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
端午节活动总结报告
2015/02/11 职场文书
工作态度不好检讨书
2015/05/06 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL