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

文章目录

一、为什么要用树结构?

本文将讲述一个实例,构造一棵树来实现数组和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>

总结

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

相关推荐
我有满天星辰34 分钟前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
我有满天星辰3 小时前
Vue 3 响应式双雄:ref 与 reactive 完全指南
前端·javascript·vue.js
leoZ23114 小时前
Claude 驱动的全栈开发:Spring Boot + Vue 的 BS 架构实践
vue.js·spring boot·架构
荒诞英雄18 小时前
从 17MB Vendor 大包到按需加载:Vite 多入口 Vue 组件库首屏优化实践
vue.js·vite
jsonbro18 小时前
手把手带你实现发布订阅模式
前端·vue.js·设计模式
Cobyte20 小时前
23.Vue Vapor 组件 attrs 的实现
前端·javascript·vue.js
斯特凡今天也很帅21 小时前
xml页面可以打开,不报错,但是显示数据的地方也不显示,我是怎么解决的
xml·vue.js
柯克七七1 天前
给老项目加了 TypeScript,本来只想自己爽,结果全公司代码审查标准被我抬高了
前端·vue.js·typescript
自然 醒1 天前
前端如何实现在线预览office常见文件功能?
前端·vue.js
肉肉不吃 肉1 天前
前端调试跨域如何解决
前端·vue.js