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中的函数
Jan 22 Javascript
js 优化次数过多的循环 考虑到性能问题
Mar 05 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
JS中的数组的sort方法使用示例
Jan 22 Javascript
node.js中的fs.truncate方法使用说明
Dec 15 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
jquery中EasyUI实现同步树
Mar 01 Javascript
微信小程序  Mustache语法详细介绍
Oct 27 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
Aug 20 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.MVC的模板标签系统(三)
2006/09/05 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
python实现微信远程控制电脑
2018/02/22 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Pandas的Apply函数具体使用
2020/07/21 Python
python中的django是做什么的
2020/07/31 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
协议书怎么写
2014/04/21 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
优秀教师推荐材料
2014/12/16 职场文书
大雁塔导游词
2015/02/04 职场文书
导游词之清晏园
2019/11/22 职场文书
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技