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 相关文章推荐
推荐40款强大的 jQuery 导航插件和教程(上篇)
Sep 14 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
基于jquery的手风琴图片展示效果实现方法
Dec 16 Javascript
Javascript中typeof 用法小结
May 12 Javascript
AngularJs concepts详解及示例代码
Sep 01 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
从0搭建vue-cli4脚手架
Jun 17 Javascript
浅谈vue中$bus的使用和涉及到的问题
Jul 28 Javascript
vuecli项目构建SSR服务端渲染的实现
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
php array_intersect()函数使用代码
2009/01/14 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
jQuery动画animate方法使用介绍
2013/05/06 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python实现身份证号码解析
2015/09/01 Python
Python IDLE入门简介
2017/12/08 Python
python素数筛选法浅析
2018/03/19 Python
python并发和异步编程实例
2018/11/15 Python
Python 画出来六维图
2019/07/26 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
学前班幼儿评语大全
2014/12/29 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
歌舞青春观后感
2015/06/10 职场文书
2015年教师节感言
2015/08/03 职场文书