自定义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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
W3C Group的JavaScript1.8 新特性介绍
May 19 Javascript
Javascript 面向对象特性
Dec 28 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
javascript里模拟sleep(两种实现方式)
Jan 25 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
May 18 Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
Jul 28 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php 获取mysql数据库信息代码
2009/03/12 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
js控制input输入字符解析
2013/12/27 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
在Python中使用Neo4j数据库的教程
2015/04/16 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
python配置文件写入过程详解
2019/10/19 Python
Pycharm修改python路径过程图解
2020/05/22 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
12月红领巾广播稿
2014/02/13 职场文书
推荐信模板
2014/05/09 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
实习协议书
2015/01/27 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis