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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
javascript 事件绑定问题
Jan 01 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
对Angular.js Controller如何进行单元测试
Oct 25 Javascript
layui分页效果实现代码
May 19 Javascript
用React实现一个完整的TodoList的示例代码
Oct 30 Javascript
vue中实现左右联动的效果
Jun 22 Javascript
详解JSON Web Token 入门教程
Jul 30 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
Nov 20 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
一文了解Vue中的nextTick
May 06 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
用Flash图形化数据(一)
2006/10/09 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
微信小程序开发探究
2016/12/27 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
python使用matplotlib绘制柱状图教程
2017/02/08 Python
Python执行时间的计算方法小结
2017/03/17 Python
Python使用pymysql小技巧
2017/06/04 Python
Python实现随机漫步功能
2018/07/09 Python
Python os.access()用法实例
2019/02/18 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
python collections模块的使用
2020/10/16 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
100%羊绒:NakedCashmere
2020/08/26 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
消防安全责任书范本
2014/04/15 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
教师节座谈会主持词
2015/07/03 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android