vue2.x学习笔记(十九)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12631022.html。
程序化的事件侦听器
在前面的学习中,我们已经知道了【$emit】全局属性的用法,它可以被【v-on】指令侦听,但是vue实例同时在其事件接口中提供了其他的方法,我们可以:
1.通过【$on(eventName, eventHandler)】侦听一个事件。
2.通过【$once(eventName, eventHandler)】一次性侦听一个事件。
3.通过【$off(eventName, eventHandler】停止侦听一个事件。
你通常不会用到这些,但是当你需要在一个组件实例上手动侦听事件的时候,它们是派的上用场的。它们也可以用于代码组织工具。例如,你可能经常看到这种继承一个第三方库的模式:
// 一次性将这个日期选择器附加到一个输入框上,它会被挂载到DOM上。
mounted: function () {
// Pikaday是一个第三方日期选择器的库
this.picker = new Pikaday({
field: this.$refs.input,
format: 'YYYY-MM-DD'
})
},
// 在组件被销毁之前,也销毁这个日期选择器。
beforeDestroy: function () {
this.picker.destroy()
}
这里会有两个潜在的问题:
1.它需要在这个组件实例中保存这个picker,如果可以的话,最好只有生命周期钩子可以访问到它。这并不算是严重的问题,但是它可以被视为杂物。
2.我们的建立代码独立于我们的清理代码,这使得我们比较难于程序化地清理我们建立的所有东西。
你应该要通过一个程序化的侦听器来解决这两个问题:
mounted: function () {
var picker = new Pikaday({
field: this.$refs.input,
format: 'YYYY-MM-DD'
})
this.$once('hook:beforeDestroy', function () {
picker.destroy()
})
}
这里的hook是组件名。使用了这个策略,我们甚至可以让多个输入框元素同时使用不同的pikaday,每个新的实例都能程序化地在后期清理它自己。
mounted: function () {
this.attachDatepicker('startDateInput')
this.attachDatepicker('endDateInput')
},
methods: {
attachDatepicker: function (refName) {
var picker = new Pikaday({
field: this.$refs[refName],
format: 'YYYY-MM-DD'
})
this.$once('hook:beforeDestroy', function () {
picker.destroy()
})
}
}
但是要注意的是,即便如此,如果你发现自己不得不在单个组件里做很多建立和清理的工作,最好的方式通常还是创建更多的模块化组件。因此在上面的这个例子中,官方文档推荐创建一个可复用的<input-datepicker>组件。
另外要注意的是,vue的事件系统并不同于浏览器的eventtarget api,尽管它们工作起来是类似的,但是【$emit】、【$on】和【$off】并不是【dispatchEvent】、【addEventListener】和【removeEventListener】的别名,底层实现也是不尽相同。
"我还是很喜欢你,像鲲鹏扶摇九万里,非梧不栖。"
vue2.x学习笔记(十九)的更多相关文章
- python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法
python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...
- (C/C++学习笔记) 十九. 模板
十九. 模板 ● 模板的基本概念 模板(template) 函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 语法: template <<模 ...
- Java基础学习笔记十九 IO
File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再 ...
- Java基础学习笔记十九 File
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
- JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)
1.跨域指的是什么? URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a. ...
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- SharpGL学习笔记(十九) 摄像机漫游
所谓的摄像机漫游,就是可以在场景中来回走动. 现实中,我们通过眼睛观察东西,身体移动带动眼睛移动观察身边的事物,这也是在漫游. 在OpenGL中我们使用函数LookAt()来操作摄像机在三维场景中进行 ...
- yii2源码学习笔记(十九)
view剩余代码 /** * @return string|boolean the view file currently being rendered. False if no view file ...
- PHP学习笔记十九【析构函数】
<?php class Person{ public $name; public $age; public function __construct($iname,$iage) { $this- ...
- JSTL 标签库 使用(web基础学习笔记十九)
标签库概要: 一.C标签库介绍 1.1.<c:> 核心标签库 JSTL 核心标签库(C标签)标签共有13个,功能上分为4类:1.表达式控制标签:out.set.remove.catch2 ...
随机推荐
- c++源文件从文本阶段到可执行文件的过程
过程分为四个阶段: 预处理阶段····>编译阶段····>汇编阶段····>链接阶段 1)预处理阶段:对源代码文件中的文件包含关系.预编译语句(宏定义)进行分析和替换,生成预编译文件 ...
- Unity 随机房间地图生成
无论是在迷宫还是类似于地牢的游戏地图中,利用程序来生成每次都不一样的地图是一件叫人兴奋不已的事. 这时我们需要解决两个非常重要的随机事件: 1.在一定范围内随机出各不相同但又不能互相重叠的房间 2.优 ...
- 微信公众平台 分享 关注 js功能代码
转上一篇文章 微信很火,微信推出的公众平台也吸引了一部分市场宣传推广团队,像冷笑话大全这种微博养粉大户在微信的公众平台也是异常火爆. 因工作需求,最近为我们的市场部做了几个微信公共平台下的页面,其中涉 ...
- python中的原地操作
什么是原地操作: 例子: 列表在append添加一个元素后,没有产生新副本,再次打印的时候多了一个值,这个appned就是原地操作 由此可见,原地操作有以下特点: 没有返回值(返回值为None) 改变 ...
- sql 模块 pymysql 数据库操作
1. 添加一个部门. import pymysql def main(): no = int(input('编号: ')) name = input('名字: ') loc = input('所在地: ...
- UITextFiled-集合目录
键盘弹起遮挡输入输入框(UITextFiled或者UITextView) 对于键盘弹起遮挡输入框的问题以前也想过解决办法比如:监听系统键盘弹出通知.根据每个控件所在 ...
- 安装myeclipse-10.7.1及注册解码
1.安装myeclipse-10.7.1 (1)百度云下载地址: http://pan.baidu.com/s/1dDwbI1b (2)按照默认安装路径安装myeclipse-10.7.1 默认安 ...
- 原生js弹力球
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 查找 mysql 配置文件 my.cnf
$ locate my.cnf 看看你的linux上有多少个my.cnf,一般都配置为/etc/my.cnf
- 家庭记账本app进度之关于tap的相关操作1
今天还主要学习关于怎样制作微信的先关的tap. 今天的主要成果是已经了解了相关的技术,以及相关的思路.代码经过一个下午的编写,基本接近尾声. 更详细的实验代码,以及相关的知识点将在明天完善后进行发表. ...