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打开的数量的代码
Oct 17 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
一个简单的JS鼠标悬停特效具体方法
Jun 17 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
jquery操作checkbox示例分享
Jul 21 Javascript
JavaScript的RequireJS库入门指南
Jul 01 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
关于webuploader插件使用过程遇到的小问题
Nov 07 Javascript
Vue 组件修改根实例的数据的方法
Apr 02 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
Element Popover 弹出框的使用示例
Jul 26 Javascript
swiper4实现移动端导航栏tab滑动切换
Oct 16 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
我的群发邮件程序
2006/10/09 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
浅谈Python中copy()方法的使用
2015/05/21 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
python操作excel的方法
2018/08/16 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
欢迎家长标语
2014/10/08 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
失恋33天观后感
2015/06/11 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
手残删除python之后的补救方法
2021/06/26 Python
Python jiaba库的使用详解
2021/11/23 Python
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS