vue通过指令(directives)实现点击空白处收起下拉框


Posted in Javascript onDecember 06, 2018

日常开发中有时会有这样的需求,就是展开下拉框的时候,通过点击空白处,可以实现让下拉框收回。这里我们通过vue2.0中的自定义指令来简单实现。

vue通过指令(directives)实现点击空白处收起下拉框

貌似截图尺寸有点大(???)

vue自定义指令

解释(参考官方文档)

除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

举例:

我们要让这样一个输入框在页面加载的时候获得焦点

vue通过指令(directives)实现点击空白处收起下拉框

我们可以注册自定义指令

全局注册:

// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
 // 当被绑定的元素插入到 DOM 中时……
 inserted: function (el) {
 // 聚焦元素
 el.focus()
 }
})

局部注册

//组件内
directives: {
 focus: {
 // 指令的定义
 inserted: function (el) {
 el.focus()
 }
 }
}

然后便可以在模板中相关元素上使用自定义的v-focus属性:(这里的v-focus是从自定义的focus得来的)

<input v-focus>

钩子函数(参考官方文档)

上面例子中我们用的钩子是inserted,这个是在被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
vue官方文档上有一些钩子可供我们参考使用:

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

通过自定义指令实现点击空白处隐藏下拉框

关于自定义指令,我们就不再多说了,下面我们来讲下如何通过指令来实现我们这个需求吧。

首先注册全局指令

// 一般在vue项目中的main.js中
// 添加点击空白处的指令
Vue.directive('click-outside', {
 bind: function (el, binding, vnode) {
 el.clickOutsideEvent = function (event) {
 // here I check that click was outside the el and his childrens
 if (!(el == event.target || el.contains(event.target))) {
 // and if it did, call method provided in attribute value
 vnode.context[binding.expression](event)
 }
 }
 document.body.addEventListener('click', el.clickOutsideEvent)
 },
 unbind: function (el) {
 document.body.removeEventListener('click', el.clickOutsideEvent)
 }
})

在需要监听的组件元素上添加自定义指令

// 这里的clickOutSide是在监听到点击的不是
<input id="dropdown1" v-show="flag" v-click-outside="clickOutSide" />

这个id为dropdown1的元素当监听到点击的不是自身的时候,就会触发clickOutSide方法。

在组件里定义响应方法

// 点击空白处使topBar隐藏
 clickOutSide() {
 this.flag = false;
 },

这样就可以实现类似文章开头的那种效果。

是不是很简单哦? 关于指令还有很多比较简便的用法,各位可以自己去研究下哦。

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

Javascript 相关文章推荐
原创javascript小游戏实现代码
Aug 19 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
Sep 29 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
Angular模板表单校验方法详解
Aug 11 Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 Javascript
layui实现tab的添加拒绝重复的方法
Sep 04 Javascript
jquery中attr、prop、data区别与用法分析
Sep 25 jQuery
微信小程序之左右布局的实现代码
Dec 13 Javascript
JavaScript DOM常用操作代码汇总
Jul 03 Javascript
谈谈JavaScript令人迷惑的==与+
Aug 31 Javascript
Vue ​v-model相关知识总结
Jan 28 Vue.js
Vue-CLI3.x 设置反向代理的方法
Dec 06 #Javascript
JavaScript中引用vs复制示例详析
Dec 06 #Javascript
使用jQuery动态设置单选框的选中效果
Dec 06 #jQuery
express+vue+mongodb+session 实现注册登录功能
Dec 06 #Javascript
如何使用puppet替换文件中的string
Dec 06 #Javascript
详解vantUI框架在vue项目中的应用踩坑
Dec 06 #Javascript
基于element-ui组件手动实现单选和上传功能
Dec 06 #Javascript
You might like
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
浅析jQuery1.8的几个小变化
2013/12/10 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
在Django的通用视图中处理Context的方法
2015/07/21 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
PHP统计代码行数的小代码
2019/09/19 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
网络安全方面的面试题
2015/11/04 面试题
公务员年总结的自我评价
2013/10/25 职场文书
护士实习鉴定范文
2013/12/22 职场文书
高中班级口号
2014/06/09 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
机械操作工岗位职责
2014/08/08 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
客服专员岗位职责
2015/02/10 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
postgresql中如何执行sql文件
2023/05/08 PostgreSQL