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 单例/单体模式(Singleton)
Apr 07 Javascript
让AJAX不依赖后端接口实现方案
Dec 03 Javascript
javascript控制层显示或隐藏的方法
Jul 22 Javascript
javascript比较两个日期相差天数的方法
Jul 23 Javascript
开启Javascript中apply、call、bind的用法之旅模式
Oct 28 Javascript
js获取上传文件的绝对路径实现方法
Aug 02 Javascript
jQuery和JavaScript节点插入元素的方法对比
Nov 18 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
Nov 28 Javascript
jquery插件bootstrapValidator表单验证详解
Dec 15 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
原生js实现日历效果
Mar 02 Javascript
动态规划之使用备忘录来改进Javascript函数
Apr 07 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快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
javaScript call 函数的用法说明
2010/04/09 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python中一行和多行import模块问题
2018/04/01 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
详解Python字典的操作
2019/03/04 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
财务经理的岗位职责
2013/12/17 职场文书
实习生自我评价
2014/01/18 职场文书
挂靠协议书范本
2014/04/22 职场文书
领导班子整改措施
2014/10/24 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书