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 CSS 修改学习第四章 透明度设置
Feb 19 Javascript
基于jQuery架构javascript基础体系
Jan 01 Javascript
jquery实现标签上移、下移、置顶
Apr 26 Javascript
jquery插件hiAlert实现网页对话框美化
May 03 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
May 06 Javascript
全面理解闭包机制
Jul 11 Javascript
JavaScript职责链模式概述
Sep 17 Javascript
bootstrap table小案例
Oct 21 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
Jun 29 Javascript
JS实现移动端判断上拉和下滑功能
Aug 07 Javascript
基于Cesium绘制抛物弧线
Nov 18 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
php auth_http类库进行身份效验
2009/03/19 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python的类方法和静态方法
2014/12/13 Python
python对文件的操作方法汇总
2020/02/28 Python
python为什么会环境变量设置不成功
2020/06/23 Python
彻底解决Python包下载慢问题
2020/11/15 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
自我评价中英文语句
2013/11/30 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
营业员演讲稿
2013/12/30 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
市场推广策划方案
2014/06/02 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
无线电知识基础入门篇
2022/02/18 无线电
golang为什么要统一错误处理
2022/04/03 Golang