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 相关文章推荐
IE8 浏览器Cookie的处理
Jan 31 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
JavaScript原生对象之Date对象的属性和方法详解
Mar 13 Javascript
javascript实现五星评价代码(源码下载)
Aug 11 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
Mar 25 Javascript
Javascript打印局部页面实例
Jun 21 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
Oct 17 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
Feb 13 jQuery
详解开发react应用最好用的脚手架 create-react-app
Apr 24 Javascript
Vue路由history模式解决404问题的几种方法
Sep 29 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
Jan 29 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
node.js基础知识小结
2018/02/26 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
在python中做正态性检验示例
2019/12/09 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
英国在线药房:Express Chemist
2019/03/28 全球购物
农场厂长岗位职责
2013/12/28 职场文书
出纳员岗位职责
2014/03/13 职场文书
社区娱乐活动方案
2014/08/21 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers