自定义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是否可以跨文件同时控制多个iframe页面的应用技巧
Dec 16 Javascript
javascript中&quot;/&quot;运算符常见错误
Oct 13 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
Mar 03 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
Jul 03 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
Javascript浅谈之引用类型
Dec 18 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
基于vue.js实现侧边菜单栏
Mar 20 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
Dec 25 Javascript
妙用缓存调用链实现JS方法的重载
Apr 30 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
Sep 06 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
php文件上传的简单实例
2013/10/19 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
ionic实现底部分享功能
2017/05/11 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
python3如何将docx转换成pdf文件
2018/03/23 Python
在双python下设置python3为默认的方法
2018/10/31 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
汇智创新科技发展有限公司
2015/12/06 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
会计工作心得体会
2014/01/13 职场文书
离婚起诉书范本
2015/05/18 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
Mysql中存储引擎的区别及比较
2021/06/04 MySQL