vue中使用div实现一个树形多层级结构的table表格,如何为每一层级定义缩进量

160 阅读2分钟

在 Vue 中使用 div 实现一个树形多层级结构的表格,并为每一层定义适当的缩进量,可以通过 CSS 样式和递归组件的结合来实现。以下是一个基本的实现思路:

定义数据结构和递归组件: 首先,你需要有一个树形数据结构,它包含节点和子节点。然后,创建一个递归组件来渲染这个数据结构。 使用 CSS 定义缩进: 在递归组件中,你可以通过 CSS 来为每一层级的节点定义缩进量。这通常是通过设置 padding-left 或 margin-left 来实现的。 在递归组件中传递层级信息: 为了正确地应用缩进,你可以在递归组件中传递一个表示当前层级深度的属性。这个属性可以在每次递归调用时增加。 以下是一个简化的示例,展示了如何实现这些步骤:

<!-- 子组件TreeNode.vue -->  
<template>  
  <div class="tree-node" :style="{ paddingLeft: `${depth * 20}px` }">  
    <div class="node-content">  
      <span @click="toggle" class="toggle-icon">{{ expanded ? '-' : '+' }}</span>  
      <span>{{ node.name }}</span>  
    </div>  
    <div v-show="expanded" class="children-nodes">  
      <TreeNode  
        v-for="child in node.children"  
        :key="child.id"  
        :node="child"  
        :depth="depth + 1"  
      />  
    </div>  
  </div>  
</template>  
  
<script>  
export default {  
  name: 'TreeNode',  
  props: {  
    node: {  
      type: Object,  
      required: true  
    },  
    depth: {  
      type: Number,  
      default: 0  
    }  
  },  
  data() {  
    return {  
      expanded: false  
    };  
  },  
  methods: {  
    toggle() {  
      this.expanded = !this.expanded;  
    }  
  }  
};  
</script>  
  
<style scoped>  
.tree-node {  
  /* 其他样式 */  
}  
  
.node-content {  
  display: flex;  
  align-items: center;  
  cursor: pointer;  
}  
  
.toggle-icon {  
  margin-right: 8px;  
}  
  
.children-nodes {  
  /* 如果有需要,可以为子节点容器添加样式 */  
}  
</style>
<!-- 父组件App.vue -->  
<template>  
  <div id="app">
      <!--引入子组件-->
    <TreeNode :node="treeData" />  
  </div>  
</template>  
  
<script>  
import TreeNode from './components/TreeNode.vue';  
  
export default {  
  name: 'App',  
  components: {  
    TreeNode  
  },  
  data() {  
    return {  
      treeData: {  
        id: 1,  
        name: 'Root',  
        children: [  
          {  
            id: 2,  
            name: 'Child 1',  
            children: []  
          },  
          {  
            id: 3,  
            name: 'Child 2',  
            children: [  
              {  
                id: 4,  
                name: 'Grandchild 1',  
                children: []  
              }  
            ]  
          }  
        ]  
      }  
    };  
  }  
};  
</script>  
  
<style>  
/* 全局样式 */  
</style>

在这个示例中,TreeNode 组件接受一个 node 属性(表示当前节点)和一个 depth 属性(表示当前节点的层级深度)。depth 属性在每次递归调用时都会增加,从而允许我们通过计算 depth * 20 来动态设置 padding-left,其中 20 是每一层级的缩进量(你可以根据需要调整这个值)。

注意,这个示例中的 treeData 是一个对象而不是数组,这是为了方便地表示一个具有单个根节点的树。如果你的树有多个根节点,你应该将 treeData 改为数组,并在 App.vue 中相应地修改对 TreeNode 组件的调用。