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

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


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

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


效果:

在这里插入图片描述


实现:

// html
<el-cascader
	v-model="selectedOptions"
    :options="options"
    :props="props"
    clearable>
</el-cascader>

// 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
    },
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值