vue element-ui 侧边栏 和tabs 标签卡,绑定关联

vue element-ui 侧边栏 和tabs 标签卡,绑定关联

实现效果:
请添加图片描述

思路:

点击侧边栏 添加 tabs 标签函数 : tab_click
点击 tabs 标签 返回: tab_click
关闭 tabs 标签函数: removeTab
1. 添加时候判断,tabs标签里是否已经 包含此标签,有就跳转,无就添加跳转
2. 移除的时候,tabs -1 选中状态也回到上一个 tabs 标签

3.解决刷新重置:
	tabs 标签卡重置,使用  sessionStorage 存储 tabs列表 和 选中状态。
	刷新的时候后,判断本地有没有  sessionStorage.sessTabs  和 sessionStorage.sessTabsValue ,有就给其赋值,保持刷新还存在。
	 	sessionStorage.sessTabs = JSON.stringify(this.editableTabs);
	    sessionStorage.sessTabsValue = JSON.stringify(this.editableTabsValue);
4.用户退出登录时候,清空 tabs列表 和 选中状态,
5.
1. 添加侧边栏

for循环,渲染出页面

 <el-container>
        <!-- 侧边栏 -->
        <el-aside :width="isCollapse ? '60px' : ' 180px'">
          <!-- :default-active="active" -->

          <el-menu
            class="el-menu-vertical-demo"
            background-color="#d3dce6"
            :default-active="active"
            router
            :collapse="isCollapse"
            :collapse-transition="false"
          >
            <component
              v-for="value in leftMenu.navList"
              :key="value.title + value.url"
              :index="value.url"
              :is="
                value.children && value.children.length > 0
                  ? 'el-submenu'
                  : 'el-menu-item'
              "
              @click="toTab(value.title, value.url)"
            >
              <!-- 当有子元素时,隐藏本条父元素的渲染 -->
              <template
                v-if="value.children == null || value.children.length < 0"
              >
                <img :src="value.icon" />
                <span>{{ value.title }}</span>
              </template>
              <!-- //子循环 -->
              <template v-if="value.children && value.children.length > 0">
                <template slot="title"
                  ><img :src="value.icon" />
                  <span>{{ value.title }} </span>
                </template>
                <el-menu-item
                  v-for="v in value.children"
                  :key="v.title + v.url"
                  :index="v.url"
                  @click="toTab(v.title, v.url)"
                  style="font-size: 12px"
                >
                  <img :src="v.icon" />
                  <span slot="title">{{ v.title }}</span>
                </el-menu-item>
              </template>
            </component>
          </el-menu>
        </el-aside>
        
        <!-- 上边标签 (与侧边栏关联) -->
        <el-container>
          <el-main>
            <el-tabs
              v-model="editableTabsValue"
              type="border-card"
              closable
              @tab-remove="removeTab"
              @tab-click="tab_click"
            >
              <el-tab-pane
                v-for="item in editableTabs"
                :key="item.name"
                :label="item.title"
                :name="item.name"
                :disabled="item.name == '0'"
              >
                <label
                  slot="label"
                  :class="item.icon"
                  v-if="item.name === '0'"
                  @click="xxx()"
                ></label>
                <label slot="label" v-else>{{ item.title }}</label>
              </el-tab-pane>
            </el-tabs>

            <!-- 导航栏 -->
           <router-view />  
          </el-main>
          <el-footer>联系电话:0101-****-****</el-footer>
        </el-container>
      </el-container>

准备工作,data

 data() {
    return {
     
      // tab栏
      isCollapse: false,
      editableTabsValue: "1", //选中状态的 name
      editableTabs: [ //默认存在的 tabs 
        {
          icon: "el-icon-s-fold",
          path: "#",
          title: "折叠",
          name: "0",
        },
        {
          icon: "el-icon-suitcase",
          path: "homePage",
          title: "首页",
          name: "1",
        },
      ],
      // 侧边栏
      active: "",
      leftMenu: {
        isCollapse: false,
        //navList: [],
        navList: [
           {
             icon: "el-icon-suitcase",
             path: "homePage",
             title: "首页",
           },
           {
            icon: require("../assets/images/cun.png"),
            url: "village",
             title: "村庄",
           },
           {
             // icon: "el-icon-office-building",
             icon: require("../assets/images/mans.png"),
             url: "person",
             title: "人口",
           },
           {
             // icon: "el-icon-office-building",
             icon: require("../assets/images/mans.png"),
             url: "map",
             title: "地图",
           }
         ],
      },
    };
  },
2. 添加tabs 标签
3. 相关联起来

3.1 点击侧边栏 添加tabs 标签
3.1.1点击侧边栏 添加tabs 标签

 //添加 tabs 标签页 ,传递的 name 是title
    toTab(name, url) {
      this.active = url;
      // console.log(name, url);
      //添加之前需要 判断是否已经包含,
      let isHave = false;
      for (let i = 0; i < this.editableTabs.length; i++) {
        if (this.editableTabs[i].title == name) {
          //存在,包含
          isHave = true;
          this.editableTabsValue = this.editableTabs[i].name;
        }
      }
      if (isHave == false) {
        this.editableTabs.push({
          title: name,
          name: name,
          content: name + url, //用于测试,后边可以删除
          path: url,
        });
        this.editableTabsValue =
          this.editableTabs[this.editableTabs.length - 1].name;
      }
      //本地存储值
      sessionStorage.sessTabs = JSON.stringify(this.editableTabs);
      sessionStorage.sessTabsValue = JSON.stringify(this.editableTabsValue);
      // console.log(sessionStorage.sessTabs);
      // console.log(sessionStorage.sessTabsValue);
    },

3.1.2 移除tabs 标签

    removeTab(targetName) {
      let tabs = this.editableTabs;
      let activeName = this.editableTabsValue;
      //关闭当前页
      if (activeName === targetName) {
        tabs.forEach((tab, index) => {
          if (tab.name === targetName) {
            let nextTab = tabs[index + 1] || tabs[index - 1]; //下一个 next 打开的页面,有就下一个,没就上一个
            if (nextTab) {
              activeName = nextTab.name;
              this.active = nextTab.path;
              this.$router.push(nextTab.path);
            }
          }
        });
      }
      this.editableTabsValue = activeName;
      this.editableTabs = tabs.filter((tab) => tab.name !== targetName);
      //本地存储值
      sessionStorage.sessTabs = JSON.stringify(this.editableTabs);
      sessionStorage.sessTabsValue = JSON.stringify(this.editableTabsValue);
    },
3.2 点击 tabs 标签,跳转相应路由,选中状态
tab_click(tab) {
      let url = this.editableTabs[tab.index].path;
      if (this.$router.currentRoute.name !== url) {
        this.active = url;
        this.$router.push(url);
      }
      //存储选中状态
      this.toTab(this.editableTabs[tab.index].title, url);
    },
	3.3
4. 解决刷新时

,tabs 标签卡重置,使用 sessionStorage 存储 tabs列表 和 选中状态。
sessionStorage.sessTabs = JSON.stringify(this.editableTabs);
sessionStorage.sessTabsValue = JSON.stringify(this.editableTabsValue);

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统解决方案。它提供了许多常用的后台管理功能和组件,包括侧边、面包屑导航、表格、表单、图表等等。 侧边Vue-element-admin 中的一个重要组件,它通常用于展示系统的菜单和功能项。在 Vue-element-admin 中,侧边是通过路由配置来生成的。 在路由配置中,每一个路由配置项对应着一个菜单项。菜单项包括菜单的标题、图标、路径、子菜单等信息。当用户点击菜单项时,就会跳转到对应的路由页面。 以下是一个简单的示例,演示如何使用 Vue-element-admin 的侧边组件: ```javascript // 路由配置 const routes = [ { path: '/', redirect: '/dashboard' }, { path: '/dashboard', component: Layout, children: [ { path: '', name: 'Dashboard', component: () => import('@/views/dashboard/index'), meta: { title: 'Dashboard', icon: 'dashboard' } } ] }, { path: '/example', component: Layout, redirect: '/example/table', name: 'Example', meta: { title: 'Example', icon: 'example' }, children: [ { path: 'table', name: 'Table', component: () => import('@/views/table/index'), meta: { title: 'Table', icon: 'table' } }, { path: 'tree', name: 'Tree', component: () => import('@/views/tree/index'), meta: { title: 'Tree', icon: 'tree' } } ] } ] // 侧边组件 <template> <el-menu :default-active="activeIndex" class="el-menu-vertical-demo" :collapse="isCollapse"> <template v-for="(item, index) in menuList"> <el-submenu v-if="item.children" :key="index" :index="index"> <template slot="title"> <i :class="item.icon"></i> <span slot="title">{{item.title}}</span> </template> <template v-for="(subItem, subIndex) in item.children"> <el-menu-item :key="index + '-' + subIndex" :index="index + '-' + subIndex" @click="handleMenuClick(subItem)"> <i :class="subItem.icon"></i> <span slot="title">{{subItem.title}}</span> </el-menu-item> </template> </el-submenu> <el-menu-item v-else :key="index" :index="index" @click="handleMenuClick(item)"> <i :class="item.icon"></i> <span slot="title">{{item.title}}</span> </el-menu-item> </template> </el-menu> </template> <script> export default { props: { menuList: { type: Array, required: true }, activeIndex: { type: String, required: true }, isCollapse: { type: Boolean, required: true } }, methods: { handleMenuClick(item) { this.$emit('menu-click', item) } } } </script> ``` 在这个示例中,路由配置包含了三个路由项,分别对应 Dashboard、Table 和 Tree 三个菜单项。侧边组件则使用了 Element UI 中的 Menu 组件来展示菜单项。侧边组件的主要作用是传递菜单项列表、当前选中的菜单项和侧边是否折叠等参数,以及监听菜单项的点击事件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值