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. Java8中的Stream API

    本篇文章继续介绍Java 8的另一个新特性——Stream API.新增的Stream API与InputStream和OutputStream是完全不同的概念,Stream API是对Java中集合 ...

  2. openCV - 1. 加载、修改、保存图像

    加载 cv::imread 修改 cv::cvtColor 保存 cv::imwrite 加载图像cv::imread imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称 ...

  3. 【API进阶之路】破圈,用一个API代替10人内容团队

    摘要:我用一个API代替10人内容团队,一年帮老板省了一百万. 自从学习API以后,我用技术手段相继帮助业务部.市场部解决了不少难题,算是从纯研发破圈发展到了业务端.老板召开业务讨论会的时候也会带上我 ...

  4. js 原生功底 (一)

    欢迎大家一起学习,点击查看

  5. ract-native常用命令

    1.新建项目:react-native init AwesomeProject 2.运动项目 cd AwesomeProject react-native run-ios 3.添加第三方插件: yar ...

  6. Linux 操作系统 基础

    root: 管理员 /: 根目录[windows : 计算机] ~: 家目录: 管理员:/root/.. 非管理员:/home/... 命令提示符: [root@localhost abc]#: ro ...

  7. 网站远程附件存储到 OSS

    参考:链接  链接  链接 简介 网站远程附件功能是指将用户上传的附件直接存储到远端的存储服务器,一般是通过FTP的方式存储到远程的FTP服务器,将论坛附件保存在 OSS 上有以下好处: 附件将拥有更 ...

  8. python爬取拉勾网职位信息-python相关职位

    import requestsimport mathimport pandas as pdimport timefrom lxml import etree url = 'https://www.la ...

  9. Mybatis-日志

    日志 目录 日志 1. 日志工厂 1. STDOUT_LOGGING标准日志输出 2. LOG4J 1. 先导入Log4J的包 2. log4j.properties 3. 配置log4j为日志的实现 ...

  10. delphi DBgrid应用全书

    在一个Dbgrid中显示多数据库    在数据库编程中,不必要也不可能将应用程序操作的所有数据库字段放入一个数据库文件中.正确的数据库结构应是:将数据库字段放入多个数据库文件,相关的数据库都包含一个唯 ...