vue实现多级菜单的功能

子组件如下

<template>
  <li>
    <div @click="toggle" :class="liClass">{{model.menuName}}</div>
    <transition name="slide">
      <ul v-show="open">
        <items v-for="(item,index) in model.childTree" :model="item" :key="index"></items>
      </ul>
    </transition>
  </li>
</template>

<script>
  export default {
    name: "items",
    props:['model'],
    data() {
      return {
        open:false
      }
    },
    methods:{
      toggle() {
        this.open = !this.open
      }
    },
    computed:{
      liClass() {
        let _this = this;
        let option = `level_${this.model.level}`;
        let res = {};
        res[option] = true;
        return res;
      }
    }
  }
</script>

<style scoped lang="scss">
  ul {
    list-style: none;
    text-align: left;
    .level_1 {
      /*border: 1px #ff0000 solid;*/
    }
    .level_2 {
      /*border: 1px #00ff00 solid;*/
      text-indent: 2em;
      /*background: #00ff00;*/
    }
    .level_3 {
      /*border: 1px #0000ff solid;*/
      text-indent: 4em;
      /*background: #0000ff;*/
    }
    .level_4 {
      /*border: 1px #ffff00 solid;*/
      text-indent: 6em;
      /*background: #ffff00;*/
    }
  }
  .slide-enter-active,.slide-leave-active {
    transition: all 0.2s;
  }
  .slide-enter,.slide-leave-to {
    transform: translateY(-20px);
  }
  .slide-enter-to,.slide-leave {
    transform: translateY(0px);
  }
</style>

父组件如下

<template>
  <div class="home">
    <div class="digui">
      <ul>
        <items v-for="(model,index) in list" :model="model" :key="index"></items>
      </ul>
    </div>
  </div>
</template>

<script>
  import items from './items'
  export default {
    name: "Home",
    data() {
      return {
        list: [
          {
            "menuName": "项目管理",
            "level":1,
            "childTree": [{
              "menuName": "项目进度",
              "level":2,
              "childTree": [{
                "menuName": "项目一",
                "level":3,
                "childTree": [{ "menuName": "详细信息","level":4,"childTree":[] }]
              }]
            }, {
              "menuName": "任务安排",
              "level":2,
              "childTree":[]
            }]
          },
          {
            "menuName": "数据统计",
            "level":1,
            "childTree":[]
          },
          {
            "menuName": "人员管理",
            "level":1,
            "childTree":[]
          }]
      }
    },
    components:{
      items
    }
  }
</script>

<style scoped>
</style>

主要代码如上,用到了组件的递归。

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值