vue3+elementPlus表格嵌套外层表格多选联动内层表格选中状态

这里写自定义目录标题

问题描述

最近要实现的一个功能,两层表格嵌套,外层表格多选需要关联到内层表格数据的选中状态。如果是普通的树形表格,多选全选都可以正常选到数据的子级,问题是嵌套的表格勾选外层数据无法关联到里面的表格。
在这里插入图片描述
解决思路:监听外层表格选中数据,

el-table代码

		<!-- 外层表格 -->
		<el-table :data="tableData" @selection-change="handleOuterSelectionChange" default-expand-all>
            <el-table-column type="selection" width="55"></el-table-column>
            <el-table-column type="expand" >
                <template #default="scope">
                    <div class="nested-table-container">
                    	<!-- 内层表格 -->
                        <el-table :id="scope.row.dataId" :ref="el=>getimgManageRef(el, scope.row.dataId)" :data="scope.row.children" style="width: 100%" @selection-change="handleImgSelection">
                            <el-table-column type="selection" width="45" align="center" ></el-table-column>
                            <el-table-column prop="feenm" label="拇指图" align="center">
                                <template #default="prop">
                                    <img @click="srcImgDetail(prop.row.browseImageRelativeLocation)"
                                    :src="browseImageUrl+ prop.row.browseImageRelativeLocation" class="img" />
                                </template>
                            </el-table-column>
                            <el-table-column prop="productId" label="产品号" align="center"></el-table-column>
                            <el-table-column prop="satelliteId" label="卫星" align="center"></el-table-column>
                            <el-table-column prop="sensorId" label="传感器" align="center"></el-table-column>
                            <el-table-column prop="productLevel" label="级别" align="center"></el-table-column>
                            <el-table-column prop="createTime" label="采集时间" align="center"></el-table-column><el-table-column :label="$t('operation')" align="center">
                              <template #default="scope">
                                <!-- 详情 -->
                                <el-tooltip class="box-item" effect="dark" :content="$t('Checkdetails')" placement="bottom">
                                  <el-button type="success" @click="viewDetail(scope.row)" :icon="Search" circle />
                                </el-tooltip>
                              </template>
                            </el-table-column>
                        </el-table>
                    </div>
                </template>
            </el-table-column>
            <el-table-column prop="dataName" label="名称" align="center" width="200"></el-table-column>
            <el-table-column prop="describe" label="描述" align="center"></el-table-column>
            <el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
        </el-table>

后端返回数据格式:监听外层表格选中数据变化,手动勾选对应的子级表格
在这里插入图片描述

const selectedOutRows = ref({});  //外层表格勾选数据
  // 外层表格行勾选事件
const handleOuterSelectionChange = (selection) => {
  selectedOutRows.value = {} //先清空
  selection.forEach((item) => {
    if (!selectedOutRows.value[item.dataId]) {
      if(item.children){
        selectedOutRows.value[item.dataId] = item.children.map((innerItem) => innerItem);
      }
    }
  });
};

// 内层表格ref 实例  
// 需要注意的是,el-table需要是展开状态(default-expand-all),折叠起来的话获取不到内层表格ref实例
const imgManageRefList = ref([])   
const getimgManageRef = (el, dataId) => {
  if(el){
    imgManageRefList.value[dataId] = el
  }
}

//表格数据 
const tableData = ref([])

// 监听selectedOutRows的变化,实现自动勾选内层表格
watch(selectedOutRows, (newVal) => {
  // 先清除所有内层勾选
  tableData.value.forEach(row => {
    imgManageRefList.value[row.dataId].clearSelection()
  })
  // 再根据外层勾选去勾选内层表格
  for (const dataId in newVal) {
    if (newVal[dataId]) {
      // 这里外层表格每行数据的dataId是唯一的
      const outerRow = tableData.value.find((row) => row.dataId === dataId);
      if (outerRow) {
        // 将内层表格的数据设置为勾选状态
        outerRow.children.forEach((innerItem) => {
            // 这里需要根据实际的内层表格组件API进行调整
            imgManageRefList.value[dataId].toggleRowSelection(innerItem, true);
        });
      }
    }
  }
}, { deep: true });


// 内层表格选择发生改变
const handleImgSelection = (selectionList) => {
  let selectRowsList = []
  tableData.value.forEach(row => {
    // 通过每个内层表格的ref实例的getSelectionRows方法获取已选中数据
    selectRowsList.push(imgManageRefList.value[row.dataId].getSelectionRows())
  })
}

目前只写了外层表格多选关联内层表格,内层还没有关联上外层

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值