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 面向对象编程 万物皆对象
Sep 17 Javascript
js中的string.format函数代码
Aug 11 Javascript
JavaScript中的细节分析
Jun 30 Javascript
邮箱下拉自动填充选择示例代码附图
Apr 03 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
javascript鼠标滑动评分控件完整实例
May 13 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
还不懂递归?读完这篇文章保证你会懂
Jul 29 Javascript
mpvue将vue项目转换为小程序
Sep 30 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
Oct 29 Javascript
100行代码实现一个vue分页组功能
Nov 06 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
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
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
深入解析php中的foreach问题
2013/06/30 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python获取一组汉字拼音首字母的方法
2015/07/01 Python
pandas中去除指定字符的实例
2018/05/18 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
继承权公证书
2014/04/09 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
责任书范本
2014/08/25 职场文书
主题班会开场白
2015/06/01 职场文书
中学教师读书笔记
2015/07/01 职场文书