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-52-1-1.html 给你一个网站,你第一步做的是什么?我觉得这个是一个绝好的问题,但是却也是个难题,最常见的答案是莫过于做修改标题/查 ...

  2. 双击Back退出应用 android中弹出吐司

    第一种方法: public void onBackPressed() { if (isState) { //isState初始值为true isState = false; Toast.makeTex ...

  3. Substance Painter教程

    https://huke88.com/route/substance-painter.html?sem=baidu&kw=106738

  4. 3D人物移动控制实现方案

    要控制3D人物在3D世界中进行正常的移动.转向,一般有两种情况: 1.使用人物动画控制人物 的移动 转向 2.使用脚本控制人物 的移动.转向 对方案一: Animator 组件勾选上 Apply Ro ...

  5. SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign

    1.Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的-套客户端―负载均衡的工具. 简单的说,Ribbon是Netlix发布的开源项目,主要功能是提供客户端的 ...

  6. VMware安装Centos7 -九五小庞

    VMware安装Centos7超详细过程(图文) https://blog.csdn.net/babyxue/article/details/80970526 安装centos7的时候 启动会提示Pl ...

  7. leetcode-双指针遍历

    编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出.不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这一问题.你可以假设 ...

  8. 小程序开发-block组件的使用

    微信小程序中,block不是一个组件,而是一个包装元素,不会在页面中做任何渲染. 使用情况:条件渲染 wx:if 因为 wx:if 是一个控制属性,需要将它添加到一个标签/组件上,用于控制隐藏与显示. ...

  9. 剑指 Offer 47. 礼物的最大价值

    题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  10. 520是秀恩爱吃狗粮,521才是真正的告白日,- Python告白神器用起来 !

    网络情人节是信息时代的爱情节日,定于每年的5月20日和5月21日,该节日源于歌手范晓萱的<数字恋爱>中“520”被喻成“我爱你” ,以及音乐人吴玉龙的网络歌曲中“我爱你”与“网络情人”的紧 ...