Vant Collapse 移动端递归菜单

 //  控制只打开一个
    onCollapseOpen(openKeys) {
      const latestOpenKey = openKeys.find(
        (key) => this.openKeys.indexOf(key) === -1
      );
      if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
        this.openKeys = openKeys;
      } else {
        setTimeout(() => {
          this.openKeys = latestOpenKey ? [latestOpenKey] : [];
        });
      }
    },

全部代码

<template>
  <div id="vb-menu-warp">
    <!--  <van-field
      v-model="fieldValue"
      is-link
      readonly
      label="菜单"
      placeholder="请选择菜单"
      @click="info.formService.menuShow = true"
    /> -->
    <!-- <van-popup
      v-model="info.formService.menuShow"
      closeable
      position="bottom"
      :style="{ height: '50%' }"
      
    /> -->
    <van-collapse v-model="openKeys" @change="onCollapseOpen">
      <van-collapse-item
        :title="item.name"
        :name="item.resId"
        v-for="item in info.formService.menuList"
        :key="item.resId"
      >
        <li v-if="!item.subResList.length">内容</li>
        <sub-menu
          v-else
          :key="item.resId"
          :menu-info="item"
          :layer="layer + 1"
          class="work-first-menu"
        />
      </van-collapse-item>
    </van-collapse>
  </div>
</template>

<script>
import OtherService from "services/OtherService";
import IndexController from "controllers/IndexController";
import { CollapseItem } from "vant";
/* 递归子组件 */
const SubMenu = {
  template: `
      <van-collapse-item :key="menuInfo.resId" v-bind="$props"  v-on="$listeners">
         <span slot="title">
                <span :style="'font-size: 15px;' + 'margin-left:' + (layer * 15) +'px'">{{ menuInfo.name }}</span>
              </span>
        <template v-for="item in menuInfo.subResList">
          <li v-if="!item.subResList.length" :key="item.resId" @click="onTitleClick(item)">
               <span :style="'font-size: 15px;' + 'margin-left:' + (layer * 20) +'px'">{{ item.name }}</span>           
          </li>
          <sub-menu v-else :key="item.resId" :layer="layer + 1" :menu-info="item" />
        </template>
      </van-collapse-item>
    `,
  name: "SubMenu",
  isSubMenu: true,
  props: {
    ...CollapseItem.props,
    menuInfo: {
      type: Object,
      default: () => ({}),
    },
    layer: {
      type: Number,
      default: 1,
    },
  },
  data() {
    return {
      data: new IndexController(new OtherService()),
      mariginLeft: 15,
    };
  },
  methods: {
    onTitleClick(e) {
      const type = e.linkType;
      const resId = e.resId;
      const appId = this.$storage.get("appId");
      if (type === 1) {
        this.$router.push({
          path: "/home/table/" + resId,
        });
      } else if (type === 0 || type === 3) {
        this.$storage.set("isRes", "isRes");
        this.$router.push(`/home/form/${resId}/1/1/1`);
      }
    },
  },
};
export default {
  name: "",
  data() {
    return {
      info: new IndexController(new OtherService()),
      rootSubmenuKeys: [], // 所有的
      openKeys: [], // 打开的
      fieldValue: "",
      layer: 1,
    };
  },
  components: {
    "sub-menu": SubMenu,
  },
  mounted() {
    this.init();
  },
  methods: {
    /* 初始化数据 */
    async init() {
      let { info } = this;
      await info.getMenuList();
      this.rootSubmenuKeys = info.formService.keyRoots;
    },
    //  控制只打开一个
    onCollapseOpen(openKeys) {
      const latestOpenKey = openKeys.find(
        (key) => this.openKeys.indexOf(key) === -1
      );
      if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
        this.openKeys = openKeys;
      } else {
        setTimeout(() => {
          this.openKeys = latestOpenKey ? [latestOpenKey] : [];
        });
      }
    },
  },
};
</script>

<style  lang='scss'>
@import "style/vbmenu/VbMenu.scss";
</style>

效果 在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值