二、组件设计

接下来是开发选择框组件,首先需要自定义一个点击外部使下拉菜单关闭的指令:

export default {bind(el, binding, vnode) {function documentHandler(e) {if (el.contains(e.target)) {return false;}if (binding.expression) {binding.value(e);}}el.__vueClickOutside__ = documentHandler;document.addEventListener('click', documentHandler);},unbind(el, binding) {document.removeEventListener('click', el.__vueClickOutside__);delete el.__vueClickOutside__;}
}

使用方法很简单,在需要该指令的组件中:

import clickoutside from '../directives/clickoutside'

然后申明该指令:

directives: {clickoutside
}

使用的时候就像这样给他一个事件函数:

v-clickoutside="dosomething"

2)开发下拉框组件

首先考虑到下拉菜单的数据双向绑定,而且分为单选和多选两种情况,所以使用v-model来绑定数据,同时添加一个multiple的布尔类型数据:

<template><div class="my-select"></div>
</template><script>
import emitter from '../mixins/emitter'
import clickoutside from '../directives/clickoutside'export default {name: 'mySelect',mixins: [emitter],directives: {clickoutside},props: {value: {type: [String, Array]},multiple: {type: Boolean,default: false}},model: {prop: 'value',event: 'change'},data() {return {focus: false,show: true}}
}
</script>

多选的情况下还需要引入一个tag组件:

<template><span class="my-tag"><slot></slot><i class="fa fa-times-circle" v-show="closeable" @click="closeHandler"></i></span>
</template><script>
import emitter from "../mixins/emitter";export default {name: "myTag",mixins: [emitter],props: {closeable: {type: Boolean,default: false},closeHandler: {type: Function,default: () => () => {}}}
};
</script><style lang="scss" scoped>
.my-tag {border: 1px solid black;border-radius: 2px;padding: 0 2px;> .fa-times-circle {cursor: pointer;&:hover {color: red;}}
}
</style>

它看起来像是这个样子的:

需要注意的是,如果下拉菜单有需要带默认值的情况,需要在数据加载的时候根据v-model的value值去查找对应的label文本,特别是单选的情况。这里有一个坑要注意一下,一般我们在做对应查找的时候为了方便会直接把值放到数组的对应位置,然而vue的双向数据绑定无法捕捉到数组索引位置发生的变化,因此需要先放到一个临时数组里,在遍历完成的时候再赋值:

init() {
if (this.multiple) {
let tmpLabel = [];
this.$children.forEach(child => {if (child.$options.name === "myOption") {let index = this.value.indexOf(child.value);if (index !== -1) {tmpLabel[index] = child.myLabel;}}
});
this.label = tmpLabel;
} else {
this.$children.forEach(child => {if (child.$options.name === "myOption" &&child.value === this.value) {this.label = child.myLabel;}
});
}
}

3)组装下拉菜单

下拉框是整个组件中起到承上启下的作用,先上进行双向数据绑定,向下控制选项的状态,其核心代码如下:

this.$on("option-click", (selected, label, value) => {if (this.multiple) {if (selected) {this.broadcast("myOption", "cancel", value);let index = this.value.indexOf(value);if (index !== -1) {let tmpValue = this.value;tmpValue.splice(index, 1);this.$emit("change", tmpValue);this.label.splice(index, 1);}} else {this.broadcast("myOption", "select", value);this.$emit("change", [...this.value, value]);this.label.push(label);}} else {if (!selected) {if (this.value) {this.broadcast("myOption", "cancel", this.value);}this.broadcast("myOption", "select", value);this.$emit("change", value);this.label = label;this.show = false;}}
});

最后演示一下功能,样式是随便写的emmmm...

源码下载(需要自己装包):https://files.cnblogs.com/files/viewts/dropdown.zip

转载于:https://www.cnblogs.com/viewts/p/11418859.html

使用vue来开发一个下拉菜单组件(2)相关推荐

  1. 使用vue来开发一个下拉菜单组件(1)

    一.新建demo工程 vue init webpack-simple demo 添加src/mixins/emitter.js文件(见前几篇博文) 安装font-awesome字体库: cnpm in ...

  2. android studio 下拉菜单,怎么在android studio中使用Spinner实现一个下拉菜单

    怎么在android studio中使用Spinner实现一个下拉菜单 发布时间:2021-03-23 14:56:15 来源:亿速云 阅读:92 作者:Leah 这期内容当中小编将会给大家带来有关怎 ...

  3. Bootstrap学习-详解Bootstrap下拉菜单组件

    转载:https://www.cnblogs.com/jnslove/p/5421187.html bootstrap框架中的下拉菜单组件是一个独立的组件,根据不同的版本,他对应的文件: less 对 ...

  4. 用vue去实现百度下拉菜单

    在我们学习ajax的时候一定要做的例子就是下拉菜单了吧?为什么?因为当你输入一个值的时候下面的div里面会无刷新的去加入数据,当时的实现也是挺难的,反正比下面的vue实现难...下面我们来看看vue( ...

  5. vue项目实录:下拉刷新组件的开发及slot的使用

    "下拉刷新"和"上滑加载更多"功能在前端.尤其是移动端项目中非常重要,这里笔者由曾经做过的vue项目中的"blink"功能和各位探讨下[下拉 ...

  6. flutter实现一个下拉菜单【基于PopupMenuButton】

    提示 已将代码上传至gitee,后续会继续更新学习封装的一些组件: flutter练习 实现效果 实现过程 1.封装菜单子项MenuItem /// @author longzipeng /// @创 ...

  7. 小程序下拉菜单组件(含多层筛选)

    图例中筛选是另外一个组件 一般在筛选的场景中需要使用下拉菜单,动态设置筛选条件,比如淘宝,京东的产品筛选列表,携程的旅游目的地的筛选列表. 支持 配置化设置弹层内容 支持动态刷新弹层内容 支持动态修改 ...

  8. Bootstrap下拉菜单组件

    组件的功能是帮助我们的网页实现一些功能,我们可以引用的是Bootstrap中的下拉菜单.我们来看看下拉组件中常用到的一些的功能: 下拉菜单的实现: <div class="dropdo ...

  9. uView下拉菜单组件u-dropdown设置高度并防止滑动穿透

    一.出现的问题: u-dropdown内容自定义时设置高度,滑动时会带动父级,真机滑动会出现问题 这时就需要处理两个问题: 定义内容时设置高度并设置可滑动,可以配合scroll-view组件使用 处理 ...

最新文章

  1. MDT 2010之部署Windows XP-5
  2. hadoop配置安装
  3. python123第九周测验答案2020_运用python123平台助力编程课教学
  4. 高手整理培训笔记(服务篇)
  5. 元类被称为 Python 中的“深奥的巫术“
  6. C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
  7. Linux采用服务器网址,Linux实现https方式访问站点
  8. 从数据到代码——通过代码生成机制实现强类型编程[上篇]
  9. Spring 常用注解@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
  10. 人脉网中应该具备的10种人
  11. spring学习之spring框架介绍
  12. 计算机桌面上的图标如何删除,怎么删除电脑桌面上的图标啊?
  13. 我看大学培训机构--大学生到底要不要参加培训机构 一个参加培训的大学生的真实感受
  14. Echarts 3d地球toolstips实现
  15. LowB三人组--插入排序原理和java实现
  16. threw ‘java.lang.NullPointerException‘ exception // toString()
  17. 细侃那些悬而未决的数学趣味谜题
  18. Windows 10 使用小鹤双拼
  19. Prometheus源码学习(8) scrape总体流程
  20. 吉大20春学期C语言程序设计作业二,c语言程序设计 教学课件 ppt 作者 吉大17秋学期《C语言程序设计》作业一...

热门文章

  1. 韩顺平 php 聪明的小猫代码,聪明的小猫作文150字
  2. 为什么这么多人看衰php,很多人都在看衰的SEO出路在哪儿?
  3. 【OpenCV】OpenCV函数精讲之 -- 多通道图像混合
  4. CVPR2021 | 北航商汤耶鲁口头报告
  5. PyTorch | 通过torch.eye创建单位对角矩阵 | torch.eye()如何使用?torch.eye()例子 | torch.eye()使用方法
  6. php狼和兔子算法,PHP基于递归算法解决兔子生兔子问题php技巧
  7. CVTE【嵌入式应用开发】【软件技术支持】面经【已拿offer】
  8. zbrush常用笔刷_如何制作精细模型,ZBrush中常用笔刷介绍
  9. Ubuntu终极指南
  10. 信安教程第二版-第18章网络安全测评技术与标准