浅谈Vue.js 组件中的v-on绑定自定义事件理解


Posted in Javascript onNovember 17, 2017

每个 Vue 实例都实现了事件接口(Events interface),即:

使用 $on(eventName) 监听事件

使用 $emit(eventName) 触发事件

Vue的事件系统分离自浏览器的EventTarget API。尽管它们的运行类似,但是$on 和 $emit 不是addEventListener 和 dispatchEvent 的别名。

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

下面是一个文档上面的例子:

2017年4月11日更新

<div id="counter-event-example">
 <p>{{ total }}</p>
 <button-counter v-on:increment="incrementTotal"></button-counter>
 <button-counter v-on:increment="incrementTotal"></button-counter>
</div>


Vue.component('button-counter', {
 template: '<button v-on:click="increment">{{ counter }}</button>',
 data: function () {
  return {
   counter: 0
  }
 },
 methods: {
  increment: function () {
   this.counter += 1
   this.$emit('increment')
  }
 },
})
new Vue({
 el: '#counter-event-example',
 data: {
  total: 0
 },
 methods: {
  incrementTotal: function () {
   this.total += 1
  }
 }
})

跟着这个例子我来谈谈理解,更新以前我那种错误的思想

先画出理解的步骤,跟着步骤来进行理解

浅谈Vue.js 组件中的v-on绑定自定义事件理解

步骤1:

大家先看到这里,其实在步骤4里面的自定义标签经过渲染之后是变成了如 步骤一 一样的代码,所以我们应该从这里入手理解父子组件间事件绑定。在子组件里面把点击事件(click)绑定给了函数increment(即图片里面的步骤2),这里容易理解,即点击了子组件的按钮将会触发位于子组件的increment函数

步骤2与步骤3:

increment函数被触发执行,在步骤2里面执行了一句调用函数的语句

this.$emit('increment')

我们来看一下文档

vm.$emit( event, […args] ) : 触发当前实例上的事件。附加参数都会传给监听器回调

在这里是什么意思呢?按我自己的大白话就是这样说的:

通过这句函数可以让父组件知道子组件调用了什么函数,this.$emit(‘increment') 即类似于子组件跟父组件说了一声“hi,爸爸 我调用了我自己的increment函数”,通知父组件

步骤4:

回看一下在父组件里面定义的自定义标签,可以看到

v-on:increment="incrementTotal"

什么意思呢?我们还是用大白话来解释一下

就是说“孩子,当你调用了increment函数的时候,我将调用incrementTotal函数来回应你”

这时我们回想步骤3,在子组件我们已经使用emit来进行通知,所以,这样就形成父子组件间的相互呼应传递信息,其实在开发的过程中父子组件通讯也都是使用这样的方法,父组件传递信息给子组件的时候会通过props参数,通常不会直接在子组件中修改父组件传递下来的信息,而且通过这样的一个钩子去通知父组件对某些参数进行改变

步骤5:

这个就容易理解了,上一版本是本人在初学的时候写的所以思维很不严谨,抱歉,欢迎大家指导批评

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery tools之tooltip
Jul 25 Javascript
jquery dialog键盘事件代码
Aug 01 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
jquery取子节点及当前节点属性值的方法
Sep 09 Javascript
jquery插件ContextMenu设置右键菜单
Mar 13 Javascript
slideToggle+slideup实现手机端折叠菜单效果
May 25 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 Javascript
你可能不知道的JSON.stringify()详解
Aug 17 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
微信小程序 动画的简单实例
Oct 12 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
详解关于Vuex的action传入多个参数的问题
Feb 22 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
Nov 17 #Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
Nov 17 #Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 #Javascript
在 Node.js 中使用 async 函数的方法
Nov 17 #Javascript
JS实现的数组去除重复数据算法小结
Nov 17 #Javascript
bootstrap轮播模板使用方法详解
Nov 17 #Javascript
浅谈Node模块系统及其模式
Nov 17 #Javascript
You might like
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
python妹子图简单爬虫实例
2015/07/07 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
Python中django学习心得
2017/12/06 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Django 路由控制的实现代码
2018/11/08 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python之生产者消费者模型实现详解
2019/07/27 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
Django的CVB实例详解
2020/02/10 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Python 如何对文件目录操作
2020/07/10 Python
python开发入门——set的使用
2020/09/03 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
广州迈达威.net面试题目
2012/03/10 面试题
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
经营管理策划方案
2014/05/22 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
大学学生会竞选稿
2015/11/19 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL