elementUI下拉选项加多选框功能实现(自己添加“全部”选项)

article/2025/9/14 13:36:09

本文包含三部分:
1.下拉加多选框
2.升级—添加全部选项
3.需求改版完善


一、下拉加多选框

效果如下图:

在这里插入图片描述

封装如下:

<template><div class="select-checked"><!-- 下拉加多选框 --><el-selectv-model="value"multipleplaceholder="请选择":popper-append-to-body="false"@remove-tag="removeTag"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"><el-checkbox v-model="item.check" @change="isChecked(item)">{{ item.label }}</el-checkbox></el-option></el-select>{{ value }}</div>
</template><script>
export default {name: 'SelectChecked',components: {},props: {options:{type: Array}},data() {return {value: []}},methods: {// 多选框触发isChecked(item) {if (item.check && this.value.indexOf(item.value) == -1) {this.value.push(item.value)} else if (!item.check) {this.value.forEach((elm, idx) => {if (elm == item.value) {this.value.splice(idx, 1)}})}this.$emit('selectedVal', this.value)},// 多选模式下移除tag时触发removeTag(value) {this.options.forEach((elm, idx) => {if (elm.value == value) {elm.check = false}})this.$emit('selectedVal', this.value)}}
}
</script><style lang="scss">
.select-checked {.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {content: '';}.el-checkbox {width: 100%;padding: 0 30px;.el-checkbox__label {margin-left: 20px;}}.el-select-dropdown__item {padding: 0;}
}
</style>

页面中使用

<!--  -->
<template><div class="content-box"><div class="container"><SelectChecked :options="options" @selectedVal="selectedVal" /></div></div>
</template><script>
import SelectChecked from '@/components/Select/SelectChecked'
export default {name: 'record',components: {SelectChecked},data() {return {options: [{value: '001',label: '黄金糕',check: false},{value: '002',label: '双皮奶',check: false},{value: '003',label: '蚵仔煎',check: false},{value: '004',label: '龙须面',check: false},{value: '005',label: '北京烤鸭',check: false}],}},watch: { },computed: {},methods: {selectedVal(value){console.log(111, value); // 获取子组件选项的值}},created() {console.log('created-record')},activated() {console.log('created-record')},mounted() {}
}
</script><style lang="scss">
</style>

二、升级—添加全部选项

<template><div class="select-checked"><!-- 下拉加多选框 --><el-selectv-model="value"multipleplaceholder="请选择":popper-append-to-body="false"@remove-tag="removeTag"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"><el-checkbox v-model="item.check" @change="isCheck(item)">{{ item.label }}</el-checkbox></el-option></el-select>{{ value }}</div>
</template><script>
export default {name: 'SelectChecked',components: {},props: {options: {type: Array}},data() {return {value: []}},methods: {// 多选框触发isCheck(item) {if (item.check && item.value == 'all') {this.value = []this.options.forEach(element => {element.check = truethis.value.push(element.value)})} else if (!item.check && item.value == 'all') {this.value = []this.options.forEach(element => {element.check = false})}if (item.check &&this.value.indexOf(item.value) == -1 &&item.value !== 'all') {this.value.forEach((elm, idx) => {if (elm == 'all') {this.value.splice(idx, 1)}})this.value.push(item.value)if (this.value.length == this.options.length - 1) {this.options[0].check = truethis.value.unshift('all')} else {this.options[0].check = false}} else if (!item.check && item.value !== 'all') {this.options[0].check = falsethis.value.forEach((elm, idx) => {if (elm == item.value || elm == 'all') {this.value.splice(idx, 1)}})}this.$emit('selectedVal', this.value)},// 多选模式下移除tag时触发removeTag(value) {if (value == 'all') {this.options.forEach((elm, idx) => {elm.check = false})this.value = []} else {this.options.forEach((elm, idx) => {if (elm.value == value || elm.value == 'all') {elm.check = false}})}this.$emit('selectedVal', this.value)}}
}
</script><style lang="scss">
.select-checked {.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {content: '';}.el-checkbox {width: 100%;padding: 0 30px;.el-checkbox__label {margin-left: 20px;}}.el-select-dropdown__item {padding: 0;}
}
</style>

组件中使用

<!--  -->
<template><div class="content-box select-checked"><div class="container"><SelectChecked :options="options" @selectedVal="selectedVal" /></div></div>
</template><script>
import SelectChecked from '@/components/Select/SelectChecked'
export default {name: 'record',components: {SelectChecked},data() {return {options: [{value: 'all',label: '全部',check: false},{value: '001',label: '黄金糕',check: false},{value: '002',label: '双皮奶',check: false},{value: '003',label: '蚵仔煎',check: false},{value: '004',label: '龙须面',check: false},{value: '005',label: '北京烤鸭',check: false}],value1: []}},watch: {}},computed: {},methods: {selectedVal(value){// 注意这里如果有全部的话,要去掉全部value.forEach((item,idx )=>{if(item == 'all'){value.splice(idx, 1)}})console.log(111, value);}},created() {console.log('created-record')},activated() {console.log('created-record')},mounted() {}
}
</script><style lang="scss">
.select-checked {.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {content: '';}.el-checkbox {width: 100%;padding: 0 30px;.el-checkbox__label {margin-left: 20px;}}.el-select-dropdown__item {padding: 0;}
}
</style>

效果如下图
在这里插入图片描述
在这里插入图片描述

三、需求改版完善

<template><div class="select-checked"><el-select:value="selected"multipleplaceholder="请选择":popper-append-to-body="false"><el-option :value="''" label="全部" class="multiple"><el-checkbox v-model="optionsAll" @change="handleoptionsAllChange">全部</el-checkbox></el-option><el-optionclass="multiple":value="key":label="item"v-for="(item, key) in optionsData":key="key"><el-checkbox:value="selectedOptions.includes(key)"@change="handleTaskItemChange(key)">{{ item }}</el-checkbox></el-option></el-select></div>
</template><script>
export default {name: 'Select',components: {},props: {options: {type: Object}},data() {return {optionsData: {},optionsAll: true,selectedOptions: [],}},watch: {options: {handler(newVal) {console.log(newVal)this.optionsData = newValthis.selectedOptions = Object.keys(newVal) },immediate: true, // 该值默认是false,在进入页面时,第一次绑定值,不会立刻执行监听,只有数据发生改变才会执行handler中的操作// deep: true, // deep 深度},},computed: {selected() {if (this.selectedOptions.length === Object.keys(this.optionsData).length) {return ['']} else {return this.selectedOptions}}},methods: {handleoptionsAllChange(isAll) {if (isAll) {this.selectedOptions = Object.keys(this.optionsData)} else {this.selectedOptions = []}},handleTaskItemChange(key) {if (this.selectedOptions.includes(key)) {this.selectedOptions.splice(this.selectedOptions.indexOf(key), 1)} else {this.selectedOptions.push(key)}this.optionsAll =this.selectedOptions.length === Object.keys(this.optionsData).length}}
}
</script><style lang="scss">
.select-checked {.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {content: '';}.el-checkbox {width: 100%;padding: 0 30px;.el-checkbox__label {margin-left: 20px;}}.el-select-dropdown__item {padding: 0;}.el-tag__close,.el-icon-close {display: none;}.el-tag.el-tag--info {background: transparent;border: 0;}.el-select {.el-select__tags {flex-wrap: nowrap;overflow: hidden;}.el-tag {background-color: #fff;border: none;color: #606266;font-size: 13px;padding-right: 0;& ~ .el-tag {margin-left: 0;}&:not(:last-child)::after {content: ',';}}}
}
</style>

组件使用:

<!--  -->
<template><div class="content-box select-checked"><div class="container"><Select :options="optionsData" @selected="selected" /></div></div>
</template><script>
import Select from '@/components/Select/Select'export default {name: 'record',components: {Select},data() {return {optionsData: {'001': '黄金糕','002': '双皮奶','003': '蚵仔煎','004': '龙须面','005': '北京烤鸭'},}},watch: {},computed: {},methods: {selected(value){console.log(value);let str = value.join()console.log(str)// 注意选项为全部时数据里面的值为空字符串和无的情况if(value.includes('') || value.length === 0){console.log(Object.keys(this.optionsData).join());}}},created() {console.log('created-record')},activated() {console.log('created-record')},mounted() {}
}
</script><style lang="scss" scoped></style>

效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

因上面是对象格式数据,操作起来可能会不方便,我重新整理了一下数组对象格式数据,如下

<template><div class="select-checked"><el-select:value="selected":class="{ all: optionsAll }"multipleplaceholder="请选择":popper-append-to-body="false"><el-option :value="''" label="全部" class="multiple"><el-checkbox v-model="optionsAll" @change="handleoptionsAllChange">全部</el-checkbox></el-option><el-optionclass="multiple":value="item.value":label="item.label"v-for="(item, key) in optionsData":key="key"><el-checkbox v-model="item.check" @change="handleTaskItemChange(item)">{{ item.label }}</el-checkbox></el-option></el-select></div>
</template><script>
export default {name: 'Select',components: {},props: {options: {type: Array}},data() {return {optionsData: [],optionsAll: true,selectedOptions: []}},watch: {options: {handler(newVal) {this.optionsData = newValnewVal.forEach(item => {if (item.check) {this.selectedOptions.push(item.value)}})},immediate: true// deep: true, // 深度监听}},computed: {selected() {if (this.selectedOptions.length === this.options.length) {return ['']} else {return this.selectedOptions}}},methods: {handleoptionsAllChange(isAll) {if (isAll) {this.optionsData.forEach((elm, idx) => {elm.check = truethis.selectedOptions.push(elm.value)})} else {this.optionsData.forEach((elm, idx) => {elm.check = false})this.selectedOptions = []}this.$emit('selected',this.selectedOptions)},handleTaskItemChange(item) {// console.log(item)// 这里是取出下标的方法,可以封装写出去Array.prototype.getArrayIndex = function (obj) {for (var i = 0; i < this.length; i++) {if (this[i] === obj) {return i}}return -1}if (!item.check) {this.optionsData.forEach((elm, idx) => {if (item.value == elm.value) {let index = this.selectedOptions.getArrayIndex(item.value)this.selectedOptions.splice(index, 1)}})} else {this.optionsData.forEach((elm, idx) => {if (item.value == elm.value) {this.selectedOptions.push(elm.value)}})}this.optionsAll = this.selectedOptions.length === this.optionsData.length// console.log(this.selectedOptions, this.optionsData)this.$emit('selected', this.selectedOptions)}}
}
</script><style lang="scss">
.select-checked {.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {content: '';}.el-checkbox {width: 100%;padding: 0 30px;.el-checkbox__label {margin-left: 20px;}}.el-select-dropdown__item {padding: 0;}.el-tag__close,.el-icon-close {display: none;}.el-tag.el-tag--info {background: transparent;border: 0;}.el-select {.el-select__tags {flex-wrap: nowrap;overflow: hidden;}.el-tag {background-color: #fff;border: none;color: #606266;font-size: 13px;padding-right: 0;& ~ .el-tag {margin-left: 0;}&:not(:last-child)::after {content: ',';}}}
}
</style>

组件中使用

<!--  -->
<template><div class="content-box select-checked"><div class="container"><Select :options="options" @selected="selected"/></div></div>
</template><script>
import SelectTest from '@/components/Select/Select'export default {name: 'record',components: {Select,},data() {return {options: [{value: '001',label: '黄金糕',check: true},{value: '002',label: '双皮奶',check: true},{value: '003',label: '蚵仔煎',check: true},{value: '004',label: '龙须面',check: true},{value: '005',label: '北京烤鸭',check: true}],}},watch: {},computed: {},methods: {selected(value){console.log(value);}},created() {console.log('created-record')},activated() {console.log('created-record')},mounted() {}
}
</script>

效果如下:

在这里插入图片描述

 本文转发自https://blog.csdn.net/weixin_42681295/article/details/120739490


http://chatgpt.dhexx.cn/article/OZs9ajts.shtml

相关文章

Js计算指定日期加上多少天,加多少月,加多少年的日期 (实用)

原文出处&#xff1a;Js计算指定日期加上多少天&#xff0c;加多少月&#xff0c;加多少年的日期 - 庞国明 - 博客园Js计算指定日期加上多少天&#xff0c;加多少月&#xff0c;加多少年的日期https://www.cnblogs.com/pangguoming/p/8854999.html function DateAdd(interva…

加多宝二次创业五周年:解锁品牌持续增长密码

今年作为后疫情时代元年&#xff0c;首要的任务是提振经济、重振信心&#xff0c;其中消费市场的提振至关重要。 春江水暖鸭先知。每当消费市场开始复苏&#xff0c;食品饮料行业的回暖一般会更明显。而要扩大食品饮料的消费规模、提振消费信心&#xff0c;关键在于品牌结合外…

阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程

正文共&#xff1a;14244 字 8 图 预计阅读时间&#xff1a; 36 分钟 本节内容摘自《Java异步编程实战》中的一小节。 一、前言 本节主要讲解如何使用JDK中的Future实现异步编程&#xff0c;这包含如何使用FutureTask实现异步编程以及其内部实现原理以及FutureTask的局限性。 二…

如何理解向量组的秩和矩阵的秩

1 向量组的轶指的是极大线性无关组中向量的个数 矩阵的轶是把一个矩阵分为行向量组和列向量组,这两个向量组的轶分别称为行轶和列轶.可以证明的是行轶和列轶相等,这就是矩阵的轶. 这里提醒一下就是: n-r为线性无关的解向量的个数,而r为极大无关组的个数 n-r也为基础解析向量的…

线性代数[矩阵的秩]

系列文章目录 第一章 线性代数[初等变换(一)] 第二章 线性代数[初等变换(二)] 第三章 线性代数[初等变换(三)] 提示&#xff1a;线性代数[矩阵的秩](林耀东&#xff0c;东叔讲解限定版) 文章目录 系列文章目录 文章目录 一、矩阵的“秩”是什么&#xff1f; 二、矩阵的秩 1.…

矩阵的秩-理解

求解形如上面的n元一次方程组的解法 n个未知数的方程组需要有n个“干货”的方程才能解出唯一个结果&#xff0c;这里的干货就是矩阵的秩。 即矩阵的秩回答了解得唯一性。 线性无关与线性有关&#xff1a; 例如&#xff1a; 此时矩阵的秩就是2&#xff0c;即矩阵的秩是矩阵中的…

【线性代数(9)】矩阵的秩

矩阵的秩 1 k阶子式和秩的定义2 矩阵的秩的定理3 有关秩的性质 手动反爬虫&#xff1a; 原博地址 知识梳理不易&#xff0c;请尊重劳动成果&#xff0c;文章仅发布在CSDN网站上&#xff0c;在其他网站看到该博文均属于未经作者授权的恶意爬取信息如若转载&#xff0c;请标明出…

矩阵秩的几何意义

矩阵的秩是什么&#xff1f; 文章目录 前言一、矩阵秩的定义&#xff1f;二、矩阵乘法的几何意义三、几何上理解矩阵的秩1.矩阵 A A A是方阵时2.矩阵 A A A是方阵时&#xff08;3*3&#xff09;3.矩阵 A A A非方阵时&#xff08;3*2&#xff09; 总结参考 前言 相信大家刚开始…

【线代】矩阵的秩和线性方程组的解的情况

行最简型矩阵&#xff1a;(也可以叫做行最简阶梯型矩阵,或者行简化阶梯型矩阵)&#xff0c;其特点是&#xff1a;非零行的首非零元为1&#xff0c;且这些非零元所在的列的其它元素都为0。所谓的行最简的意思就是对应的方程组是“最简单的”&#xff0c;就是说&#xff0c;对应的…

线性代数之矩阵秩的求法与示例详解

线性代数之矩阵秩的求法 K阶子式的定义 在mn的矩阵A中&#xff0c;任取k行、k列(k小于等于m、k小于等于n)&#xff0c;位于这些行和列交叉处的 个元素&#xff0c;在不改变原有次序的情况下组成的矩阵叫做矩阵A的k阶子式。 不难发现矩阵A有个 个k阶子式。 比如有矩阵A 比如…

矩阵低秩有何意义?

参考博客&#xff1a;https://blog.csdn.net/weixin_41894030/article/details/115699611 首先来思考&#xff0c;为什么叫“秩”&#xff1f; 举个例子就很容易理解&#xff0c;大家排队买票。如果大家互相不认识&#xff0c;那就会一个排一个&#xff0c;非常有秩序。然而&…

如何直观地理解矩阵的秩?

矩阵的秩可以直观地理解为筛眼的大小&#xff1a; 下面就来解释这句话是什么意思&#xff1f; 1 矩阵的作用 假设对于向量 x1 、 x2、 x3、x4 有&#xff1a; 上述关系可以用图像来表示&#xff0c;左侧的向量 x1 、 x2、 x3、x4&#xff0c;在 A 的作用下&#xff0c;变为了…

矩阵的秩(Rank)

定义 一个矩阵 A 的列秩是 A 的线性无关的纵列的极大数目。类似地&#xff0c;行秩是 A 的线性无关的横行的极大数目。矩阵的列秩和行秩总是相等的&#xff0c;因此它们可以简单地称作矩阵 A 的秩。通常表示为 r(A)&#xff0c;rank(A) 或 rk(A)。 可替代定义 用行列式定义…

如何理解矩阵的「秩」?

本文作者Heshawn&#xff0c;点击关注&#xff0c;转载需授权。 利益相关&#xff1a;知乎『线性代数』系列Live主讲人 小时候老师总告诉我们「要有n个方程才能确定地解出n个未知数」——这句话其 实是不严格的&#xff0c;如果你想确定地解出n个未知数&#xff0c;只有n个方程…

矩阵的秩及其求法

矩阵的秩及其求法 矩阵秩的概念k阶子式矩阵的秩 矩阵秩的求法1、子式判别法&#xff08;定义&#xff09;2、用初等行变换求矩阵的秩 满秩矩阵相关性质 矩阵秩的概念 k阶子式 定义1&#xff1a; 设 A ( a i j ) m n A(a_{ij})_{m\times n} A(aij​)mn​在 A A A中任取 k k …

PPM与mg/m3的转换公式

转载于; https://blog.csdn.net/zhuisaozhang1292/article/details/88082631 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/zhuisaozhang1292/a…

用stm32读取遥控器接收机PPM信号各通道值

引言 无人机遥控器接收机接收方式可以在遥控上设置成PPM模式和S.BUS模式&#xff0c;用示波器观察接收机信号输出引脚可以得到一系列的方波&#xff0c;很像PWM方波&#xff0c;而我们所需要的是七&#xff0c;八个或更多的通道信号&#xff0c;多路的PWM信号调制在同一通道上…

气体浓度PPM与mg/m3的换算关系

1&#xff09;换算方法之一&#xff1a;《空气和废气检测分析方法&#xff08;第四版增补版&#xff09;》&#xff08;中国环境科学出版社&#xff09;空气中气体污染物浓度的表示方法 空气中污染物的浓度是以单位体积内所含污染物的质量来表示&#xff0c;即毫克每立方米…

ppm与LSB含义,换算

n表示ADC位数 关于PPM与LSB 一、ppm&#xff1a;百万分之一 ppm是英文part per million的缩写&#xff0c;表示百万分之几&#xff0c;在不同的场合与某些物理量组合&#xff0c;常用于表示器件某个直流参数的精度。下面举例说明。 1.用于描述电压基准&#xff08;Voltage …

理学知识01-ppm、ppb、ppt换算

1. 浓度 浓度是分析化学中的一个名词。含义是以1升溶液中所含溶质的摩尔数表示的浓度。以单位体积里所含溶质的物质的量&#xff08;摩尔数&#xff09;来表示溶液组成的物理量&#xff0c;叫作该溶质的摩尔浓度&#xff0c;又称该溶质物质的量浓度。 2. 浓度单位 在文献阅读过…