自定义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 相关文章推荐
prototype.js的Ajax对象
Sep 23 Javascript
Dojo 学习要点
Sep 03 Javascript
GRID拖拽行的实例代码
Jul 18 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
纯js实现倒计时功能
Jan 06 Javascript
Node.js制作简单聊天室
Jan 12 Javascript
Vue 自适应高度表格的实现方法
May 13 Javascript
关于vue的列表图片选中打钩操作
Sep 09 Javascript
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
使用compose函数优化代码提高可读性及扩展性
Jun 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过滤★等特殊符号的正则
2014/01/27 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
基于python绘制科赫雪花
2018/06/22 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
高校教师思想汇报
2014/01/11 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
会员活动策划方案
2014/08/19 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
Redis实现分布式锁的五种方法详解
2022/06/14 Redis
element tree树形组件回显数据问题解决
2022/08/14 Javascript