Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)


Posted in Javascript onMay 30, 2017

在开发过程中,为了效果好看,往往需要自己开发一个下拉列表,而不是使用 HTML 自身的 select 下拉列表。然而当编写自定义下拉列表的时候,就会碰到一个问题:如果用户在下拉列表的范围外进行鼠标点击的操作,如何关闭已经打开的下拉列表?

解决思路如下:在 DOM 的根节点上添加一个 click 事件,同时下拉列表内阻止事件的默认行为和冒泡。当响应这个点击事件的时候,说明是在下拉列表范围外的点击(因为下拉列表内阻止了事件的冒泡),就可以关闭已经打开的下拉列表。

如果是纯 JS 代码,有人可能会使用 document.onclick 来添加根节点事件。不过,我现在使用 Vue.js,会选择使用 Vue.js 的方式处理这个问题。

Vue.js 使用组件化的方式组织代码,会有一个根组件,可以在这个根组件上加上 @click 事件,来响应区域外的点击事件。在一个完整的应用中,可能有多种场景需要这种区域外点击关闭的功能。除了最普通的表单里的下拉列表外,还可能是网站右上角的消息提示框,或者菜单。比较合适的做法是把点击事件的具体处理逻辑放到各个组件中去。

那么如何让各个子组件响应根组件上的点击事件呢?可以使用Vuex来做到这一点。在这里 Vuex 起到了组件之间互相传递信息的作用。

读者可以在这个网址下载我编写的 Demo 项目:

推荐读者使用 yarn install 安装所需的依赖。

下面说一下关键代码:

程序入口 main.js:

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import routes from './router'
import VueSuperagent from 'vue-superagent'
import Vuex from 'vuex'
import 'babel-polyfill';
import store from './vuex/store';
Vue.use(VueRouter);
Vue.use(VueSuperagent);
Vue.use(Vuex);
const router = new VueRouter({
 mode: 'history',
 routes
})
new Vue({
 el: '#app',
 router,
 store,
 render: h => h(App)
})

根节点 App.vue,添加了点击事件。

<template>
 <div @click="clickRoot">
  <router-view></router-view>
 </div>
</template>
<script>
  export default {
    methods:{
      clickRoot(event){
        this.$store.dispatch("clickRootNumAction", 1);
      }
    }
  }
</script>

以上所述是小编给大家介绍的Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript RadioButtonList获取选中值
Apr 09 Javascript
Javascript中判断变量是数组还是对象(array还是object)
Aug 14 Javascript
JS简单实现元素复制示例附图
Nov 19 Javascript
AngularJS入门教程(一):静态模板
Dec 06 Javascript
触屏中的JavaScript事件分析
Feb 06 Javascript
js获取指定字符前/后的字符串简单实例
Oct 27 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 Javascript
angular6的table组件开发的实现示例
Dec 26 Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 Javascript
JS给按钮添加跳转功能类似a标签
May 30 #Javascript
jQuery异步提交表单实例
May 30 #jQuery
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
May 30 #Javascript
Angularjs中使用轮播图指令swiper
May 30 #Javascript
AngularJS路由Ui-router模块用法示例
May 29 #Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 #Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 #Javascript
You might like
模仿OSO的论坛(四)
2006/10/09 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
动态调用CSS文件的JS代码
2010/07/29 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
浅谈Vue.js
2017/03/02 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
python的keyword模块用法实例分析
2015/06/30 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
flask session组件的使用示例
2018/12/25 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Python @property装饰器原理解析
2020/01/22 Python
Python如何通过百度翻译API实现翻译功能
2020/04/02 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
Python下载的11种姿势(小结)
2020/11/18 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
资产经营总监岗位职责
2013/12/04 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android