vue3项目 使用 element-plus 中 el-collapse 折叠面板

news2025/3/10 15:21:59

最近接触拉了一个项目,使用到 element-plus 中 el-collapse 折叠面板,发现在使用中利用高官网多多少少的会出现问题。
(1.直接默认一个展开值,发现时显时不显
2 . 数据渲染问题,接口请求了,页面数据不更新
3 样式问题,自定义表头title等等)
我们的数据结构是双数组,如果你和我一样直接copy, 如果是一个对象数组或者数组吧,只需把外层的数组转化即可
在这里插入图片描述

效果图 : 当点击 了查看按钮时,弹框出现,且默认展开第一个数据,且每次的展开或者收起都有对应的样式,可见下图左侧的图样,
我这里还用到了 el-steps ,最外层的 是自己写的样式,因为我一个页面中使用了两次el-steps ,发现样式会有干扰。所以我在最外层的el-steps是自己写的div标签。

注意 的是我们使用 官网说明的 const activeName = ref([]) 数组类型 ,且里面的值使用字符串类型。
当 弹框出现时,调用接口进行处理赋值 activeName,并转成 toString() 字符串,然后默认展开第一项
	activeName.value.push(index.toString())
    activeName.value = ['0']
    在进行处理每个item之间的高和选中样式。
    最后在处理点击@change 的事件
    
    // 处理在展开折叠状态
	const handleCollapseChange = (val: any) => {
	  // console.log(val, 'val');
	  PurchaseInfo.forEach((item:any, index:any)=>{
	    if(val){
	      if(val === index.toString()){
	        item.flagActive = true
	        item.height = myCollapseRef.value.$el.clientHeight + 20
	      } else{
	        item.flagActive = false
	        item.height = 38
	      }
	    }else{
	      item.flagActive = false
	      item.height = 38
	    }
	  })
	  // console.log(PurchaseInfo, 'PurchaseInfo')
	}

在这里插入图片描述
上代码了。

<ProcessViewDialog
  v-model:value="dialogFormVisible"
  :projectDeviceId="projectDeviceId"
/>

自己 引入组件

<template>
  <div>
    <zmjDialog
      v-model="show"
      width="460"
      @opened="init"
      title="查看所有设备"
      center
    > 
      <div style="display:flex; width: 460px">
        <div class="el-dialog-div">
          <div class="el-dialog_divleft">
            <div class=divleftlast v-for="(el, index) in PurchaseInfo" :key="index">
              <p :class="el.flagActive ? 'arrdata1Active' : 'arrdata1'"></p>
              <p :style="{width: 2 + 'px', height: el.height + 'px', background: '#E8F0FF', borderRadius: '0px 0px 0px 0px', marginLeft: '8px'}"></p>
            </div>
          </div>
          <el-collapse
            class="el-collapse-parent"
            v-model="activeName"
            accordion
            @change="handleCollapseChange"
            ref="myCollapseRef"
          >
            <el-collapse-item
              v-for="(item, index) in PurchaseInfo"
              :key="index"
              :name="index.toString()"
              style="margin-bottom: 10px;"
              ref="itemHeight"
            >
              <template #title>
                <div :class="item.flagActive ? 'headerRightTrue' : 'headerRightFlase'">
                  <span class="spanFalse"></span>
                  <div class="itemApproveTimeFalse">
                    {{ item.approveTime }}
                  </div>
                  <div class="top-right">
                    <div> {{item.operatorName}} <span v-if="item?.nodeId"> ({{item?.nodeId == 120 ? '方案' : ( item?.nodeId == 130 ? '商务活动' : (item?.nodeId == 140 ? '配套' : '' ))}}) </span> </div>
                    <span :class="item.flagActive ? 'headerRightspan1' : 'headerRightspan2'">{{ activeName.includes(index.toString()) ? '收起' : '展开' }}</span>
                  </div>
                </div>
              </template>
              <div class="contntDiv">
                <div class="contntDiv-1">
                  <div class="contntDiv-1">
                    <span class="contntDiv-1-span"> {{item.model}} </span>
                    <span class="contntDiv-2-span"> {{ item?.supportLabel === 1 ? '标准架型' : (item?.supportLabel === 3 ? '模块架型' : '非标架型')}} </span>
                  </div>
                  <div class="contntDiv-1-d"> {{ item?.deviceCount}}架 </div>
                </div>
                <div class="line"></div>
                <div>
                  <div class="contntDiv-item-left"> 片区 </div>
                  <div class="contntDiv-item-right"> {{ item?.areaName }} </div>
                </div>
                <div>
                  <div class="contntDiv-item-left"> 支架类型 </div>
                  <div class="contntDiv-item-right"> {{ GET_SUPPORT_TYPE(item?.firstDeviceType) }} - {{ GET_SUPPORT_SECOND_TYPE_NAME(item?.secondDeviceType) }}</div>
                </div>
                <div>
                  <div class="contntDiv-item-left"> 图号 </div>
                  <div class="contntDiv-item-right"> {{item?.standardGroupNo }} </div>
                </div>
                <div>
                  <div class="contntDiv-item-left"> 单架重量 </div>
                  <div class="contntDiv-item-right"> {{ item?.singleWeight}}吨 </div>
                </div> 
                <div>
                  <div class="contntDiv-item-left"> 支架特征代号 </div>
                  <div class="contntDiv-item-right"> {{ joinSupportFeatureModel }} </div>
                </div>
                <div class="contntDiv-item-right-bottom" v-if="item?.supportFeatureModel && item?.supportFeatureModel?.length > 0">
                  *支架产品型号{{ item?.supportProductModel}}
                </div>
              </div>
              <div class="box-approve" v-if="item?.flowApproveDtoList?.length>0">
                <el-steps direction="vertical" :active="1" align-center>
                  <el-step v-for="(v, i) in item?.flowApproveDtoList" class="my-text" :key="i">
                    <template #icon>
                      <div class="titleDiv">
                        <div class="time">{{ v.updateTime }}</div>
                      </div>
                    </template>
                    <template #title>
                      <div class="step-icon"></div>
                    </template>
                    <template #description>
                      <div class="descriptionDiv">
                        <div style="color: #707070; font-size: 14px">
                        <span class="" style="color: #3076fe">{{ v.approveUserName }}</span>
                        <!-- approveType  1 提交 2 审批 status 1 未审批 2  审批通过 3 驳回 -->
                        <span v-if="v.approveType == 1 && v.status == 2 && isLastElement(item?.flowApproveDtoList, i)" style="color: rgba(0, 0, 0, 0.56)"><span style="color: #262626">提交审批</span></span>
                        <span v-else>
                          <span v-if="v.approveType == 1 && v.status == 2" style="color: rgba(0, 0, 0, 0.56)"><span style="color: #262626">再次提交审批</span></span>
                          <span v-if="v.approveType == 1 && v.status == 3" style="color: rgba(0, 0, 0, 0.56)"><span style="color: #ffb236">审批驳回</span></span>
                          <span v-if="v.approveType == 2 && v.status == 2">
                            <span style="color: #63af17">审批通过</span>
                          </span>
                          <span v-if="v.approveType == 2 && v.status == 3">
                            将<span style="color: #ffb236">审批驳回</span>
                          </span>
                        </span>
                        </div>
                        <div v-if="(v.approveType == 1 || v.approveType == 2) && v.status == 3" class="reject-box">
                          <div class="reject-item-1">
                            <div>驳回原因</div>
                            <div>{{ v.rejectReason }}</div>
                          </div>
                        </div>
                      </div>
                      
                    </template>
                  </el-step>
                </el-steps>
              </div>
            </el-collapse-item>
          </el-collapse>
        </div>
      </div>
      
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="show = false">返回</el-button>
        </div>
      </template>
    </zmjDialog>
  </div>
</template>


<script setup lang="ts">
import { recordLog } from '@/api/project/device' // 接口替换为完成
import { GET_SUPPORT_TYPE, GET_SUPPORT_SECOND_TYPE_NAME } from './config'
const props = defineProps({
  dialogFormVisible: Boolean,
  value: Boolean,
  projectDeviceId: { type: Number, default: null }, // 业务id
})
// const activeName = ref()
const activeName = ref([])
const emit = defineEmits(['update:value', 'exit'])
// 添加页面弹出标识
let show = computed({
  get() {
    return props.value
  },
  set(val: any) {
    emit('update:value', val)
  }
})
let PurchaseInfo:any = reactive([])
let joinSupportFeatureModel:any = ref('')

// 判断数组的最后一个
const isLastElement = (array:any, index:any) => {
  return index === array.length - 1
}

const init = async () => {
  try {
    const res: any = await recordLog({ deviceId: props.projectDeviceId })
    PurchaseInfo = res.data
    let arr:any = []
    activeName.value = []
    PurchaseInfo.forEach((item:any, index:any)=>{
      activeName.value.push(index.toString())
      activeName.value = ['0']
      if(index.toString() === activeName.value[0]){
        item.height = myCollapseRef.value.$el.clientHeight + 20
        item.flagActive = true
      }else{
        item.height = 38
        item.flagActive = false
      }
      item?.supportFeatureModel?.map((v:any)=>{
        if(v==='A1'){
          arr.push('A类支架')
        } else if(v ==='Q'){
          arr.push('大倾角')
        }else if(v ==='D'){
          arr.push('电液控')
        }else if(v ==='A'){
          arr.push('大侧帮支架左架')
        }else if(v ==='B'){
          arr.push('大侧帮支架右架')
        }else{
          arr = []
        }
      })
    })
    // console.log(PurchaseInfo, 'PurchaseInfo-loading---',)
    joinSupportFeatureModel.value = arr.join('、')
  } catch (err) {
    console.log(err.message)
  }
}

let myCollapseRef = ref()
const itemHeight = ref(null)
// 监听折叠状态
const handleCollapseChange = (val: any) => {
  // console.log(val, 'val');
  PurchaseInfo.forEach((item:any, index:any)=>{
    if(val){
      if(val === index.toString()){
        item.flagActive = true
        item.height = myCollapseRef.value.$el.clientHeight + 20
      } else{
        item.flagActive = false
        item.height = 38
      }
    }else{
      item.flagActive = false
      item.height = 38
    }
  })
  // console.log(PurchaseInfo, 'PurchaseInfo')
}
</script>

<style lang="scss" scoped>
.el-dialog_divleft{
  width: 10px;
  // margin-left: 10px;
  margin-top:28px;
  display: flex;
  flex-wrap: wrap;
  height: 38px;
}
/* 选择最后一个div中的第二个p标签,并应用样式 */
.divleftlast:last-child p:last-child {
  display: none;
}
.arrdata1{
  width: 8px;
  height: 8px;
  border-radius: 50%;
  border: 1px solid #3076fe;
  // margin-top: 15px;
  margin-left: 5px;
}
.arrdata1Active{
  width: 8px;
  height: 8px;
  border-radius: 50%;
  border: 1px solid #3076fe;
  // margin-top: 15px;
  margin-left: 5px;
  background: #3076fe;
}
.el-dialog-div {
  // width: 395px;
  width: 100%;
  margin-left: 20px; // 20px
  height: 50vh;
  overflow-x: hidden;
  display: flex;
}

.page-content {
  padding: 24px 44px;
  .device-group {
    &:not(:first-child) {
      margin-top: 12px;
    }
  }
  :deep(.el-descriptions.zmj-descriptions) {
    .el-descriptions__header {
      margin-top: 12px;
      margin-bottom: 8px;
      .el-descriptions__title {
        font-weight: 400;
      }
    }

    .el-descriptions__cell {
      padding: 10px 12px;
      color: #262626;
    }
    .el-descriptions__label {
      padding: 10px 12px;
      background-color: #fafafa;
      color: #707070;
    }
  }
}
.page-empty {
  height: 100%;
}
.color-centent {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  color: #3076fe;
}
/* 如果您想要在展开的el-collapse-item上添加特殊样式,可以使用深度选择器 */
.el-collapse {
  :deep(.el-collapse-item__content) {
    border: 1px solid #3076FE;
    padding-bottom: 0px; /* 根据需要调整padding值 */
    width: 384px;
  }
}

.el-collapse-parent{
  margin-top: 10px;
  border: none;
  width:395px;
  margin-left: 10px;
  :deep(.el-collapse-item__header){
    background: #3076FE;
    border-radius: 4px 4px 0px 0px;
    width: 384px;
    height: 39px
  }
}
:deep(.el-collapse-item__arrow){
  display:none;
}
.headerRightTrue{
  width: 395px;
  height: 38px;
  background: #3076FE;
  border-radius: 4px 4px 0px 0px;
  display: flex;
  justify-content: space-between;
  padding: 10px;
  color:#fff;
  font-size: 14px;
  line-height: 20px;
  top: -20px;
  .top-right{
    width: 160px;
    display: flex;
    // justify-content: space-around;
    justify-content: space-between;
    font-size: 12px;
    .headerRightspan1{
      color:#fff;
    }
  }
}
.spanFalse{
    width: 4px;
    height: 12px;
    background: #3076FE;
    border-radius: 0px 0px 0px 0px;
    margin-top: 4px;
  }
  .itemApproveTimeFalse{
    margin-left: -55px;
  }
.headerRightFlase{
  background: #F3F8FF;
  width: 395px;
  height: 38px;
  border-radius: 4px 4px 0px 0px;
  display: flex;
  justify-content: space-between;
  padding: 10px;
  color: #666666;
  font-size: 14px;
  line-height: 20px;
  top: -20px;
  border: 1px solid #3076FE;
  .top-right{
    width: 160px;
    display: flex;
    // justify-content: space-around;
    justify-content: space-between;
    font-size: 12px;
    .headerRightspan2{
      color: #3076FE
    }
  }
}
.contntDiv{
  width: 355px;
  height: 200px;
  background: #F3F8FF;
  border-radius: 4px 4px 4px 4px;
  border: 1px solid #EEEEEE;
  padding: 10px;
  // margin: 14px;
  margin: 8px 14px;
  >div{
    display: flex;
    justify-content: space-between;
    margin-top: 5px;
  }
  .contntDiv-1-span{
    width: 116px;
    height: 20px;
    font-size: 14px;
    color: #262626;
    line-height: 0px;
    text-align: left;
  }
  .contntDiv-2-span{
    font-size: 10px;
    color: #1890FF;
    text-align: center;
    height: 16px;
    background: #E3F2FF;
    border-radius: 2px 2px 2px 2px;
    margin-left: 14px;
  }
  .contntDiv-1-d{
    height: 17px;
    font-size: 12px;
    color: #A3A3A3;
  }
  .line{
    background: #F3F8FF;
    border: 1px dotted #A3A3A3;
  }
  .contntDiv-item-left{
    // width: 100px;
    height: 18px;
    font-size: 13px;
    color: #A3A3A3;
  }
  .contntDiv-item-right{
    // width: 112px;
    height: 18px;
    font-size: 13px;
    color: #262626;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  .contntDiv-item-right-bottom{
    height: 18px; 
    font-size: 13px;
    color: #262626;
    text-align: left;
    display: flex;
    justify-content: flex-end;
  }
}

.box-approve {
  min-height: 130px;
  max-height: calc(100% - 82px);
  overflow: auto;
  margin-top: -5px;
}
.step-icon {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #A3A3A3;
  border: 1px solid #A3A3A3;
  margin-left: 50px;
  // margin-top: 0px;
}
.titleDiv{
  display: flex;
  width: 155px;
  .time {
    color: #c2c2c2;
    font-size: 12px;
    margin-left: 90px;
    width: 100px;
  }
}

:deep(.el-steps) {
  height: 100%;
}
:deep(.el-step__line){
  background: #E8F0FF;
  border: 1px dotted #A3A3A3;
  margin-left: 87px;
  margin-top: 20px;
  height: calc(100% - 20px);
}
:deep(.el-step__main) {
  padding: 8px 8px 9px;
  // background-color: #f1f6ff;
  min-height: 58px;
  box-sizing: border-box;
  margin-bottom: 12px;
  .el-step__description {
    font-size: 14px;
  }
}
:deep(.el-step__title){
  margin-left: 11px;
  color: #e0e0e0;
}
// :deep(.el-step__head){
//   // margin-left:110px;
// }
.reject-box {
  font-size: 12px;
  color: #a3a3a3;
  .reject-item-1 {
    display: flex;
    & > div:nth-child(1) {
      flex-shrink: 0;
    }
    & > div:nth-child(2) {
      word-break: break-word;
      width: 100%;
    }
  }
}
.descriptionDiv{
  height: 100%;
  width: 264px;
  margin-left: 76px;
  margin-top: -20px;
}
</style>

完成,请指教
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1618477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

捕捉信号的处理

文章目录 信号捕捉 信号捕捉 信号捕捉是进程从内核态返回用户态时会对信号进行检测处理。 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户程序注册了SIGQUIT信号的处…

linux——cron定时任务

cron定时任务配置文件中可以查看一些信息 crontab就是在提交以及管理需要周期性执行的任务 定时任务具体实现需要使用crontab命令编辑对应定时任务文件 这里执行定时任务&#xff0c;每分钟创建一个文件1.txt

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中&#xff0c;实现了多种垃圾收集器&#xff0c; 包括&#xff1a; 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS&#xff08;并发&#xff09;垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低&#xff0c;使用较少 2.并行垃圾回收器 3.并发垃圾回…

mysql download 2024

好久没在官网下载 mysql server 安装包。今天想下载发现&#xff1a; 我访问mysql官网的速度好慢啊。mysql server 的下载页面在哪里啊&#xff0c;一下两下找不到。 最后&#xff0c;慢慢悠悠终于找到了下载页面&#xff0c;如下&#xff1a; https://dev.mysql.com/downlo…

3 命名实体识别调优化

能走到这里说明你对模型微调有了一个基本的认识。那么开始一段命名实体的任务过程&#xff0c;下面使用huggingface官网的数据。 1 准备模型 下面的模型自己选择一个吧&#xff0c;我的内存太第一个模型跑不了。 https://huggingface.co/ckiplab/bert-base-chinese-ner/tree…

医学访问学者专栏—研究领域及工作内容

在国外访问学者申请中&#xff0c;医学领域的研究、教学及从业人员占有相当大的比例&#xff0c;这些医学访问学者的研究领域及工作内容都有哪些&#xff1f;本文知识人网小编就相关问题进行详细阐述&#xff0c;并附带案例说明。 一、在国外做医学访问学者可以从事哪些工作&am…

Win10 打开有些软件主界面会白屏不显示,其他软件都正常

环境&#xff1a; Win10专业版 英伟达4070 显卡 问题描述&#xff1a; Win10 打开有些软件主界面会白屏不显示,打开远程协助软件AIRMdesk,白色&#xff0c;其他软件都正常 解决方案&#xff1a; 网上说电脑没有接显示器独立显卡的关系导致 我是只有一台主机&#xff0c;没…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …

DRF 查询(排序、过滤、分页)

查询(排序、过滤、分页) 【0】准备 &#xff08;1&#xff09;Q查询 详细内容可见&#xff1a;Django模型层-CSDN博客Django 的 Q 对象提供了一种在数据库查询中构造复杂查询的方法。当你想在单个查询中组合多个过滤条件&#xff0c;并且这些条件之间不仅仅是简单的 AND 关系…

MySQL8.0.36-社区版:二进制日志(4)

什么是二进制日志&#xff08;binlog&#xff09;&#xff1a;记录了所有的ddl和dml语句&#xff0c;但是不包括查询类的 二进制日志的作用&#xff1a;1.灾难恢复&#xff0c;2.mysql主从复制 查看二进制日志状态 show variables like %log_bin%; 在mysql8中默认是开启的 | l…

TLV61048非同步升压BOOST转换器输入电压2.6-5.5V输出电流4A输出电压最高15V

推荐原因&#xff1a; 输入电压较低&#xff0c;输出电流可达3.5A SOT23-6封装 批量价格约0.70元 TLV61048引脚 TLV61048引脚功能 7 详细说明 7.1 概述 TLV61048是一款非同步升压转换器&#xff0c;支持高达 15 V 的输出电压和输入范围从 2.61 V 到 5.5 V。该TLV61048集成了…

C++ map和set的应用

1. 关联式容器 我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。那什么是关联式容器&#xff1f;它…

如何用Java语言实现远程控制多路照明

如何用Java语言实现远程控制多路照明呢&#xff1f; 本文描述了使用Java语言调用HTTP接口&#xff0c;实现控制多路照明。通过多路控制器&#xff0c;可独立远程控制多路照明。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1智能WiFi控…

hcia datacom课程学习(7):直连路由、静态路由

直连路由路由器接口上的网络&#xff08;接口配置了IP地址并且开启&#xff09;静态路由管理员手工添加的网络动态路由路由器之间动态学习形成的网络 1.直连路由 每当给路由器的一个接口配置了ip&#xff0c;路由表中就会产生对应的直连路由 配置路由接口ip的命令&#xff1…

编辑个人百度百科词条的小窍门,让你一次通过!

个人百度百科词条展示的是个人专业素养和成就&#xff0c;能够提升个人品牌形象&#xff0c;增加社交圈子中的竞争力。个人百度百科词条编辑攻略&#xff1a;如何通过审核&#xff1f;大家好&#xff01;今天伯乐网络传媒来分享一个超实用的经验——如何编辑个人百度百科词条才…

VM安装openwrt

openwrt是什么 OPENWRT是一种嵌入式操作系统&#xff0c;旨在取代原始路由器 固件 &#xff0c;并提供更多功能和自定义选项。 它构建在Linux内核之上&#xff0c;并由一系列 软件 包组成&#xff0c;以满足各种网络需求。 下载 官网下载地址&#xff1a;Index of /releases…

力扣-2259移除指定数字得到的最大结果

思路&#xff1a; 1. def removeDigit(self, number: str, digit: str) -> str:&#xff1a;这是一个类方法&#xff0c;接受两个参数 number 和 digit&#xff0c;分别表示输入的数字字符串和要移除的数字字符&#xff0c;返回一个字符串。 2. n len(number)&#xff1a…

内网穿透工具(zerotier, tailscale)

内网穿透工具 zerotier tailscale 一、Zerotier1. Zerotier 网页注册2. Zerotier 网页使用(1) Zerotier 网页配置 3. Zeritier 终端配置(1) Zeritier 终端下载(2) Zeritier 终端连接 二、Tailscale1. 进入主页2. Tailscale 网页注册登录3. Tailscale 网页添加设备4. Tailscale …

解决方案 SHUTDOWN_STATE xmlrpclib.py line: 794 ERROR: supervisor shutting down

Supervisor操作命令 重新加载 Supervisor 配置&#xff1a; sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all这将重新读取 Supervisor 的配置文件&#xff0c;更新进程组&#xff0c;然后重启所有进程。 查看 Supervisor 日志&#xff1…

【系统架构师】-选择题(一)

1、信息系统规划方法中&#xff0c;关键成功因素法通过对关键成功因素的识别&#xff0c;找出实现目标所需要的关键信息集合&#xff0c;从而确定系统开发的 &#xff08;优先次序&#xff09; 。关键成功因素来源于组织的目标&#xff0c;通过组织的目标分解和关键成功因素识别…