自定义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 相关文章推荐
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
Dec 02 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
Dec 14 Javascript
在Javascript里访问SharePoint列表数据的实现方法
May 22 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
May 14 Javascript
js中的前绑定和后绑定详解
Aug 01 Javascript
jQuery中index()方法用法实例
Dec 27 Javascript
10个JavaScript中易犯小错误
Feb 14 Javascript
jQuery Validate插件自定义验证规则的方法
Dec 27 Javascript
基于vue中对鼠标划过事件的处理方式详解
Aug 22 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
Nov 07 Javascript
如何使用CocosCreator对象池
Apr 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
PHP 批量删除 sql语句
2009/06/05 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
Stop SQL Server
2007/06/21 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
js自定义回调函数
2015/12/13 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
详解Python的Django框架中的templates设置
2015/05/11 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
高三自我鉴定
2013/10/23 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
我的画教学反思
2014/04/28 职场文书
2014年学习部工作总结
2014/11/12 职场文书
公司食堂管理制度
2015/08/05 职场文书
医院病假条范文
2015/08/17 职场文书
八年级历史教学反思
2016/02/19 职场文书
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
2022年显卡天梯图(6月更新)
2022/06/17 数码科技