自定义Vue中的v-module双向绑定的实现


Posted in Javascript onApril 17, 2019

v-module 双向绑定实际上就是通过子组件中的 $emit 方法派发 input 事件,父组件监听 input 事件中传递的 value 值,并存储在父组件 data 中;然后父组件再通过 prop 的形式传递给子组件 value 值,再子组件中绑定 input 的 value 属性即可。

我们着手实现一遍:

子组件传值

首先子组件需要一个 input 标签,这个 input 标签需要绑定 input 事件,$emit 触发父组件的 input 事件,通过这种方法子组件传递值给父组件

<input type="text" @input="$emit('input', $event.target.value)">

父组件监听 input 事件,然后将事件携带的 input 输入的值传入到 data 状态中

<my-comp @input="value = $event"></my-comp>
export default {
 // ...
 data () {
  return {
   value: 'initial value' // 维护一个 value 状态
  }
 }
}

至此子组件监听 input 事件,用户输入字符串即可被父组件获取到并保存在 data 状态中

父组件传值

然后父组件还需要将 value 值传递给子组件,子组件再绑定 value 值到 input 的 value 属性上

<my-comp :value="value" @input="value = $event"></my-comp>

增加 :value="value" 通过 prop 传递 value

子组件中绑定 input 的 value 属性

<input type="text" @input="$emit('input', $event.target.value)" :value="value">

注意 props 中需要设定 value

export default {
 name: 'MyComp',
 props: ['value']
}

至此自定义的 v-module 处理完毕,看看效果:

自定义Vue中的v-module双向绑定的实现

其他元素使用 v-model

在 input 上使用 v-model 比较简单,但考虑到其他元素不一定是要监听 input 事件而是 change 事件,也不一定是 value 属性改变元素的内容。比如 checkbox,我们就需要监听 change 事件,以及 checked 属性。

那么先手动实现一遍:

<input type="checkbox" @change="$emit('change', $event.target.checked)" :checked="checked">

子组件首先监听 change 事件,并 $emit 方法触发父组件的 change 事件,将 checked 属性值传入给父组件;同时接收父组件传递进来的 checked 值,根据 checked 值决定 input 元素的 checked 属性。

export default {
 name: 'MyComp',
 props: ['checked']
}

然后需要修改父组件:

<my-comp @change="checked = $event"></my-comp>
export default {
  // ...
 data () {
  return {
   checked: false
  }
 }
}

父组件监听 change 事件,并在 data 中维护状态 checked,默认值为 false

最后看看效果:

自定义Vue中的v-module双向绑定的实现

直接使用 v-model 指令

此外还可直接使用 v-model 指令:

<my-comp v-model="checked"></my-comp>

但需要在组件中修改 v-model 指令,指定 prop 和 event:

export default {
 name: 'MyComp',
 props: ['checked'],
 model: {
  prop: 'checked',
  event: 'change'
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Js 中debug方式
Feb 07 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
Sep 17 Javascript
JavaScript 原型继承
Dec 26 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 Javascript
JS实现浏览器状态栏显示时间的方法
Oct 27 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
Oct 27 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
vue实现固定位置显示功能
May 30 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
Nov 03 Javascript
微信公众平台 发送模板消息(Java接口开发)
Apr 17 #Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 #Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 #Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 #Javascript
vue 项目 iOS WKWebView 加载
Apr 17 #Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 #Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
Apr 17 #Javascript
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python装饰器知识点补充
2018/05/28 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
详解python 爬取12306验证码
2019/05/10 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
优良学风班申请材料
2014/02/13 职场文书
化妆品店促销方案
2014/02/24 职场文书
出国留学计划书
2014/04/27 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
python实现简单的名片管理系统
2021/04/26 Python