自定义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 相关文章推荐
javaScript面向对象继承方法经典实现
Aug 20 Javascript
js onload事件不起作用示例分析
Oct 09 Javascript
JS中类或对象的定义说明
Mar 10 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
js在指定位置增加节点函数insertBefore()用法实例
Jan 12 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
May 04 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
May 28 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
详解Node.js串行化流程控制
May 04 Javascript
JS中cookie的使用及缺点讲解
May 13 Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 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中的Swoole
2016/04/05 PHP
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
python绘制直方图和密度图的实例
2019/07/08 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
培训自我鉴定
2014/01/31 职场文书
三查三看党性分析材料
2014/02/18 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
个人合伙协议书范本
2014/10/14 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
生产实习心得体会范文
2016/01/22 职场文书
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫