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 相关文章推荐
DOM精简教程
Oct 03 Javascript
模仿JQuery sortable效果 代码有错但值得看看
Nov 05 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
BootStrap的table表头固定tbody滚动的实例代码
Aug 24 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
JavaScript+CSS相册特效实例代码
Sep 07 Javascript
Javascript中的作用域及块级作用域
Dec 08 Javascript
浅谈React深度编程之受控组件与非受控组件
Dec 26 Javascript
代码详解javascript模块加载器
Mar 04 Javascript
Vue-cli配置打包文件本地使用的教程图解
Aug 02 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 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
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
php微信公众号开发之简答题
2018/10/20 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
Js 中debug方式
2010/02/07 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
微信小程序实现红包雨功能
2018/07/11 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
python join方法使用详解
2019/07/30 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
生日寿宴答谢词
2014/01/19 职场文书
超市创意活动方案
2014/08/15 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python