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 相关文章推荐
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
May 11 Javascript
js正则表达式中test,exec,match方法的区别说明
Jan 29 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
Apr 12 Javascript
使用原生js写ajax实例(推荐)
May 31 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
Jun 11 jQuery
简单实现js放大镜效果
Jul 24 Javascript
微信小程序实现弹出菜单
Jul 19 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
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针对数字的加密解密类
2014/03/20 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
python基础教程之缩进介绍
2014/08/29 Python
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
Python下载指定页面上图片的方法
2016/05/12 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
茶叶生产计划书
2014/01/10 职场文书
司马光教学反思
2014/02/01 职场文书
核心价值观演讲稿
2014/05/13 职场文书
2014年计生标语
2014/06/23 职场文书
2014年统计工作总结
2014/11/21 职场文书
小学生作文评语集锦
2014/12/25 职场文书
宣传委员竞选稿
2015/11/19 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
新手初学Java网络编程
2021/07/07 Java/Android