树结构使用实例---实现数组和树结构的转换

文章目录

一、为什么要用树结构?

本文将讲述一个实例,构造一棵树来实现数组和tree的转换,这在前端树结构中是经常遇到的

后端返回树结构方便管理,前端也只需要请求一次接口拿到所有数据

前端树转成数组后的效果图:

二、使用步骤

1.引入相关json

代码如下(示例):请下载资源

2.读入数据

代码如下(示例):

javascript 复制代码
<!--
  * @author:yxm
  * @description复用教材 
-->
<template>
  <div class="whole-title-bj">
    <ul class="whole-title" v-for="(item,index) in Object.keys(dataForm)" :key="index">
      <li class="title-left">{{item}}</li>
      <li class="title-right">
        <div
          v-for="(item2, index2) in dataForm[item]"
          :key="index2"
          class="title-right-name common-cursor"
          :class="{ 'activate-index': selectForm[item] == item2.tag_id }"
          @click="selectClick(item, item2)"
        >
          {{ item2.tag_name }}
        </div>
      </li>
    </ul>
  </div>
</template>

<script>
import nationalJson from "./national_lesson_tag.json" //测试

export default {
  name: '',
  data () {
    return {
      dataForm:{},//源数据
      selectForm:{},//选中当前
      selectMap:{},
    }
  },
  mounted(){
    this.initData(nationalJson.hierarchies[0])//测试
  },
  methods: {
    // 初始化数据递归
    initData(data) {测试
      let children = data.children;
      let hierarchy_name = data.hierarchy_name;
      let item = children[0];
      let tag_name = item.tag_name;
      this.$set(this.dataForm, hierarchy_name, children);
      this.$set(this.selectForm, hierarchy_name, item.tag_id);
      this.$set(this.selectMap, tag_name, item.tag_name);
      if(item.hierarchies) {
        this.initData(item.hierarchies[0]);
      }
    },
    // 点击选择教材
    selectClick(item, tag) {
      this.selectForm[item] = tag.tag_id;
      if(tag.children) {
        this.initData(tag.children[0]);
      }
      console.log(this.selectForm);
    },
  },
}
</script>

<style lang="scss" scoped>
/* @import url(); 引入css类 */
.whole-title-bj {
  width: 90%;
  .whole-title {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    .title-left {
      margin-right: 25px;
      color: #999999;
    }
    .title-right {
      width: 90%;
      display: flex;
      flex-wrap: wrap;
      line-height: 30px;
      &-name {
        padding: 0 20px;
        margin-bottom: 16px;
        margin-right: 20px;
        color: #000000;
      }
    }
  }
  .activate-index {
    color: #1e62ec !important;
    background: rgba(30, 98, 236, 0.1);
    border-radius: 17px;
    font-size: 14px;
  }
}
</style>

总结

使用递归把树转成列表数组,使得接口请求一次,前端自己组装结构

相关推荐
zy happy13 小时前
若依 vue3 报错:找不到模块“@/api/xxxx/xxxxx”或其相应的类型声明。。Vue 3 can not find mod
前端·javascript·vue.js
Q***l68715 小时前
Vue增强现实案例
前端·vue.js·ar
b***748815 小时前
Vue开源
前端·javascript·vue.js
前端小白۞17 小时前
vue2 md文件预览和下载
前端·javascript·vue.js
u***u68517 小时前
Vue云原生
前端·vue.js·云原生
OpenTiny社区17 小时前
TinyEngine 低代码实时协作揭秘:原理 +实操,看完直接用!
前端·vue.js·低代码
喵个咪17 小时前
go-kratos-admin 技术栈深度解析:为什么选 Golang+Vue3 这套组合?
vue.js·go
5***790018 小时前
Vue项目性能优化
前端·javascript·vue.js
抱琴_19 小时前
【Vue3】大屏性能优化黑科技:Vue 3 中实现请求合并,让你的大屏飞起来!
前端·vue.js
saberxyL20 小时前
通过<RouterView/>来切换页面组件时,transition如何生效?
vue.js