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 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
url 特殊字符 传递参数解决方法
Jan 01 Javascript
jquery tab插件制作实现代码
Jun 22 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
Oct 10 Javascript
js工具方法弹出蒙版
May 08 Javascript
删除Javascript Object中间的key
Nov 18 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
jQuery插件实现可输入和自动匹配的下拉框
Oct 24 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
Jan 31 Javascript
ES6 Promise对象概念及用法实例详解
Oct 15 Javascript
vue实现瀑布流组件滑动加载更多
Mar 10 Javascript
Vue filter 过滤器、以及在table中的使用介绍
Sep 07 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/03 冲泡冲煮
php中iconv函数使用方法
2008/05/24 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
php微信开发之图片回复功能
2018/06/14 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
JS 建立对象的方法
2007/04/21 Javascript
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
chrome调试javascript详解
2015/10/21 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
python实战教程之自动扫雷
2018/07/13 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
Python常用类型转换实现代码实例
2020/07/28 Python
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
2014-2015学年工作总结
2014/11/27 职场文书
综合测评自我评价
2015/03/06 职场文书
公司人力资源管理制度
2015/08/05 职场文书
党员心得体会范文2016
2016/01/23 职场文书