v-show和v-if 多级菜单

<div id="app">
      <tree :datalist='treeData'></tree>
    </div>


    <script>
      const treeData = [
        {
          name: '一级 1',
          children: [
            {
              name: '二级 1-1',
              children: [
                {
                  name: '三级 1-1-1',
                  children: [
                    {
                      name: '四级 1-1-1-1'
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          name: '一级 2',
          children: [
            {
              name: '二级 2-1',
              children: [
                {
                  name: '三级 2-1-1'
                }
              ]
            }, {
              name: '二级 2-2',
              children: [
                {
                  name: '三级 2-2-1',
                }
              ]
            }
          ]
        },
        {
          name: '一级 3',
          children: [
            {
              name: '二级 3-1',
              children: [
                {
                  name: '三级 3-1-1'
                }
              ]
            },
            {
              name: '二级 3-2',
              children: [
                {
                  name: '三级 3-1-1'
                }
              ]
            }
          ]
        }
      ]


      Vue.component('tree', {
        props: ['datalist'],
        data() {
          return {
            showChildren: [],
            nohiddenChildren: []
          }
        },
        template: `<ul>
                    <li v-for='(data,index) in datalist' :key='data.name'>
                      <span @click='handleClick(index)'>{{data.name}}</span>
                      <tree :datalist="data.children" 
                            v-show="showChildren[index]" 
                            v-if='nohiddenChildren[index]'></tree>
                    </li>
                  </ul>`,
        methods: {
          handleClick(index) {
            this.showChildren.splice(index, 1, !this.showChildren[index])
            this.nohiddenChildren.splice(index, 1, true)
          }
        }
      })
      new Vue({
        el: '#app',
        data: {
          treeData
        }
      })

    </script>

实现效果
在这里插入图片描述
我主要说明一下 这里v-show和v-if为什么这么使用的原因:
在这里插入图片描述
1.点击标题,其子元素打开:
如果使用v-if作为控制的,每次点击标题,子组件都会重新渲染一回,不能保存之前子元素内部打开的状态,同时这种频繁的切换使用v-show更能够节省dom渲染,节约性能。

2.使用了v-show,为什么又使用v-if
如果单纯的使用v-show,页面在初始化的时候,会将子元素也全部渲染,只是用display:none;作为控制,这对页面性能并不是很好,此时需要使用v-if,点击了标签再渲染dom标签。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值