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编写COM组件的步骤
Mar 17 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
Jan 15 Javascript
JavaScript中的稀疏数组与密集数组[译]
Sep 17 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
Vue2.0如何发布项目实战
Jul 27 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
通过JS深度判断两个对象字段相同
Jun 14 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
Vue可自定义tab组件用法实例
Oct 24 Javascript
详解jQuery中的prop()使用方法
Jan 05 jQuery
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 Javascript
antd配置config-overrides.js文件的操作
Oct 31 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无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
actionscript与javascript的区别
2011/05/25 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python使用Matplotlib画条形图
2020/03/25 Python
Python2与Python3的区别实例总结
2019/04/17 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
个人求职信范例
2014/01/29 职场文书
安全责任书范文
2014/03/12 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
赔偿协议书
2015/01/27 职场文书
档案接收函格式
2015/01/30 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
上诉答辩状范文
2015/05/22 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书