vue中怎么写一个目录

vue中目录的实现方法

在这里插入图片描述

方法1:自己封装一个目录组件,递归思想
<template>
  <div class="catalog">
    <aside class="leftCatalog">
      <h4 style="border-bottom: 1px solid #ccc;">目录</h4>
      <tree></tree>
    </aside>
    <div class="right">主要内容展示区域</div>
  </div>
</template>

<script>
export default {
  components: {
    tree: () => import("../components/tree.vue"),
  },
};
</script>

<style scoped>
.catalog {
  display: flex;
}
.leftCatalog {
  width: 180px;
  height: 240px;
  overflow-y: auto;
  background-color: #f5f5f5;
}
.right {
  flex: 1;
}
</style>

tree.vue文件:

<template>
  <div class="catalogBox">
    <!-- 每一个最外层的对象,就会渲染出一个catalogItem-->
    <catalogItem
      class="catalog"
      v-for="(item, index) in list"
      :key="index"
      :itemText="item"
    ></catalogItem>
  </div>
</template>

<script>
import catalogItem from "./treeItem.vue";
export default {
  data() {
    return {
      // 目录数据开始
      list: [
        {
          name: "中国",
          children: [
            {
              name: "湖南",
              children: [
                {
                  name: "长沙",
                  children: [
                    { name: "天心区" },
                    { name: "岳麓区" },
                    { name: "雨花区" },
                    { name: "望城区" },
                    { name: "开福区" },
                  ],
                },
              ],
            },
            {
              name: "广东省",
              children: [
                {
                  name: "深圳市",
                  children: [
                    {
                      name: "福田区",
                    },
                    {
                      name: "南山区",
                    },
                  ],
                },
                {
                  name: "广州市",
                  children: [{ name: "海心区" }, { name: "白云区" }],
                },
              ],
            },
          ],
        },
        {
          name: "日本",
          children: [{ name: "东京" }, { name: "大阪" }],
        },
      ],
    };
  },
  components: { catalogItem },
};
</script>

treeItem.vue文件:

<template>
  <div class="itemBox">
    <!-- 按钮部分 -->
    <template v-if="itemText.children && itemText.children.length">
      <a-icon v-show="!isOpen" type="caret-right" @click="isOpen = !isOpen" />
      <a-icon v-show="isOpen" type="caret-down" @click="isOpen = !isOpen" />
    </template>
    <!-- 每个目录项的内容 -->
    <div class="catalogItem">{{ itemText.name }}</div>
    <!-- 如果有children,就会接着渲染内层目录,内部和自己本身是一样的 -->
    <template v-if="itemText.children && itemText.children.length">
      <treeItem
        v-for="(childItem, childIndex) in itemText.children"
        :key="childIndex"
        :itemText="childItem"
        v-show="isOpen"
        >{{ childItem.name }}</treeItem
      >
    </template>
  </div>
</template>
<script>
export default {
  name: "treeItem",
  props: {
    itemText: {
      type: Object,
      default: () => {},
    },
  },
  data() {
    return {
      isOpen: false,
    };
  },
};
</script>

<style scoped>
.catalogItem {
  display: inline-block;
  font-size: 12px;
  color: #565656;
  margin: 0;
}
.itemBox {
  padding: 0 0 0 15px;
  margin: 0;
}
</style>

组件treeItem通过name属性,自己引用自己

方法2:使用antd的a-tree属性空间

0;
}
.itemBox {
padding: 0 0 0 15px;
margin: 0;
}


组件treeItem通过name属性,自己引用自己

#### 方法2:使用antd的a-tree属性空间

  <a-tree :tree-data="list"></a-tree>

只不过list中的 name 必须改为 title
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值