VUE配合antDesign树形组件增删改

父组件

<template>
  <div id="app">
    <!--    //引用组件,将数据动态传递给组件-->
    <!--    弹窗start-->
    <a-modal
      :centered="true"
      title="保存病历"
      :visible="treemodalvisible"
      :confirm-loading="treemodalLoading"
      :ok-text="treemodalLoading==true?'提交修改中':'确定'"
      @ok="handleOk"
      @cancel="treemodalvisible=false"
    >
      <Tree :list="list" />
    </a-modal>
    <!--    弹窗end-->
  </div>
</template>
<script>
import Tree from './treeson'
export default {
  components:{
    Tree,//注册组件
  },
  data(){
    return {
      treemodalvisible:true,
      //递归组件的数据
      list:[{
        data:'数据1',
        open:true,
        id:1,
        children:[{
          data:'数据1-1',
          open:true,
          id:2,
          children:[{
            data:'数据1-1-1',
            open:true,
            id:3,
            children:[{
              data:'哈哈哈',
              open:true,
              id:123,
              children:[{
                data:'哈哈哈打灯',
                open:true,
                id:43223,
              }]
            },{
              data:'哈哈哈给她',
              open:true,
              id:53422
            }]
          }]
        },{
          data:'数据1-2',
          open:true,
          id:4
        }]
      },{
        data:'数据2',
        open:true,
        id:5,
        children:[{
          data:'数据2-1',
          open:true,
          id:6
        },{
          data:'数据2-2',
          open:true,
          id:7
        }]
      },{
        data:'数据3',
        open:true,
        id:8
      }]
    }
  },
  methods:{
    handleOk(){
            
    }
  }
}
</script>

子组件

<template>
  <div>
    <!--    弹窗start-->
    <a-modal
      :centered="true"
      :title="editOrAdd=='edit'?`编辑“${chosedTitle}”文件夹名`:`新增”${chosedTitle}“文件夹子集`"
      :visible="treemodalvisible"
      :confirm-loading="treemodalLoading"
      :ok-text="treemodalLoading==true?'提交修改中':'确定'"
      @ok="handleOk"
      @cancel="treemodalvisible=false"
    >
      <a-row>
        <a-col :span="10" style="text-align: right;height: 32px;line-height: 32px">
          <span v-if="editOrAdd=='add'">新增文件夹名:</span>
          <span v-if="editOrAdd=='edit'">编辑文件夹名:</span>
        </a-col>
        <a-col :span="10">
          <a-input placeholder="请输入文件夹名" v-model="inputName" />
        </a-col>
        <a-col :span="4" />
      </a-row>
    </a-modal>
    <!--    弹窗end-->

    <ul class="mingTree">
      <li
        :class="[item.children?'leftBorder':'']"
        v-for="(item) in list "
        :key="item.id"
        @click.stop="open(item)"
      >
        <span
          @mouseover="hoverIndex = item.id"
          @mouseleave="hoverIndex = null"
          class="itemText"
        >
          <span style="margin: 0 10px 0 0">
            <a-icon v-if="item.children" :type="item.open?'folder-open':'folder'" />
            <a-icon
              v-else
              type="file"
              style="font-size: 10px"
            />

            {{ item.data }}
          </span>
          <a-button-group v-if="item.id == hoverIndex">
            <a-button
              size="small"
              type="primary"
              @click.stop="add(item)"
            >
              增加子集
            </a-button>
            <a-button
              size="small"
              type="primary"
              @click.stop="update(item)"
            >
              修改
            </a-button>
            <a-button
              @click.stop="del(item)"
              size="small"
            >
              删除
            </a-button>
          </a-button-group>
        </span>
        <!--        //将children传递给组件,实现递归-->
        <Tree :list="item.children" v-show="item.open" />
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  name:'Tree',//自己调用自己
  data(){
    return{
      chosedTitle:'',
      editOrAdd:'',
      treemodalvisible:false,
      treemodalLoading:false,
      inputName:'',
      hoverIndex:null
    }
  },
  props:{
    list:{type:Array,default:()=>[]}
  },
  methods:{
    open(item) {
      //树形结构的打开与关闭
      console.log('展开')
      item.open = !item.open
    },
    del(item) {
      console.log('删除')
      //删除--->根据id找相应的数组下标
      for(let i in this.list) {
        console.log(this.list[i])
        if(this.list[i].id == item.id){
          if(this.list[i].children){
            this.$message.error('删除项包含子文件夹,不允许删除')
          }else{
            this.list.splice(i,1)
          }
        }
      }
    },
    //确认操作(编辑或者新增)
    handleOk(item) {
      if(this.checkNull(this.inputName)){
        this.$message.error('文件夹名不能为空')
        return
      }
      if(this.editOrAdd == 'add'){
        !item.children && this.$set(item,'children',[{data:this.inputName.trim(),open:true,id:item.id+'-'+item.id}])
        item.children && item.children.push({data:this.inputName.trim(),open:true,id:item.id+'-'+item.id})
        this.treemodalvisible = false
      }else if(this.editOrAdd == 'edit'){
        if(this.chosedTitle == this.inputName){
          this.$message.warning('和原文件夹名一样')
          return
        }else{
          console.log('进来了')
          item.data = this.inputName.trim()
          this.treemodalvisible = false
        }
      }
      this.inputName = ''
    },
    //  编辑
    update(item){
      this.editOrAdd = 'edit'
      this.treemodalvisible = true
      this.chosedTitle = item.data
      this.inputName = item.data
    },
    //增加
    add(item) {
      console.log(item)
      //没有children的添加children属性,但是要保证新加进来的数据也可以被劫持--->this.$set()
      //this.$set(要改变的对象,要改变对象里的属性,属性的值)三个参数
      this.editOrAdd = 'add'
      this.treemodalvisible = true
      this.chosedTitle = item.data
    },
    checkNull(str) {
      if (str == "") {
        return true
      }
      if (str == "undefined") {
        return true
      }
      var regu = "^[ ]+$"
      var re = new RegExp(regu)
      return re.test(str)
    }
  }
}
</script>
<style scoped>
  span{display: inline-block}
  li{width: auto;display: block}
  .mingTree{
    position: relative;margin: 4px 20px
  }
.itemText{
  height: 24px;line-height: 24px; cursor: pointer;
}
.itemText:hover{ color: #000000;font-weight: 600; }
  /*.mingTree li:not(:last-child):before{*/
  /*  position: absolute;*/
  /*  left: 12px;*/
  /*  width: 1px;*/
  /*  height: calc(100% - 44px);*/
  /*  margin: 22px 0 0;*/
  /*  border-left: 1px solid #bbbbbb;*/
  /*  content: " ";*/
  /*}*/
</style>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335