JavaScript递归处理,结合vue3+element plus+ts 做一个Table表格 +Checkbox多选框处理

JavaScript递归处理,结合vue3+element plus+ts 做一个Table表格 +Checkbox多选框处理不知你有没有遇到要实现如图这种table表格,选中父节点就包含子节点一起被选中状态 表格样式可以去看看element plus table 要做全选功能的话,可以看看这个element plus ch

不知你有没有遇到要实现如图这种table表格,选中父节点就包含子节点一起被选中状态 11.gif

表格样式可以去看看element plus table

要做全选功能的话,可以看看这个element plus checkbox

<script setup lang="ts">
// 数据根据后台接口变化,做个案例
const tableData = [
    {
    id: 0,
    children: [
      {
        id: 44,
        children: [
          {
            id: 66,
            children: null,
          },
        ],
      },
      {
        id: 55,
        children: null,
      },
    ],
  },
  {
    id: 5,
    children: [
      {
        id: 68,
        children: null,
      },
    ],
  },
]
const checkedCities = ref([])
// handleCheckedCitiesChange 是做全选功能会用到

const num = ref([] as any) // 获取选中值
const idsWithChildren = ref([] as any)  // 储存选中当前项的所有对象

// 查找tableData父节点下的子节点
function findAndExtractIds(startId) {
  // 父节点对象包含了多少子节点ID
  const contar = (val: any) => {
    const arts: any = val
    // 看父节点的children是否是array
    if (Array.isArray(arts.children)) {
      for (const items of val.children) {
        if (items.children === null) {
          num.value.push(items.id)
        }
        else {
            if (items.children) {
              num.value.push(items.id)
              contar(items) // 还有children 继续递归遍历
           }
        }
      }
    }
  }
  // 查询选中值,所对应的父节点所包含对象
  const find = (authsData: any, startId) => {
    for (const item of authsData) {
      if (item.id === startId) {
        num.value.push(item.id) // 储存选中的ID
        idsWithChildren.value.push(item)
        return contar(item)
      }
      else {
      // 查不到继续遍历
        if (item.children) {
          find(item.children, startId)
        }
      }
    }
  }
  const authsData = tableData.value
  find(authsData, startId)
}


// 判断当前的值是否在num存在
function ischecked(value) {
  return num.value.includes(value)
}
// handleCheck 开始获取点击选中的值
function handleCheck(value) {
    const arr = num.value
    if (ischecked(value)) {
        const handleCheck = (arrayToAdd: string[]) => {
          // 遍历的相同索引值
          const index = arrayToAdd.findIndex((items) => {
            return items === value
          })
          const parse = arr.splice(index, 1) // 删除对应的选中id
          tableData.value = parse  // 赋值
       }
       handleCheck(arr)
    }
    else {
        findAndExtractIds(value) // 处理js递归
        tableData.value = [...new Set(arr)] // 去掉重复选择的项
        checkedCities.value = Number.parseInt(value) ? arr : []
   }
}


</script>
<template>
    <el-form>
        // 案例 
        <el-table :data="tableData" style="width: 100%">
            <el-table-column prop="meta.title" label="模块" width="180" />
            <el-table-column label="权限">
              <template #default="scope">
                <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
                  <el-checkbox
                    :key="scope.row.id" :label="scope.row.id"
                    @change="handleCheck(scope.row.id)"
                  >
                    选择
                  </el-checkbox>
                </el-checkbox-group>
              </template>
            </el-table-column>
          </el-table>
    </el-form>
</template>

后续还有需要完善的地方,到时候在补充下,以及多选选择,还没有完善反选多选….

今天的文章JavaScript递归处理,结合vue3+element plus+ts 做一个Table表格 +Checkbox多选框处理分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59642.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注