首页 > 其他分享 >基于 Ant Design Vue实现tree的增删改

基于 Ant Design Vue实现tree的增删改

时间:2022-12-26 09:12:18浏览次数:69  
标签:ant arr Vue tree value Ant vue design parentNode

背景:

在维护的项目是基于Ant Design Vue 框架实现的,需求是新建时,前端需要将树形结构维护完成后,一次性调用接口进行下发,在网上找了半天资料,要不源码不全,要不就是增删改后实时和后台交互,不符合要求,所以在这里将实现过程写出来,仅供学习交流。

使用前须知:

  • 因为Vue3的项目,所以首先需要初始化Vue3的项目

  • 因为基于Ant Design Vue框架实现,所以需要安装Ant Design Vue组件库

实现步骤:

  • 使用命令npm init vue@latest初始化Vue3项目(如果是已有项目中使用,就不需要这个步骤了)

选择自己所需安装内容:

  • 进入项目文件下,安装依赖后启动
cd <your-project-name>
npm install
npm run dev
  • 安装Ant Design Vue: npm i --save ant-design-vue

  • 在main.js引入:

import { createApp } from 'vue'
import App from './App.vue'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'

createApp(App).use(Antd).mount('#app')
  • 因为要使用 Ant Design Vue的icon图标,所以安装该组件:npm install --save @ant-design/icons-vue

  • 直接在App.vue中写这个demo

<template>
  <header>
    ant-design-vue tree 增删改
  </header>
  <main>
    <a-button type="primary" @click="addComp" v-if="!treeData.length">添加根节点</a-button>
    <a-tree v-if="treeData && treeData.length > 0" :autoExpandParent="true" :tree-data="treeData" :defaultExpandAll="true" showLine blockNode>
      <template v-slot:title="nodeData">
        <span> {{nodeData.name}} </span>
        <a-button-group style="float:right">
          <!--            <a-button size="small" @click="slotAddSame(nodeData)" icon="plus-circle" title="添加同级"></a-button>-->
          <a-button size="small" @click="addComp(nodeData)" title="添加下级">
            <plus-square-outlined />
          </a-button>
          <a-button size="small" @click="slotModify(nodeData)" title="修改">
            <form-outlined />
          </a-button>
          <a-popconfirm title="确定删除该节点吗?" ok-text="确定" cancel-text="取消" @confirm="confirmDel">
            <a-button size="small" @click="slotDelete(nodeData)" title="删除">
              <delete-outlined />
            </a-button>
          </a-popconfirm>
        </a-button-group>
      </template>
    </a-tree>
    <a-modal v-model:visible="visible" title="新建节点" @ok="handleOk">
      名称:<a-input v-model:value="compName" placeholder="请输入节点名称" />
    </a-modal>
    <a-button class="get-btn" type="primary" @click="getTreeData" v-if="treeData.length">获取树的值</a-button>
  </main>
</template>

<script setup>
import {
  PlusSquareOutlined,
  FormOutlined,
  DeleteOutlined
} from '@ant-design/icons-vue';
import { notification } from 'ant-design-vue';
import { ref, toRaw } from 'vue';

const treeData = ref([])
const parentNode = ref({})
const visible = ref(false);
const compName = ref('')
const isUpdate = ref(false)

const showModal = () => {
  visible.value = true;
};

const handleOk = () => {
  if (isUpdate.value) {
    Object.assign(parentNode.value.dataRef, { name: compName.value})
  } else {
    if (!parentNode.value.name) {
      treeData.value.push({ name: compName.value, children: [], key: 0 })
    } else {
      parentNode.value.children.push({ name: compName.value, children: [], key: Math.random() })
    }
  }
  visible.value = false;
};

// 增加下级节点
function addComp(nodeData){
  isUpdate.value = false
  compName.value = ''
  parentNode.value = nodeData
  showModal()
}

// 修改当前节点
function slotModify(nodeData) {
  isUpdate.value = true
  parentNode.value = nodeData
  compName.value = nodeData.dataRef.name
  showModal()
}

// 删除当前节点
function slotDelete(nodeData) {
  parentNode.value = nodeData
}

// 确认删除当前节点
function confirmDel() {
  Object.assign(parentNode.value.dataRef, null)
  searchOption(parentNode.value.dataRef, treeData.value)
}

//  递归查找操作的节点,在父节点的children中删除
function searchOption (option, arr, obj = {}) {
  //首先循环arr最外层数据
  for (let s = 0; s < arr.length; s++) {
    //如果匹配到了arr最外层中的我需要删除的数据
    if (arr[s].key === option.key) {
      //删除即删除即可
      arr.splice(s, 1)
      break
    } else if (arr[s].children && arr[s].children.length > 0) {
      // 递归条件
      searchOption(option, arr[s].children, obj)
    } else {
      continue
    }
  }
}
// 弹框
const openNotification = (msg) => {
  notification.open({
    message: 'tree value',
    description: msg,
    onClick: () => {
      console.log('Notification Clicked!');
    },
    duration: 3,
  });
};
// 获取当前树的值
function getTreeData() {
  let details = toRaw(treeData.value)
  console.log(details)
  openNotification(JSON.stringify(details))
}

</script>

<style scoped>

header {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  font-weight: 600;
}
main{
  margin: 100px 400px;
}
.get-btn {
  margin-top: 50px;
}
</style>

完整代码路径:

https://github.com/guduqiucai/vue3-ant-design-tree

https://gitee.com/caicai521/vue3-ant-design-tree

标签:ant,arr,Vue,tree,value,Ant,vue,design,parentNode
From: https://www.cnblogs.com/caicai521/p/17004961.html

相关文章

  • 洛谷P4146 序列终结者 题解 splay tree
    题目链接:https://www.luogu.com.cn/problem/P4146题目大意:支持:区间更新(+x)区间翻转区间查询(最大值)解题思路:几乎和AcWing2437.Splay这题一模一样。示例程序:#inc......
  • vue中$attrs
    $attrs用来保存给子组件绑定了,但子组件没有接收的数据,如下://父组件...<Schoolv-bind="{a,b,c}"></School>...//子组件School...props:['a','b']...打印子......
  • vue.delete 删除数组
    删除数组指定索引的元素可以采用delete,Array.splice和vue.$delete三种方法如下所示:leta=[1,2,3,4,5]letb=[1,2,3,4,5]letc=[1,2,3,4,5]deletea[2]b.......
  • Vue3中页面不能根据props数据动态变化怎么办?
    解决方法:使用toRefs结构,使其具有响应式,再使用!import{reactive,defineProps,toRefs}from'vue';constprops=defineProps({xAxisData:{type:Array,......
  • 【Vue.js入门到实战教程】14-基于 Laravel Jetstream 的Vue 技术栈编写表单组件
    Laravel8引入Jetstream作为前端UI库在本月8号,Laravel8.0正式发布,随后Vue3.0 也正式发布,不过围绕Vue3生态的很多库还处于beta阶段,所以目前学院君这里的Vu......
  • ReentrantLock Condition await signal 专题
     Condition的执行方式,是当在线程T1中调用await方法后,线程T1将释放锁,并且将自己阻塞,等待唤醒,线程T2获取到锁后,开始做事,完毕后,调用Condition的signal方法,唤醒线程T1,在t2执行......
  • Vue之vue.config.js配置文件
    使用vueinspect>output.js可以查看到Vue脚手架的默认配置。使用vue.config.js可以对脚手架进行个性化定制,详情见:https://cli.vuejs.org/zh其中这个配置文件需要和pa......
  • Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) D
    D.RestorePermutation题链不难看出我们应该从后往前做我们设t[i]=i*(i-1)/2最后一个i肯定能在t数组直接找到比如我们找到了是3那么要是我们下一个是5我们就要把这个......
  • 【Vue.js入门到实战教程】12-在 Laravel 项目中编写单文件 Vue 组件
    我们在《​​【Vue.js入门到实战教程】11-VueLoader(下)|编写一个单文件Vue组件​​》中演示了如何在VueCLI原型项目中编写单文件Vue组件并进行编译,不过VueCLI是......
  • Vue之Render函数
    关于不同版本的Vue:   1.vue.js与vue.runtime.xxx.js的区别:      (1).vue.js是完整版的Vue,包含:核心功能+模板解析器。      (2).vue.runt......