1.最近需要做一个移动端多选的功能,发现vant上没有多选的下拉组件,于是决定写一个,样式如下

调用部分传入值

props
select-data-opts 传入list数据,
disabled 下拉是否可用
checkedList 默认选中数据
selectName 下拉菜单名称

event
selectMutiple 选中和确定时的回调函数,注意在回调方法里修改selectname
 <select-multiple :select-data-opts="supplierGetSupplierInfoOptsMixins" :disabled="selectDisabled" :checked-list="checked" :select-name="selectName" @selectMutiple="selectMutiple" />

2.基于 DropdownMenu的样式写的所以该组件没使用,但是需要存在,代码比较简单,可以直接使用

SelectMultiple.vue

<template>
<div>
<div class="van-dropdown-menu">
<div class="van-dropdown-menu__bar van-dropdown-menu__bar--opened">
<div role="button" tabindex="0" class="van-dropdown-menu__item">
<span class="van-dropdown-menu__title" :class="[ showSelectMultiple ? 'van-dropdown-menu__title--active van-dropdown-menu__title--down' : '' ]" @click="selectActive()">
<div class="van-ellipsis">{{ selectName }}</div>
</span>
<div v-if="showSelectMultiple" class="btn_left">
<span v-if="!all" @click="toggleAll()">全选</span>
<span v-if="all" @click="toggleFalseAll()">取消全选</span>
</div>
<div v-if="showSelectMultiple" class="btn_true" @click="submitSelect()">确定</div>
</div>
</div>
</div>
<div v-if="showSelectMultiple" class="van-dropdown-item van-dropdown-item--down" style="top: 40.9531px;">
<div class="van-overlay" style="z-index: 2005; position: absolute; animation-duration: 0.2s;" />
<div ref="content" class="van-popup van-popup--top van-dropdown-item__content" style="transition-duration: 0.2s; z-index: 2006; position: relative; "> <van-checkbox-group v-model="checked" res="checkboxGroup" @change="selectDataOptsChange">
<div v-for="(item,index) in selectDataOpts" :key="item.value" role="button" :tabindex="index" class="van-cell van-cell--clickable van-dropdown-item__option">
<div class="van-cell__title">
<span>
<van-checkbox :name="item.value" checked-color="#A9B910">{{ index+1 }}.{{ item.text }}</van-checkbox></span>
</div>
</div>
<!-- <div class="footer_btn">
<div class="btn_d" @click="cancelSelect()">取消</div>
<div class="btn_d btn_cur" @click="submitSelect()">确定</div>
</div> -->
<!-- <div class="blank">&nbsp;</div> -->
</van-checkbox-group> </div> </div>
</div>
</template>
<script >
import { Checkbox, CheckboxGroup, DropdownMenu, DropdownItem } from 'vant'
export default {
name: 'CopyCode',
components: {
VanCheckbox: Checkbox,
VanCheckboxGroup: CheckboxGroup,
// eslint-disable-next-line
VanDropdownMenu: DropdownMenu,
// eslint-disable-next-line
VanDropdownItem: DropdownItem
},
props: {
selectName: {
type: String,
default: '全部'
},
disabled: {
type: Boolean,
default: false
},
otherName: {
type: String,
default: '供应商'
},
checkedList: {
type: Array,
default: function() { return [] }
},
selectDataOpts: {
type: Array,
default: function() { return [] }
}
// showSelectMultiple: {
// type: Boolean,
// default: false
// }
},
data() {
return {
showSelectMultiple: false,
checked: [],
all: false
}
},
mounted() {
this.checked = this.checkedList
},
methods: {
selectActive() {
if (this.disabled) {
return
}
this.showSelectMultiple = !this.showSelectMultiple
},
toggleAll() {
const data = []
for (let i = 0; i < this.selectDataOpts.length; i++) {
data.push(this.selectDataOpts[i].value)
}
this.all = true
this.checked = data
},
toggleFalseAll() {
this.all = false
this.checked = []
},
submitSelect() {
this.showSelectMultiple = false
this.selectNameData()
},
cancelSelect() {
this.showSelectMultiple = false
},
selectDataOptsChange(data) {
this.selectNameData()
},
selectNameData() {
if (!this.checked.length || this.selectDataOpts.length === this.checked.length) {
this.$emit('selectMutiple', { checked: this.checked, name: '全部' + this.otherName })
} else {
this.$emit('selectMutiple', { checked: this.checked, name: '已选中(' + this.checked.length + ')' + this.otherName })
}
},
onCopy() {
},
onError() {
} }
}
</script>
<style lang="scss" scoped>
.copy{
font-size:14px;
}
.blank{
position: relative;
width:100%;
height:60px;
}
.btn_true{
width:60px;
height:30px;
border-radius: 5px;
background-color:#A2C14D;
color:#fff;
position: absolute;
text-align:center;
line-height:30px;
right:10px;
font-size:14px;
top:10px;
}
.btn_left{
width:60px;
height:30px;
position: absolute;
text-align:center;
line-height:30px;
left:10px;
font-size:14px;
top:10px;
}
.block_content{
width:100%;
}
.flex_bottom{
position: absolute ;
bottom:-10px;
left:0;
}
</style>

vant实现下拉多选组件的更多相关文章

  1. bootstrap-select 下拉多选组件

    <div class="form-group"> <label class="col-lg-2 col-sm-2 control-label" ...

  2. angular2.x 下拉多选框选择组件

    angular2.x - 5.x 的下拉多选框选择组件 ng2 -- ng5.最近在学angular4,经常在交流群看见很多人问 下拉多选怎么做... 今天就随便写的个. 组件源码 百度云   链接: ...

  3. Easyui datagrid combobox输入框下拉(取消)选值和编辑已选值处理

    datagrid combobox输入框下拉(取消)选值和编辑已选值处理 by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3   需求场景 如下,在datagri ...

  4. 自定义实现 PyQt5 下拉复选框 ComboCheckBox

    一.前言 由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下 ...

  5. 我的第一个jquery插件:下拉多选框

    <!DOCTYPE HTML> <html> <head> <title> New Document </title> <meta n ...

  6. Jqure实现下拉多选

    Web ")                 {                     try                     {                          ...

  7. multiSelect 下拉多选插件

    multiSelect是一款很好用的下拉多选插件,可以在下拉框中实现多选框,全选及取消全选等方法.使用方法:1.引用 multiSelect.css及 multiSelect.js.下载地址 http ...

  8. Unity3D UGUI下拉菜单/Dropdown组件用法、总结

    Unity3D中UGUI实现下拉菜单 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  9. 用vue写一个仿app下拉刷新的组件

    如果你用vue弄移动端的页面,那么下拉刷新还是比较常见的场景,下面来研究如何写一个下拉刷新的组件(先上图); 由于节省大家的时间,样式就不贴出来了. html结构也不必介绍了,直接看代码吧-.- &l ...

随机推荐

  1. zstd和zip操作6g的文本

    ssd是在固态硬盘上的时间 1.txt   7038308223 bytes 都是默认级别 ======================================== zstd-v1.4.4-w ...

  2. vue-cli3.0 vue脚手架3.0的使用

    1.安装vue-cli 3.0 npm install -g @vue/cli # or yarn globaladd @vue/cli 安装成功后查看版本:vue -V(大写的V)     2.命令 ...

  3. 据说是最好的记忆工具——Anki

    http://www.ankichina.net/ .u1s1,确实挺好用,自建题库,全程自助. 可以插入文字.图片.音频,会安排合理的复习频率,可以随时同步,电脑手机版本全.

  4. TDengine能比Hadoop快10倍?

    之前对国产的时序大数据存储引擎 TDengine 感兴趣,因为号称比Hadoop快十倍,一直很好奇怎么实现的,所以最近抽空看了下白皮书和设计文档. 如果用一句话总结,就是 TDengine 是为特定的 ...

  5. WPF实现手势解锁

    桌面程序的解锁方式一般是账号密码,互联网的可以使用扫码解锁,甚至人脸识别.但扫码需要网络,人脸识别又较复杂.所以就想把安卓常用的手势解锁移植到桌面程序上. 先来张效果图,有兴趣的往下看,没兴趣的打扰了 ...

  6. 干货 | 45张图庖丁解牛18种Queue,你知道几种?

    在讲<21张图讲解集合的线程不安全>那一篇,我留了一个彩蛋,就是Queue(队列)还没有讲,这次我们重点来看看Java中的Queue家族,总共涉及到18种Queue.这篇恐怕是市面上最全最 ...

  7. vue实现侧边导航栏

    <div class="sidebar"> <el-menu class="sidebar-el-menu" :default-active= ...

  8. Eclipse插件打开编辑器

    今天终于可以闲一天,想来想去就乱写点东西吧,说不定对有些新人有点帮助呢-_- 用Eclipse API的方式来打开编辑器,可能对任何一个插件开发者都不是很陌生的操作了.但是,还是建议你忍着看一下,全当 ...

  9. JDK8(jdk-8u212-windows-x64) 下载 安装 及设置

    JDK8 下载页面 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 19.8.2 ...

  10. PHP对象传值 - 引用传值

    对象传值本质上是引用传值,将一个对象变量($a)赋值给另个变量($b),实际上是将$a存储的对象内存引用地址赋值$b,此时两个变量指向的就是一个对象.其中一个变量发送改变,另一个也会跟着改变.和引用变 ...