Antd——如何给树形控件增加编辑删除

简介: Antd——如何给树形控件增加编辑删除

前言

使用Ant Design Vue进行开发,部门管理试树形控件,不过现有的组件并没有提供相应的功能,所以我们要改造一番;

内容

API文档

其实也可以通过rightClick事件,增加一个右键菜单,不过和原型不符所以我们通过插槽的方式

数据组装

我们要对数据进行组装,插入scopedSlots: { title: 'xxx'} | xxx可以自定义

// 数据组装
function cover(arr) {
    arr.forEach((item) => {
    item.title = item.department_name
    item.value = item._id
    item.key = item._id
    item.scopedSlots = {title: 'title'}
    if (item.sub && item.sub.length) {
      item.children = item.sub
      cover(item.children)
    }
  })
  return arr
}
// 把公司加到第一级部门去
let newdata = [
  {
    department_name: '公司',
    _id: "0",
    sub: JSON.parse(JSON.stringify(data.data))
  },
]
// 树形组件
this.departmentArr = cover(newdata)

示例代码

只是一个示例|给大家一个思路|一些业务代码删除了| 主要是1,2的操作

<template>
  <a-row>
<!--部门模块-->
    <a-col :span="5" style="min-width: 180px; margin-right: 10px;">
      <a-card>
        <a-row type="flex" justify="start">
          <a-col :span="2">
            <span class="cu-line"></span>
          </a-col>
          <a-col :span="20">
            <span style="font-size: 17px;">组织架构</span>
          </a-col>
          <a-col :span="2">
            <a-icon class="cu-icon"  @click="addDepartment" type="plus-square" />
          </a-col>
        </a-row>
      </a-card>
<!--部门树 TODO 后期优化为滚动列表-->
      <a-card style="min-height: 750px;">
        <a-spin :spinning="spinning">
          <a-tree
              :tree-data="departmentArr"
              :replaceFields="replaceFields"
              :expanded-keys="expandedKeys"
              v-model="defaultCheckedKeys"
              @expand="onExpand"
          >
            <!--2.插槽-->
            <template #title="item">
              <a-row type="flex">
                <a-col flex="auto"><span>{{ item.title }}</span></a-col>
                <a-col flex="50px" v-show="item._id !== '0'">
                  <a-icon type="edit" @click="editDepartment(item)" style="margin-right: 10px"/>
                  <a-icon type="delete" @click="deleteDepartment(item._id)"/>
                </a-col>
              </a-row>
            </template>
          </a-tree>
        </a-spin>
      </a-card>
    </a-col>
  </a-row>
</template>
export default {
  data() {
    return {
      // 通用
      labelCol: { span: 4 },
      wrapperCol: { span: 14 },
      // 部门相关
      spinning: false,
      departmentModel: {
        modalVisible: false,
        loading: false,
        title: ''
      },
      departmentFormData: {
        department_name: "",
        parent_id: "",
      },
      departmentModalLoading: false,
      departmentArr: [],
      expandedKeys: [],
      defaultCheckedKeys: [],
      replaceFields: {
        children: "sub",
        title: "department_name",
        key: "_id",
      },
    }
   },
  methods: {
    /**
     * 部门相关操作
     */
    // 获取部门数据
    getDepartmentList() {
      this.spinning = true
      let payload = {
        data: {
          pageNum: 1,
          pageSize: 1000,
        },
      }
      this.$mqtt.doPublish(
          {
            pubTopic: "xxxxx",
            payload,
          },
          (topic, data) => {
         
            data.data
            // 1. 数据组装
            function cover(arr) {
              arr.forEach((item) => {
                item.title = item.department_name
                item.value = item._id
                item.key = item._id
                // 增加scopedSlots属性
                item.scopedSlots = {title: 'title'}
                if (item.sub && item.sub.length) {
                  item.children = item.sub
                  cover(item.children)
                }
              })
              return arr
            }
            // 把公司加到第一级部门去
            let newdata = [
              {
                department_name: '公司',
                _id: "0",
                sub: JSON.parse(JSON.stringify(data.data))
              },
            ]
            // 树形组件
            this.departmentArr = cover(newdata)
            this.spinning = false
          },
          this
      )
    },
    // 展开选项
    onExpand(expandedKeys) {
      this.expandedKeys = expandedKeys
    },
  }
}

效果

学无止境,谦卑而行.

目录
相关文章
ant-design Upload上传组件使用 编辑功能图片回显
ant-design Upload上传组件使用 编辑功能图片回显
1671 0
|
缓存 前端开发 JavaScript
如何配置Vite以确保最佳的Tree Shaking效果?
如何配置Vite以确保最佳的Tree Shaking效果?
1745 57
|
缓存 NoSQL Java
RedisTemplate操作Redis,这一篇文章就够了
redis是一款开源的Key-Value数据库,运行在内存中,由C语言编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 等。
3772 1
|
人工智能 移动开发 JavaScript
AI + 低代码技术揭秘(六):包结构和 Monorepo
VTJ低代码平台采用monorepo结构,基于PNPM和Lerna进行包管理,实现跨包版本同步与依赖管理。核心包如@vtj/base、@vtj/utils和@vtj/core提供基础类型、工具函数及数据模型。运行时包负责DSL解析、渲染和代码生成,设计器支持可视化开发,本地服务实现文件管理和项目构建。平台通过统一构建系统支持Web、UniApp等多端部署。
612 0
|
JavaScript
Vue3滑动输入条(Slider)
这是一个可高度定制的滑动输入条组件,支持多种配置选项,如宽度、最小值、最大值、是否禁用、双滑块模式等。主要功能包括点击滑动条快速定位并获取数值、拖动滑块调整数值、键盘操作调整数值以及自定义Tooltip显示格式。组件通过监听DOM尺寸变化来动态调整布局,并利用requestAnimationFrame优化动画效果,提供了丰富的交互体验。在线预览和详细代码示例可见[这里](https://themusecatcher.github.io/vue-amazing-ui/guide/components/slider.html)。
791 4
Vue3滑动输入条(Slider)
|
JavaScript CDN
Bootstrap-table:轻松实现多层表头
Bootstrap-table:轻松实现多层表头
851 0
Bootstrap-table:轻松实现多层表头
|
前端开发 JavaScript API
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
1564 4
基于antd实现动态修改节点的Tree组件
基于antd实现动态修改节点的Tree组件
1455 0
在Vue3项目中使用 vue3-seamless-scroll 无缝滚动插件
本文介绍了如何在Vue3项目中使用`vue3-seamless-scroll`插件实现无缝滚动效果,并提供了详细的示例代码和运行效果。
9175 0
|
JavaScript 开发者
在Vue中引入Message,弹窗提示错误信息
这篇文章讲述了在Vue CLI项目中如何处理异常,通过引入Message组件实现弹窗提示错误信息,帮助开发者排查和解决webpack等问题。

热门文章

最新文章