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 相关文章推荐
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 Javascript
jQuery实现带分组数据的Table表头排序实例分析
Nov 24 Javascript
jQuery滚动加载图片实现原理
Dec 14 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
Mar 28 Javascript
基于BootStrap的文本编辑器组件Summernote
Oct 27 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
详解webpack 最简打包结果分析
Feb 20 Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 Javascript
Preload基础使用方法详解
Feb 03 Javascript
Javascript中的解构赋值语法详解
Apr 02 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
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
推荐:极酷右键菜单
2006/11/29 Javascript
wordpress之js库集合研究介绍
2007/08/17 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
C# .NET面试题
2015/11/28 面试题
2014年会演讲稿范文
2014/01/06 职场文书
药学职务聘任书
2014/03/29 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
2019年教师入党申请书
2019/06/27 职场文书
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS