JS antdv实现表格树形级联效果

这篇具有很好参考价值的文章主要介绍了JS antdv实现表格树形级联效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

项目中需实现以下这种效果:级联数据,表格横向排列,数据之间相互联动。现有UI组件无法满足此需求,只能撸起袖子加油干!!
JS antdv实现表格树形级联效果,javascript,前端,vue,antDv组件
实现效果如下
JS antdv实现表格树形级联效果,javascript,前端,vue,antDv组件
开发前先准备一个树形数据 treeData.js

const treeData = [
  {
    areaName: "江苏",
    areaCode: "100",
    checked: false,
    indeterminate: false,
    order: 1,
    children: [
      {
        areaName: "无锡",
        areaCode: "1001",
        parentCode: "100",
        checked: false,
        indeterminate: false,
        order: 1,
        children: [
          {
            areaName: "鼓楼区",
            areaCode: "10011",
            parentCode: "1001",
            checked: false,
            indeterminate: false,
            order: 1,
            children: [],
          },
          {
            areaName: "玄武区",
            areaCode: "10012",
            parentCode: "1001",
            checked: false,
            indeterminate: false,
            order: 2,
            children: [],
          },
          {
            areaName: "秦港区",
            areaCode: "10013",
            parentCode: "1001",
            checked: false,
            indeterminate: false,
            order: 3,
            children: [],
          },
          {
            areaName: "浦口区",
            areaCode: "10014",
            parentCode: "1001",
            checked: false,
            indeterminate: false,
            order: 4,
            children: [],
          },
        ],
      },
      {
        areaName: "南京",
        areaCode: "1002",
        parentCode: "100",
        checked: false,
        indeterminate: false,
        order: 1,
        children: [
          {
            areaName: "鼓楼区2",
            areaCode: "10021",
            parentCode: "1002",
            checked: false,
            indeterminate: false,
            order: 1,
            children: [],
          },
          {
            areaName: "玄武区2",
            areaCode: "10022",
            parentCode: "1002",
            checked: false,
            indeterminate: false,
            order: 2,
            children: [],
          },
          {
            areaName: "秦港区2",
            areaCode: "10023",
            parentCode: "1002",
            checked: false,
            indeterminate: false,
            order: 3,
            children: [],
          },
          {
            areaName: "浦口区2",
            areaCode: "10024",
            parentCode: "1002",
            checked: false,
            indeterminate: false,
            order: 4,
            children: [],
          },
        ],
      },
    ],
  },
  {
    areaName: "浙江",
    areaCode: "200",
    checked: false,
    indeterminate: false,
    order: 1,
    children: [
      {
        areaName: "杭州",
        areaCode: "2001",
        parentCode: "200",
        checked: false,
        indeterminate: false,
        order: 1,
        children: [
          {
            areaName: "鼓楼区1",
            areaCode: "20011",
            parentCode: "2001",
            checked: false,
            indeterminate: false,
            order: 1,
            children: [],
          },
          {
            areaName: "玄武区1",
            areaCode: "20012",
            parentCode: "2001",
            checked: false,
            indeterminate: false,
            order: 2,
            children: [],
          },
          {
            areaName: "秦港区1",
            areaCode: "20013",
            parentCode: "2001",
            checked: false,
            indeterminate: false,
            order: 3,
            children: [],
          },
          {
            areaName: "浦口区1",
            areaCode: "20014",
            parentCode: "2001",
            checked: false,
            indeterminate: false,
            order: 4,
            children: [],
          },
        ],
      },
      {
        areaName: "宁波",
        areaCode: "2002",
        parentCode: "200",
        checked: false,
        indeterminate: false,
        order: 1,
        children: [
          {
            areaName: "鼓楼区2",
            areaCode: "20021",
            parentCode: "2002",
            checked: false,
            indeterminate: false,
            order: 1,
            children: [],
          },
          {
            areaName: "玄武区2",
            areaCode: "20022",
            parentCode: "2002",
            checked: false,
            indeterminate: false,
            order: 2,
            children: [],
          },
          {
            areaName: "秦港区2",
            areaCode: "20023",
            parentCode: "2002",
            checked: false,
            indeterminate: false,
            order: 3,
            children: [],
          },
          {
            areaName: "浦口区2",
            areaCode: "20024",
            parentCode: "2002",
            checked: false,
            indeterminate: false,
            order: 4,
            children: [],
          },
        ],
      },
    ],
  },
];
export default treeData;

完整代码
具体的每一个细节我都在代码注释了,这里就不单独抽出来赘述了,详细的分析请看大屏幕…文章来源地址https://www.toymoban.com/news/detail-528238.html

<template>
  <a-modal
    :title="addConfig.title"
    :showSubmit="false"
    :visible="addConfig.visible"
    @ok="handleAddOk"
    @cancel="handleCancel"
  >
    <div class="container_box">
      <div class="container_header">
        <div v-for="item in 3" :key="item" class="header_item">
          <div class="title"><span>名称</span></div>
          <div class="title"><span>排序</span></div>
        </div>
      </div>
      <div class="container_body">
        <div class="body_item" v-for="(list, index) in listData" :key="index">
          <div
            class="item_list"
            :style="{
              backgroundColor: item.clickStatus
                ? 'rgba(19,194,194,.3)'
                : '#ffffff',
            }"
            v-for="item in list"
            :key="item.areaCode"
            @click.capture="handleClickAreaItem(item)"
          >
            <div class="item">
              <a-checkbox
                :indeterminate="item.indeterminate"
                v-model="item.checked"
                @change="onCheckAllChange($event, item)"
              >
                {{ item.areaName }}
              </a-checkbox>
            </div>
            <div class="item">
              <a-input v-model="item.order" placeholder="排序" />
            </div>
          </div>
        </div>
      </div>
    </div>
  </a-modal>
</template>

<script>
import treeData from "./treeData";
let filterData = [];
export default {
  name: "addArea",
  props: {
    addConfig: Object,
  },
  data() {
    return {
      listData: [],
    };
  },
  mounted() {
    this.handleTreeData(treeData, 1);
    // 初始化数据
    treeData[0].clickStatus = true;
    treeData[0].children[0].clickStatus = true;
    this.listData = [
      treeData,
      treeData[0].children,
      treeData[0].children[0].children,
    ];
  },
  methods: {
    // 点击每一个item 显示选中状态并进行数据联动
    handleClickAreaItem(item) {
      if (item.level === 3) return;
      let list = [];
      if (item.parentCode) {
        // 点击第二或第三级
        this.handleFilterData(treeData, item.parentCode);
        list = filterData[0]?.children;
      } else {
        // 点击第一级
        list = treeData;
        // 切换第一级时 第二级默认选择第一个
        let arr = treeData.filter((lis) => lis.areaCode === item.areaCode);
        arr[0]?.children.forEach((lis, index) => {
          if (index === 0) {
            lis.clickStatus = true;
          } else {
            lis.clickStatus = false;
          }
        });
      }
      list.forEach((lis) => {
        if (lis.areaCode === item.areaCode) {
          lis.clickStatus = true;
          // 子级数据跟随联动
          if (item.level === 1) {
            this.listData[1] = lis.children;
            this.listData[2] = lis.children[0].children;
          } else if (item.level === 2) {
            this.listData[2] = lis.children;
          }
        } else {
          lis.clickStatus = false;
        }
      });
    },
    handleTreeData(list, levelIndex) {
      list.forEach((lis) => {
        lis.clickStatus = false;
        // 动态标记每层层级
        lis.level = levelIndex;
        if (lis.children && lis.children.length !== 0)
          this.handleTreeData(lis.children, levelIndex + 1);
      });
    },
    handleAddOk(e) {
      e && e.preventDefault();
    },
    handleCancel() {
      this.$emit("cancel");
    },
    // 向下处理树形选中/未选中
    handleDownTreeCheck(arr, checked) {
      arr.forEach((iii) => {
        iii.indeterminate = false;
        iii.checked = checked;
        if (iii.children && iii.children.length !== 0)
          this.handleDownTreeCheck(iii.children, checked);
      });
    },
    // 向上处理树形选中/未选中
    handleUpTreeCheck(item) {
      this.handleFilterData(treeData, item.parentCode);
      let list = filterData[0];
      let status1 = list.children.some((ii) => ii.checked);
      let status2 = list.children.every((ii) => ii.checked);
      let statusIn = list.children.some((ii) => ii.indeterminate);
      // 当不全选中且子集有勾选中 或者 子集有indeterminate状态为true
      list.indeterminate = status1 || statusIn;
      // 当全选中的时候 indeterminate 状态 为false
      if (status2) list.indeterminate = false;
      list.checked = status2;
      // 层层向上处理
      if (list.parentCode) this.handleUpTreeCheck(list);
    },
    onCheckAllChange(e, item) {
      item.indeterminate = false;
      filterData = [];
      // 当前点击的该项中有父级的情况下 比如当前点击项为第二、三....
      if (item.parentCode) this.handleFilterData(treeData, item.parentCode);
      // 当前点击的该项中存在父级数据情况下 比如当前点击项为第二、三.... 则向上处理元素状态
      if (filterData.length > 0) this.handleUpTreeCheck(item);
      // 当前点击的该项中存在子集数据情况下 则向下处理元素状态
      if (item.children && item.children.length > 0)
        this.handleDownTreeCheck(item.children, e.target.checked);
    },
    handleFilterData(list, parentCode) {
      // 过滤数据
      list.forEach((lis) => {
        if (lis.areaCode === parentCode) {
          filterData = [];
          filterData.push(lis);
        }
        if (lis.children && lis.children.length !== 0)
          this.handleFilterData(lis.children, parentCode);
      });
    },
  },
};
</script>

<style lang="less" scoped>
/deep/.ant-modal {
  width: 840px !important;
  .ant-modal-close {
    color: #fff;
    .ant-modal-close-x {
      height: 47px;
      line-height: 47px;
    }
  }
  .ant-modal-header {
    padding: 12px 20px;
    background-color: #02c7b5;
    .ant-modal-title {
      font-size: 16px;
      font-weight: 500;
      color: #ffffff;
    }
  }
  .ant-modal-body {
    // padding: 24px 27px 6px;
  }
  .container_box {
    width: 100%;
    height: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    .container_header {
      display: flex;
      align-items: center;
      width: 100%;
      background-color: #f4f7fb !important;
      border-radius: 6px 6px 0px 0px;
      .header_item {
        flex: 4;
        height: 42px;
        line-height: 42px;
        display: flex;
        align-items: center;
        .title {
          flex: 6;
          text-align: center;
          font-size: 14px;
          font-weight: 400;
          color: #242525;
        }
      }
    }
    .container_body {
      display: flex;
      width: 100%;
      .body_item {
        flex: 4;
        flex-direction: column;
        .item_list {
          display: flex;
          align-items: center;
          margin-top: 10px;
          .item {
            flex: 6;
            text-align: center;
            font-size: 14px;
            font-weight: 400;
            color: #242525;
            .ant-input {
              width: 86px !important;
            }
          }
        }
        &:nth-child(2) {
          border-left: 2px solid #f1f1f1;
          border-right: 2px solid #f1f1f1;
        }
      }
    }
  }
}
</style>

到了这里,关于JS antdv实现表格树形级联效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前后端的那些事】开源!前后端环境搭建+树形结构表格实现

    前言 :最近写项目,发现了一些很有意思的功能,想写文章,录视频把这些内容记录下。但这些功能太零碎,如果为每个功能都单独搭建一个项目,这明显不合适。于是我想,就搭建一个项目,把那些我想将的小功能全部整合到一起。实现搭一次环境,处处使用。 本文主要

    2024年02月01日
    浏览(49)
  • 【前端】vue3 接入antdv表单校验

    1、表单校验是非常常见的需求,能够有效的拦截大部分的错误数据,提升效率。 2、快速的给使用者提示和反馈,用户体验感非常好。 3、成熟的表单校验框架,开发效率高,bug少。 最近使用的是vue3+antdv的架子,仔细探究一下表单校验的问题,总结一下。 框架可能不同,主

    2024年02月11日
    浏览(42)
  • vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

    一、TableTreeLevel组件 

    2024年02月15日
    浏览(54)
  • 前端常用js、css效果

    效果 主要整理了几个常用的,方便平时做项目的时候参考 文本横向滚动 文本无限滚动 无缝轮播 无缝滚动 盒子上下滚动 樱花飘落效果 参考代码 文本横向滚动 文本无限滚动 无缝轮播 无缝滚动 盒子上下移动 樱花飘落 添加插件sakura.js就可以了,不用什么代码

    2024年02月02日
    浏览(39)
  • vue实现elementUI table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题

    在使用element-ui的table组件时,使用树形结构,并使用了懒加载,可出现了一个问题,在对当前节点添加一个子节点数据,或删除一个子节点数据时,当前节点的子节点数据并不自动刷新出来。element-ui官方没有提供实时刷新子节点数据的方法。 可以使用window.location.reload();但每

    2024年02月09日
    浏览(48)
  • java返回前端树形结构数据(2种实现方式)

    0.思想 首先找到一级目录(类别),然后从一级目录(类别)递归获取所有子目录(类别),并组合成为一个“目录树” 1.普通实现:controller层传的是0层,就是一级目录层,从这里开始往下递归。 2.stream流实现: 3.实体类集合专VO类集合的工具类 入参为未知类型的实体集合

    2024年02月04日
    浏览(35)
  • Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)

    Rspack CLI 官方文档。 rspack.config.js 官方文档。 创建项目(文档中还提供了 Rspack 内置 monorepo 框架 Nx 的创建方式,根据需求进行选择) 创建好项目并运行,目前 Rspack 版本支持的工程模版: 默认创建的 vue 项目为 vue3 : 如果需要其他版本,或其他框架的基础工程,可到官方提

    2024年02月11日
    浏览(54)
  • 【D3.js Tidy tree绘制树形图,单棵树,左右树,平移,拖拽,树形中的天花板实现,源码实现】

    D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档。听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。可以帮助你使用 HTML, CSS, SVG 以及 Canvas 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他

    2024年04月12日
    浏览(38)
  • ElementUI 树形表格的使用以及表单嵌套树形表格的校验问题等汇总

    目录 一、树形表格如何添加序号体现层级关系  二、树形表格展开收缩图标位置放置,设置指定列 三、表单嵌套树形表格的校验问题以及如何给校验rules传参 普通表格绑定如下:这种方法只能校验表格的第一层,树形需要递归设置子级节点prop。 树形表格绑定如下:使用下面

    2024年02月11日
    浏览(46)
  • Lottie--前端动画效果--UI输出json格式--lottie动画在JavaScript中使用

    Lottie一个适用于Web、Android、iOS、React Native和Window的移动库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并再移动设备上进行本地渲染。 1.需要引入JavaScript文件,我使用的是cdn中的链接。这里直接上链接,按需取用。点这里 2.json格式的文件 我不是UI啊,我也

    2023年04月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包