(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
创始人
2024-11-15 16:04:59

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束


  • 需求:按勾选的顺序给后端传值

  • 难点:在 Element UI 的 el-cascader 组件中,默认的行为是根据数据的层级结构来显示选项,用户的选择也会基于这种层级结构,el-cascader 本身并不直接支持自定义的显示顺序。


效果:

在这里插入图片描述


实现:

// html    // js export default { 	data(){ 		return { 			selectedOptions:[],// 绑定的数组 			sortSelectedOptions:[],// 排好序的数组 			// props: { multiple: true },// 原始获取到的value是数字,不方便对比 			props: { multiple: true, value: 'label', label: 'label' },// 指定value值取label 	        options: [{ 	          value: 1, 	          label: '东南', 	          children: [{ 	            value: 2, 	            label: '上海', 	            children: [ 	              { value: 3, label: '普陀' }, 	              { value: 4, label: '黄埔' }, 	              { value: 5, label: '徐汇' } 	            ] 	          }, { 	            value: 7, 	            label: '江苏', 	            children: [ 	              { value: 8, label: '南京' }, 	              { value: 9, label: '苏州' }, 	              { value: 10, label: '无锡' } 	            ] 	          }, { 	            value: 12, 	            label: '浙江', 	            children: [ 	              { value: 13, label: '杭州' }, 	              { value: 14, label: '宁波' }, 	              { value: 15, label: '嘉兴' } 	            ] 	          }] 	        }, { 	          value: 17, 	          label: '西北', 	          children: [{ 	            value: 18, 	            label: '陕西', 	            children: [ 	              { value: 19, label: '西安' }, 	              { value: 20, label: '延安' } 	            ] 	          }, { 	            value: 21, 	            label: '新疆维吾尔族自治区', 	            children: [ 	              { value: 22, label: '乌鲁木齐' }, 	              { value: 23, label: '克拉玛依' } 	            ] 	          }] 	        }] 		} 	} }, // 监听绑定数组 watch:{ 	selectedOptions: {       handler(newVal, oldValue) {         if (newVal.length > oldValue.length) {           // 找到新增的项           const newItems = this.findNewItems(oldValue, newVal)           // 添加到排序数组中           this.sortSelectedOptions.push(...newItems)         }         if (newVal.length < oldValue.length) {           // 找到删除的项           const newItems = this.findNewItems(newVal, oldValue)           // 从排序数组中过滤掉被删除的项           this.sortSelectedOptions = this.sortSelectedOptions.filter(item => {             return !newItems.map(e => JSON.stringify(e)).includes(JSON.stringify(item))           })         }         console.log('this.sortSelectedOptions', this.sortSelectedOptions)       },       deep: true     } },  methods:{ 	findNewItems(oldList, newList) {       // 创建一个映射表来快速检查旧列表中的项       const oldItemsMap = new Map()       for (const item of oldList) {         // 使用JSON.stringify作为唯一标识符(注意:如果子数组顺序重要且可能不同,这种方法可能不适用)         oldItemsMap.set(JSON.stringify(item), true)       }       // 遍历新列表,检查哪些项不在旧列表中       const newItems = []       for (const item of newList) {         if (!oldItemsMap.has(JSON.stringify(item))) {           newItems.push(item)         }       }       return newItems     }, }     

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...