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. 如何通过seo技术提高网站对用户的友好度

    http://www.wocaoseo.com/thread-129-1-1.html    今天的天气又是29度,眼看着满大街的人都穿着短袖和衬衣了,自己也再不能穿个厚厚的外套出去了,要不会被别人笑 ...

  2. JavaScript对象原型链的学习

    1.构造函数和原型 1.1对象的三种创建方式 字面量方式 var obj = {}; new关键字 var obj = new Object(); 构造函数方式 function Person(nam ...

  3. AD18 PCB中添加中文字符串显示乱码问题解决

    该问题是由于字符串的自体类型设置问题,AD默认是[stroke],我们点击[TrueType]即可正常显示.PS:AD18搞啥呢,默认显示输入内容不行吗,找半天!!!

  4. 【Go语言入门系列】(七)如何使用Go的方法?

    [Go语言入门系列]前面的文章: [Go语言入门系列](四)之map的使用 [Go语言入门系列](五)之指针和结构体的使用 [Go语言入门系列](六)之再探函数 本文介绍Go语言的方法的使用. 1. ...

  5. 目标识别AI资料

    朋友推荐的, 还有自己搜的. 入门可以看看. 网上资料应该不少, 一搜一大把, 简单记下地址. Review of Deep Learning Algorithms for Object Detect ...

  6. JVM学习第一天(虚拟机的前世今生与与Java的内存区域)

    其实说JVM的时候有很多人会懵, 也很不理解,我会写Java代码就可以了,我干嘛要学这个,其实不是的,学习JVM是很有必要性的; 为什么要了解JVM 1:写出更好,更健壮的Java程序; 2:提高Ja ...

  7. i春秋公益赛之signin

    题目链接:https://buuoj.cn/challenges#gyctf_2020_signin 查看程序保护 只开了canary和NX保护,在IDA查看反编译出来的为代码时发现程序给了一个后门 ...

  8. Mybatis----Mapper配置文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  9. Intersection of Two Prisms(AOJ 1313)

    原题如下: Suppose that P1 is an infinite-height prism whose axis is parallel to the z-axis, and P2 is al ...

  10. oracle之二检查点

    检查点(checkpoint) 8.1 什么是checkpointcheckpoint是数据库的一个内部事件,检查点激活时会触发数据库写进程(DBWR),将数据缓冲区里的脏数据块写到数据文件中. 8. ...