vue3 层级选择器 el-cascader展示 更多的信息

cascader 正常情况下可以满足我们所需,一般展示的就是 {label:‘’ ;value:‘’} 但有时候需要展示更多的信息工用户查看,如下图。此时就需要我们进行一定的改造。
在这里插入图片描述
代码如下:

  <el-form-item label="相关人员">
    <el-cascader
      v-model="assistantList"
      :options="xgList"
      :props="props2"
      clearable
      filterable
      collapse-tags
      collapse-tags-tooltip
      @change="changeList" // 当绑定值变化时触发的事件
      @visible-change="getCustomerList"  //下拉框出现/隐藏时触发 接口调用
      class="cascaderInput"
      popper-class="man-cascader"
    >
    // 利用 插槽 去增加暂时内容,然后进行排版布局--排版布局需要自己去根据需求做,我这里也是简单的做了排版
      <template #default="{ node, data }">
        <div class="defaultData">
          <p class="defaultp1"> {{ data.label }} </p>
          <p class="defaultp2">
            {{ data.department }} /   {{ data.post || '--'}}
            <span class="defaultSpan">
              {{ data.phone || '--' }}
            </span>
          </p>
        </div>
      </template>
    </el-cascader>
  </el-form-item>

// 支持单选
const props1 = {
  checkStrictly: true,
  label: 'label', value: 'value', emitPath: false
}
// 支持多选
const props2 = {
  multiple: true,
  checkStrictly: true,
  label: 'label', value: 'value', emitPath: false
}
const xgList = ref([])
let assistantList: any = ref(null) // 相关人员列表

// 改变选择值的数据处理,这里是多选
const changeList = (val: any) =>{
  searchParams.value.relevantPersonnelList = val.join(',')  // 后端接收参数为字符串 ,需要前端处理
  emit('initBack') // 推送事件触发查询
}

const getCustomerList = (f: any) => {
  if (f) geOrgUserTree({
    orgId: 710,
    userId: useHomeState.userInfo.userId
  })
    .then(async (res: any) => {
      const { data, success, code } = res
      if (success && data) {
        let arr: any = []
        await arr_fn(data, arr) //数据重构
        xgList.value = [...arr]  
      }
    })
    .catch((err) => {
      ElMessage.error(err.message)
    })
}
const arr_fn = (data: any, arr: any) => {
  data.forEach((val: any) => {
    if (val.userDtoList) {
      val.userDtoList.forEach((v: any) => {
        if (v.status === 1) { // 接口返回数据后,前端处理 被启用的值
          arr.push({
            orgId: val.orgId,
            orgCode: val.orgCode,
            orgName: val.orgName,
            status: v.status,
            department: val.orgName,
            name: v.userName,
            personId: v.userId,
            phone: v.userTel,
            isShow: true,
            check: false,
            label: v.userName,
            value: v.userId
          })
        }
      })
    }
    if (val.children) {
      return arr_fn(val.children, arr)
    }
  })
}

css 样式 可自己处理

:deep(.cascaderInput){
  width: 212px;
  .el-cascader__tags{
    height: 24px !important;
  }
  .el-cascader {
    height: 24px;
    .el-input__wrapper {
      height: 24px;
      .el-input__inner{
        height: 24px;
      }
      input::placeholder {
        color: #262626;
        height: 24px !important;
      }
    }
    .el-cascader__tags{
      height: 24px !important;
    }
  }
}
.defaultData{
  width: 160px;
  height: 70px;
  margin-top: 10px;
  .defaultp1{
    width: 100%;
    margin-top: 25px;
  }
  .defaultp2{
    width: 100%;
    height: 30px; 
    margin-top: -18px;
    overflow: hidden;
    word-break: break-word;
    font-size: 12px;
    color: #cfcfcf;
    .defaultSpan{
      color:#333333;
    }
  }
}
.man-cascader {
  .el-cascader-menu__wrap.el-scrollbar__wrap{
    height: 100%;
    // margin-top: 15px;
  }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2中,`el-table` 组件与一系列子组件(如`el-input`、`el-select`和`el-cascader`)的嵌套使用可能会导致性能上的卡顿,尤其是在大数据量或者复杂交互的情况下。主要有以下几个可能的原因: 1. **渲染效率**:大量`el-input`和`el-select`可能会触发频繁的数据绑定和DOM新,特别是当它们关联到表格行数据时。如果数据源非常大或者数据结构复杂,这会增计算和渲染的工作量。 2. **DOM操作**:`el-cascader`的下拉选择通常会动态添或移除节点,如果嵌套层级很深,频繁的DOM操作可能导致性能下降。 3. **递归组件**:当`el-cascader`嵌套在多个层级时,会形成树状结构,每个节点都可能触发自身的渲染,这在数据量大的情况下容易造成性能瓶颈。 4. **事件监听**:每个输入框和选择器都可能有自身的事件监听,过多的事件处理可能会消耗CPU资源。 为了解决这个问题,你可以尝试以下优化策略: - **懒载和虚拟滚动**:对大数据量的表格,可以考虑使用虚拟滚动,只显示可见区域的数据,减少DOM节点数量。 - **计算属性和缓存**:尽可能减少不必要的数据计算,例如,可以将计算后的值作为缓存,而不是每次都重新计算。 - **优化组件的事件穿透**:检查是否有不需要的事件穿透或者是否能减少事件的触发频率。 - **组件组合优化**:考虑重构组件结构,减少组件的嵌套,或者使用轻量级的替代组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值