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 相关文章推荐
jQuery中click事件用法实例
Dec 26 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
JavaScript代码判断点击第几个按钮
Dec 13 Javascript
js实现非常棒的弹出div
Oct 06 Javascript
详解vue2.0组件通信各种情况总结与实例分析
Mar 22 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
JS模拟超市简易收银台小程序代码解析
Aug 18 Javascript
自定义vue组件发布到npm的方法
May 09 Javascript
如何让微信小程序页面之间的通信不再变困难
Jun 03 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 Javascript
JS中循环遍历数组的四种方式总结
Jan 23 Javascript
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
是否存在第一台收音机的说法
2021/03/01 无线电
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
php PDO异常处理详解
2016/11/20 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
详解js类型判断
2018/05/22 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
Python实现读取并保存文件的类
2017/05/11 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
校园报刊亭创业计划书
2014/01/02 职场文书
求职信标题怎么写
2014/05/26 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
质检员工作总结2015
2015/04/25 职场文书
专项资金申请报告
2015/05/15 职场文书
大学生入党群众意见书
2015/06/02 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
MySQL基于索引的压力测试的实现
2021/11/07 MySQL
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技
Java数组详细介绍及相关工具类
2022/04/14 Java/Android
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers