当前位置: 首页 > article >正文

【Element-UI 级联选择器 一级多选 二级单选】

一、效果图

一级多选 、二级单选

二、代码如下

可封装为公用组件 全局引入使用

<template>
	<div class="wrap-box">
		<div class='cascade-1231' style="width:300px">
		    <el-cascader class='cascader' :options='options' :props='props' clearable :popper-class="'cascade-hide'"
		        @change='handleChange' v-model="valTemp" ref='cascade'>
		        <!-- <template slot-scope="{ node, data }">
		        <span>{{ data.label }}</span>
		    </template> -->
		    </el-cascader>
		</div>
	</div>
    
</template>
  
<script>
export default {
    props: {
        optionsList: {
            type: Array,
            default: function () {
                return []
            }
        },
        val: {
            type: Array,
            default: function () {
                return []
            }
        },
    },
    watch: {
        optionsList: {
            deep: true,
            handler(news, olds) {
                this.options = news;

            },
        },
        val: {
            deep: true,
            handler(news, olds) {
                this.preValue = news;
            },
        }
    },
    data() {
        return {
            valTemp: [],
            props: { multiple: true, expandTrigger: 'click' },
            options: [{
                value: 1,
                label: '北京',
                children: [{
                    value: 3,
                    label: '故宫'
                }, {
                    value: 4,
                    label: '天安门'
                }, {
                    value: 7,
                    label: '颐和园'
                }]
            }, {
                value: 2,
                label: '南京',
                children: [{
                    value: 5,
                    label: '秦淮河'
                }, {
                    value: 6,
                    label: '鸡鸣寺'
                }]
            }],
            preValue: []
        }
    },
    mounted() {
        this.valTemp = this.val;
        this.preValue = this.val;
		
		// 封装组件时 可由父组件传入
        // this.options = this.optionsList; 
    },
    methods: {
        handleChange(val) {
            if (this.preValue.length > 0 && val.length > this.preValue.length) {
                let newIndex;
                let i = 0, j = 0;
                while (i < val.length && j < this.preValue.length) {
                    if (val[i][0] === this.preValue[j][0] && val[i][1] === this.preValue[j][1]) {
                        i++;
                        j++;
                    } else {
                        //添加在中间的情况
                        newIndex = i;
                        break;
                    }
                }
                //添加在末尾的情况
                if (j === this.preValue.length) {
                    newIndex = i;
                }

                let delIndex = val.findIndex((item, index) => index !== newIndex && item[0] === val[newIndex][0]);
                if (delIndex >= 0) {
                    // 取消选择的节点
                    let cancelIndex;
                    for (let i = 0; i < this.options.length; i++) {
                        if (this.options[i].value === val[delIndex][0]) {
                            for (let j = 0; j < this.options[i].children.length; j++) {
                                if (this.options[i].children[j].value === val[delIndex][1]) {
                                    cancelIndex = j;
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    this.$nextTick(() => {
                        let panelId = this.$refs.cascade.panel.$refs.menu[1].$el.id;  //其中menu[1]表示右侧的面板 menu[0]即为左侧的面板
                        let liId = document.getElementById(panelId + '-' + cancelIndex);
                        liId.children[0].click();
                    })
                    val[delIndex] = '';
                    val = val.filter(item => item !== '');
                }
            }
            this.preValue = val;
            this.$emit('getVal', this.preValue)
        }
    }
};
</script>
  
<style lang='scss' scoped>
	.wrap-box{
		/* background: #efefef; */
		background: rgba(255,255,255,0.70);
		height: 300px;
		padding:30px;
	}
	
.cascade-1231 {
    width: 100%;
	backgroung:#efefef;
	
    .title {
        display: block;
        margin-bottom: 20px;
    }

    .cascader {
        width: 100%;
        height: 28px;
        line-height: 28px;

        .el-input {
            .el-input__inner {
                // width: 362px;
                height: 28px !important;
                line-height: 28px !important;
                box-sizing: border-box;
            }

        }

        .el-cascader__tags {
            display: flex;
            flex-wrap: nowrap;
            overflow-y: overlay;
            margin-left: 2px;
        }

        .el-cascader__tags::-webkit-scrollbar {
            width: 0;
            height: 3px;
        }

        /*定义滚动条轨道 内阴影+圆角*/

        .el-cascader__tags::-webkit-scrollbar-track {
            background-color: rgba(186, 203, 227, 0.3);
        }

        /*定义滑块 内阴影+圆角*/

        .el-cascader__tags::-webkit-scrollbar-thumb {
            background-color: #B3C2D7;
        }
    }

}
</style>
<style lang="scss">
.cascader {
    .el-input {
        .el-input__inner {
            // width: 362px;
            height: 28px !important;
            line-height: 28px !important;
            box-sizing: border-box;
        }

    }
}

.cascade-hide {
    .el-cascader-menu:first-of-type {
        .el-cascader-node {
            .el-checkbox {
                display: none;
            }
        }
    }

    .el-cascader-menu:nth-child(2) {
        .el-cascader-node {
            .el-checkbox {
                .el-checkbox__inner {
                    border-radius: 50%;
                }
            }
        }
    }
}
</style>

三、寄语

2024年的列车即将到达终点

携带好行囊 奔赴旅途的下一场

2025我来了!!!!!!

希望2025年:

“笑一笑就灿烂

唱一句歌就舒展

收集一点一滴小美满

都是幸福的花样”


http://www.kler.cn/a/460231.html

相关文章:

  • mac m2 安装 docker
  • filebeat采集应用程序日志和多行匹配
  • REST与RPC的对比:从性能到扩展性的全面分析
  • 开源模型应用落地-LangChain实用小技巧-使用各种Loader高效解析不同数据源(七)
  • 【游戏设计原理】41 - 游戏的核心
  • OpenGL变换矩阵和输入控制
  • LeetCode - 初级算法 数组(两个数组的交集 II)
  • Three.js教程005:
  • C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码
  • 傲雷亮相2024中国时尚体育季(珠海站),展现户外移动照明风采
  • 什么是Path PDF?
  • 【开源免费】基于SpringBoot+Vue.JS大型商场应急预案管理系统(JAVA毕业设计)
  • PyCharm安装激活教程(Jetbrains其它软件可参考)
  • Linux -- 单例模式
  • 本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家
  • 国产数据库-崖山使用介绍
  • 【视觉SLAM:八、后端Ⅰ】
  • C语言插入排序及其优化
  • 微服务のGeteWay
  • iPhone修复技巧|iPhone异常问题的常用修复方法
  • Excel文件恢复教程:快速找回丢失数据!
  • 位运算与操作符应用
  • Element plus 的 upload 组件实现自定义上传
  • 为什么要用ZGC
  • rocketmq5源码系列--(二)--生产者发送消息
  • Java基础(五): 案例练习;