定制iview选择器——全选按钮
源码下载:https://github.com/littleOneYuan/c_select
本文索引
效果
- 下拉框分为三块:已选列表;全选/取消全选按钮;未选列表;
- 当选中未选列表的某项,该项自动从未选列表pop去已选列表;
- 当选中已选列表的某项,该项自动从已选列表pop去未选列表;
- 支持关键字搜索,输入框显示已选数目;
template

1 1 <Select
2 2 v-model="s_arr"
3 3 :disabled="isdisabled"
4 4 :placeholder="placeholder"
5 5 :max-tag-count="0"
6 6 multiple
7 7 filterable
8 8 label-in-value
9 9 @on-select="selectOption"
10 10 @on-open-change="openChange"
11 11 >
12 12 <Option
13 13 v-for="i in selectedList"
14 14 :value="i.value"
15 15 :key="i.value"
16 16 :title="i.label"
17 17 >{{ i.label }}</Option
18 18 >
19 19 <Option
20 20 value="all"
21 21 key="all"
22 22 v-if="trans_unselList.length > 0"
23 23 style="padding: 0px"
24 24 >
25 25 <p
26 26 @click="
27 27 selectAllFun(
28 28 s_arr.length !== unselList.length + selectedList.length
29 29 )
30 30 "
31 31 >
32 32 {{
33 33 s_arr.length !== unselList.length + selectedList.length
34 34 ? "全选"
35 35 : "取消全选"
36 36 }}
37 37 </p>
38 38 </Option>
39 39 <Option
40 40 v-for="item in unselList"
41 41 :value="item.value"
42 42 :key="item.value"
43 43 :title="item.label"
44 44 >{{ item.label }}</Option
45 45 >
46 46 </Select>
Template
data
1 data () {
2 return {
3 unselList: [], // 未选数组
4 selectedList: [], // 已选数组
5 s_arr: [], // v-model绑定选项数组
6 add_tag: true, // 新增选项标记
7 allList: [], // 全选v-model绑定选项数组
8 init_list: [] // 全选已选数组
9 }
10 },
prop
- placeholder:父组件传递的输入提示文字
- trans_unselList:父组件传递的未选列表
- isdisabled:父组件传递的该选择器禁用状态
- trans_selList:父组件传递的已选列表

1 props: {
2 placeholder: {
3 type: String,
4 default () {
5 return ''
6 }
7 },
8 trans_unselList: {
9 type: Array,
10 default () {
11 return []
12 }
13 },
14 isdisabled: {
15 type: Boolean,
16 default () {
17 return false
18 }
19 },
20 trans_selList: {
21 type: Array,
22 default () {
23 return []
24 }
25 }
26 },
Prop
methods
- selectAllFun:处理全选和取消全选事件,参数isAll判断当前处理的是全选还是取消全选事件
- add_or_del:判断当前是添加选项还是删除选项并对应设置标签add_tag
- selectOption:选择事件,根据add_tag进行对应的删除和添加的处理
- openChange:下拉框展开收起事件,在收起的时候将拿到的选项组合传给父组件
- allList_setValue:在首次拿到未选数组时,保存到allList和init_list中(定义见data)
- selList_handle:处理初始化时从父组件那拿到的已选项

1 methods: {
2 selectAllFun (isAll) {
3 const self = this
4 setTimeout(() => {
5 self.s_arr = []
6 if (isAll) {
7 self.selectedList = []
8 self.init_list.forEach(item => {
9 // 采用这种方式的拷贝,不会只是拷贝了对象的别名(只拷贝别名会导致不期望的被改动)
10 self.selectedList.push(item)
11 })
12 self.unselList = []
13 self.allList.forEach(item => {
14 self.s_arr.push(item)
15 })
16 } else {
17 self.selectedList = []
18 self.unselList = []
19 self.init_list.forEach(item => {
20 self.unselList.push(item)
21 })
22 self.s_arr = []
23 }
24 }, 0)
25 },
26 add_or_del (o) {
27 const self = this
28 try {
29 self.selectedList.forEach(function (item) {
30 if (item.value === o.value) {
31 self.add_tag = false
32 throw new Error('')
33 }
34 })
35 } catch (e) {
36 return ''
37 }
38 self.add_tag = true
39 return ''
40 },
41 selectOption (o) {
42 const self = this
43 if (o.value !== 'all') {
44 setTimeout(() => {
45 self.add_or_del(o)
46 if (self.add_tag) {
47 try {
48 self.unselList.forEach(function (item, index) {
49 if (item.value === o.value) {
50 self.unselList.splice(index, 1)
51 throw new Error('')
52 }
53 })
54 } catch (e) {
55 // console.log(e)
56 }
57 self.selectedList.push(o)
58 } else {
59 try {
60 self.selectedList.forEach(function (item, index) {
61 if (item.value === o.value) {
62 self.selectedList.splice(index, 1)
63 throw new Error('')
64 }
65 })
66 } catch (e) {
67 // console.log(e)
68 }
69 self.unselList.push(o)
70 }
71 }, 100)
72 }
73 },
74 openChange (isopen) {
75 if (!isopen) {
76 var res = this.backList_handle(this.selectedList)
77 this.$emit('func', res)
78 }
79 },
80 // 返回选项列表处理
81 backList_handle (list) {
82 var res = []
83 list.forEach(item => {
84 res.push(item.value)
85 })
86 return res
87 },
88 allList_setValue () {
89 const self = this
90 self.unselList.forEach(temp => {
91 self.allList.push(temp.value)
92 self.init_list.push(temp)
93 })
94 },
95 // 拿到的选项处理
96 selList_handle (trans, unsel) {
97 const self = this
98 setTimeout(() => {
99 if (trans && trans.length > 0) {
100 const sel = []
101 const un_sel = []
102 unsel.forEach(function (item, index) {
103 if (item.value && trans.indexOf(item.value) !== -1) {
104 sel.push(item)
105 } else if (item.value && trans.indexOf(item.value) === -1) {
106 un_sel.push(item)
107 }
108 })
109 self.selectedList = sel
110 // s_arr保存的仅是value
111 self.selectedList.forEach(item => {
112 self.s_arr.push(item.value)
113 })
114 self.unselList = un_sel
115 const res = this.backList_handle(self.selectedList)
116 this.$emit('func', res)
117 } else if (trans && trans.length === 0) {
118 self.selectedList = []
119 self.unselList = []
120 self.init_list.forEach(item => {
121 self.unselList.push(item)
122 })
123 self.s_arr = []
124 const res = this.backList_handle(self.selectedList)
125 this.$emit('func', res)
126 }
127 }, 0)
128 }
129 },
watch
- 监听父组件传来的已选列表和未选列表的变化
1 trans_selList (n, o) {
2 const trans = n.length === 0 ? [] : atrToNum_handle(n)
3 this.selectAllFun(false)
4 this.selList_handle(trans, this.init_list)
5 },
6 trans_unselList (n, o) {
7 if (n && n.length > 0) {
8 this.unselList = deepCopy(n)
9 this.allList_setValue()
10 }
11 }
created
- 初始化赋值
created () {
this.unselList = deepCopy(this.trans_unselList)
this.allList_setValue()
setTimeout(() => {
if (this.trans_selList && this.trans_selList.length > 0) {
const n = this.trans_selList
const trans = n.length === 0 ? [] : atrToNum_handle(n)
this.selectAllFun(false)
this.selList_handle(trans, this.init_list)
}
}, 500)
}
在父组件中使用:
1 <Csearch
2 placeholder="渠道组"
3 :trans_unselList="ChannelManageGroup_List"
4 :trans_selList="res_ChannelManageGroup_List"
5 @func="getChannelManageGroup_List"
6 />
定制iview选择器——全选按钮的更多相关文章
- Jquery小例子:全选按钮、加事件、挂事件;parent()语法;slideToggle()语法;animate()语法;元素的淡入淡出效果:fadeIn() 、fadeOut()、fadeToggle() 、fadeTo();function(e):e包括事件源和时间数据;append() 方法
function(e): 事件包括事件源和事件数据,事件源是指是谁触发的这个事件,谁就是事件源(div,按钮,span都可以是事件源),时间数据是指比如点击鼠标的事件中,事件数据就是指点击鼠标的左建或 ...
- checkbox做全选按钮
1.先写一个html页面,里面写一个全选按钮和几个复选框,实现下面2个要求 (1)点击全选按钮选中时,所有的复选框选中. (2)点击全选按钮取消选中时,所有复选框取消选中. <input typ ...
- 列表中checked全选按钮的实现
用过音乐播放器的人都知道有个全选按钮,如果使用Jquery实现,有个直接选中checked标签的方式 <!DOCTYPE HTML> <html> <head> & ...
- 11月8日下午Jquery取属性值(复选框、下拉列表、单选按钮)、做全选按钮、JSON存储、去空格
1.jquery取复选框的值 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- jQuery取复选框值、下拉列表里面的属性值、取单选按钮的属性值、全选按钮、JSON存储、*去空格
1.jquery取复选框的值<!--引入jquery包--> <script src="../jquery-1.11.2.min.js"></scri ...
- 全选按钮的设定和POST处理当前循环的列表
以下为全选按钮的代码,通过class实现. //全选按钮 $(function () { $("#selectall").change(function () { var isch ...
- js做全选,用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false
用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false,当所有checkbox都被选中时,全选按钮也被选中. 详解: 有两种 ...
- zepto全选按钮之全选会根据按钮是否被全部选中更改状态
在做手机端二次开发购物车的时候,发现zepto全选,没找到,或者功能不是自己想要的 后来做好,分享给需要的人 //全选或多选处理 var CheckAll = $('#items_check ...
- Jquery取属性值(复选框、下拉列表、单选按钮)、做全选按钮、JSON存储、去空格
1.jquery取复选框的值 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
随机推荐
- Qt QPainter画个球啊
Qt QPainter画个球啊 目录 Qt QPainter画个球啊 看效果 方法 代码 看效果 方法 使用绘图事件,绘制一个图形 使用定时事件,不停更新图形位置 代码 .h #pragma once ...
- 去年去阿里面试,被问到java 多线程,我是这样手撕面试官的
1.多线程的基本概念 1.1进程与线程 程序:是为完成特定任务,用某种语言编写的一组指令的集合,即一段静态代码,静态对象. 进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,每个程 ...
- 在 Spark 数据导入中的一些实践细节
本文由合合信息大数据团队柳佳浩撰写 1.前言 图谱业务随着时间的推移愈发的复杂化,逐渐体现出了性能上的瓶颈:单机不足以支持更大的图谱.然而,从性能上来看,Neo4j 的原生图存储有着不可替代的性能优势 ...
- AcWing 298. 围栏 (POJ1821)
标签(空格分隔): dp 单调队列优化 题目描述 有N块木板从左到右排成一行,有M个工匠对这些木板进行粉刷,每块木板至多被粉刷一次. 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长 ...
- 【linux】系统调用版串口分析&源码实战
目录 前言 参考 1. 实战分析 1.1 开发步骤 1.1.1 获取串口设备路径 1.1.2 打开设备文件 1.1.3 配置串口 termios 结构体 1. c_iflag 输入模式标志 2. c_ ...
- MySQL数据更新
MySQL数据更新: 导读: 该练习是本人课程学习进行整理的,若有不对,欢迎指出! 该练习没有配套的sql文件,如果需要可以看之前的文章有student表等(MySQL查询练习); 这是最后一部分练习 ...
- Pytest自动化测试 - allure报告进阶
Allure除了具有Pytest基本状态外,其他几乎所有功能也都支持. 1.严重性 如果你想对测试用例进行严重等级划分,可以使用 @allure.severity 装饰器,它可以应用于函数,方法或整个 ...
- java面试复习重点:类的管理及常用工具,教你抓住面试的重点!
java复习: 类的管理及常用工具类 包 写在程序文件的第一行 一个Java 源文件中只能声明一个包, 且声明语句只能作为源文件的第一条指令 导入类能导入非public类,但是不能用因为在其他包缺省的 ...
- JZOJ2020年8月11日提高组T3 页
JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...
- Spring Boot系列:七、 实现Mybatis多数据源切换
一.引入相关maven配置 mybatis; mysql驱动:jdbc <dependency> <groupId>org.mybatis.spring.boot</g ...