elementui 自定义增加标签页 动态绑定路由

效果如下:

 

el-header,el-aside,el-main布局,el-main中
<el-main>
          <el-tabs v-model="editableTabsValue" type="card" @tab-remove="removeTab" @tab-click="tabClick">
            <el-tab-pane
                v-for="(item, index) in editableTabs"
                :key="item.name"
                :label="item.title"
                :name="item.name"
                :closable="item.closable"
                >
            </el-tab-pane>
          </el-tabs>
          <keep-alive>
            <router-view></router-view>
          </keep-alive>
        </el-main>

 router-view 用来跳转路由,调用data如下

data() {
    return {
      activeIndex: '1',
      isCollapse: false,
      styleimg: 'fa fa-outdent',
      menulist: [],
      editableTabsValue: 'home',//tab选中name
      editableTabs: [],//tab数据
    }
  }

点击左侧菜单新增tab,menunametab名称,url为name,新增判断是否存在已经有的tab,

data中 editableTabsValue,editableTabs,都是取vuex里面设置的,后面贴代码
created() {
    //验证是否登录
    this.verification()
    //树形菜单
    this.getMenu()
    //初始化tab
    this.editableTabs = this.$store.state.options
    //网址进入选中tab
    this.initeditableTabsValue()
  }
//新增tab
    addTab(menuName,url) {
      let tabs = this.editableTabs;
      var isExist =false
      tabs.forEach((tab, index) => {
        if (tab.name === url) {
          isExist =true
        }
      })
      if (isExist){
        this.$store.commit('set_active_index', url)
        this.editableTabsValue =this.$store.state.activeIndex
      }
      else{
        this.$store.commit('add_tabs', {
          title: menuName,
          name: url,
          closable:true,
        })
        this.$store.commit('set_active_index', url)
        this.editableTabsValue =this.$store.state.activeIndex
      }
    },

 删除tab,移除vuex数据

//删除tab
    removeTab(targetName) {
      this.$store.commit('delete_tabs', targetName)
      this.$store.commit('set_active_index', 'home')
    },

tab点击

//tab点击
    tabClick(targetName){
      console.log(targetName)
      this.$store.commit('set_active_index', targetName.name)
      this.$router.push({path:'/'+targetName.name})
    },

输入网址,进入选中tab

//初始化tab加载选择
    initeditableTabsValue(){
      let url = this.$route.fullPath.replace('/','')
      let tabs = this.editableTabs;
      let isExist =false
      tabs.forEach((tab, index) => {
        if (tab.name === url) {
          isExist =true
        }
      })
      if (isExist){
        this.$store.commit('set_active_index', url)
        this.editableTabsValue =this.$store.state.activeIndex
      }else{
        this.$store.commit('set_active_index', 'home')
        this.editableTabsValue =this.$store.state.activeIndex
      }
    },

具体代码如下:

1.调用Vuex,index.js,options为editableTabs数据,写死一条主页tab,根据自己需要,这里vuex

actions,mutations,getters,modules分开了
import Vue from 'vue'
import Vuex from 'vuex'
import actions from "@/store/actions";
import mutations from "@/store/mutations";
import getters from "@/store/getters";
import modules from "@/store/modules";

Vue.use(Vuex)

const state = sessionStorage.getItem('state') ? JSON.parse(sessionStorage.getItem('state')) : {
  token: "",
  options: [{
    title: '主页',
    name: 'home',
    closable:false
  }],
  activeIndex: 'home'
}

export default new Vuex.Store({
  state,
  mutations,
  actions,
  getters,
  modules
})

2.mutations.js

export default {
    //添加token
    mGetToken(state, payload) {
        this.state.token = payload
    },

    // 添加tabs
    add_tabs (state, data) {
        this.state.options.push(data);
    },

    // 删除tabs
    delete_tabs (state, route) {
        let index = 0;
        for (let option of state.options) {
            if (option.name === route) {
                break;
            }
            index++;
        }
        this.state.options.splice(index, 1);
    },

    // 设置当前激活的tab
    set_active_index (state, index) {
        this.state.activeIndex = index;
    }

}

3.vue页面

<template>
  <div>
    <el-container class="home-container">
      <el-header>
        <el-row>
          <el-col :span="1" style="height: 60px"><a href="home"><img src="https://img01.yzcdn.cn/vant/logo.png" alt=""></a></el-col>
          <el-col :span="6"><a href="home"><div class="home-main">后台管理系统</div></a></el-col>
          <el-col :span="12">
            <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"
                     background-color="#4a90e2"
                     text-color="#fff"
                     active-text-color="#ffd04b">
              <el-menu-item index="1">业绩考评</el-menu-item>
              <el-menu-item index="2">工作成效</el-menu-item>
              <el-menu-item index="3">个人中心</el-menu-item>
            </el-menu>
          </el-col>
          <el-col :span="5">
            <el-dropdown @command="handleCommand">
              <span class="el-dropdown-link">系统管理员
                <i class="el-icon-arrow-down el-icon--right"></i>
              </span>
              <template #dropdown>
                <el-dropdown-menu>
                  <el-dropdown-item icon="fa fa-edit" command="修改密码">修改密码</el-dropdown-item>
                  <el-dropdown-item icon="fa fa-upload" command="上传头像">上传头像</el-dropdown-item>
                  <el-dropdown-item icon="fa fa-sign-out" divided command="退出系统">退出系统</el-dropdown-item>
                </el-dropdown-menu>
              </template>
            </el-dropdown>
          </el-col>
        </el-row>
      </el-header>
      <el-container>
        <el-aside :width="isCollapse?'64px':'200px'">
          <div @click="activeCollapse">
            <span :class="styleimg" style="text-align: center;font-size: 16px;line-height: 30px;width: 100%;color: #909399;padding-right: 2px"></span>
          </div>
          <el-divider></el-divider>
          <el-menu
              :collapse="isCollapse"
              unique-opened
              :collapse-transition="false"
              router
              background-color="#336699"
              text-color="#fff"
              active-text-color="#FF9900">
            <el-submenu :index="mainitem.Menuid" v-for="mainitem in menulist":key="mainitem.Menuid">
              <template slot="title">
                <i :class="mainitem.Icon" style="margin-right: 8px;font-size:16px"></i>
                <span>{{mainitem.Menuname}}</span>
              </template>
                <el-menu-item :index="item.Url" v-for=" item in mainitem.children" :key="item.Menuid" @click="addTab(item.Menuname,item.Url)">
                  <template slot="title">
                    <i :class="item.Icon" style="margin-right: 8px;font-size:16px"></i>
                    <span>{{item.Menuname}}</span>
                  </template>
                </el-menu-item>
            </el-submenu>
          </el-menu>
        </el-aside>
        <el-main>
          <el-tabs v-model="editableTabsValue" type="card" @tab-remove="removeTab" @tab-click="tabClick">
            <el-tab-pane
                v-for="(item, index) in editableTabs"
                :key="item.name"
                :label="item.title"
                :name="item.name"
                :closable="item.closable"
                >
            </el-tab-pane>
          </el-tabs>
          <keep-alive>
            <router-view></router-view>
          </keep-alive>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script>

import {GetUserMenu} from "@/network/user";

export default {
  name: "Main",
  created() {
    //验证是否登录
    this.verification()
    //树形菜单
    this.getMenu()
    //初始化tab
    this.editableTabs = this.$store.state.options
    //网址进入选中tab
    this.initeditableTabsValue()
  },
  data() {
    return {
      activeIndex: '1',
      isCollapse: false,
      styleimg: 'fa fa-outdent',
      menulist: [],
      editableTabsValue: 'home',//tab选中name
      editableTabs: [],//tab数据
    }
  },
  methods:{
    //新增tab
    addTab(menuName,url) {
      let tabs = this.editableTabs;
      var isExist =false
      tabs.forEach((tab, index) => {
        if (tab.name === url) {
          isExist =true
        }
      })
      if (isExist){
        this.$store.commit('set_active_index', url)
        this.editableTabsValue =this.$store.state.activeIndex
      }
      else{
        this.$store.commit('add_tabs', {
          title: menuName,
          name: url,
          closable:true,
        })
        this.$store.commit('set_active_index', url)
        this.editableTabsValue =this.$store.state.activeIndex
      }
    },
    //删除tab
    removeTab(targetName) {
      this.$store.commit('delete_tabs', targetName)
      this.$store.commit('set_active_index', 'home')
    },
    //tab点击
    tabClick(targetName){
      console.log(targetName)
      this.$store.commit('set_active_index', targetName.name)
      this.$router.push({path:'/'+targetName.name})
    },
    verification() {
      if (this.$store.state.token == '') {
        this.$router.push({path: '/login'})
      }
    },
    handleCommand(command){
        if (command == '退出系统'){
          window.sessionStorage.removeItem('state')
          this.$store.commit('mGetToken', '')
          //移除option
          let tabs = this.$store.state.options;
          let deletelist =''
          tabs.forEach((tab, index) => {
            console.log(index)
            if (tab.name !== 'home') {
              deletelist+=tab.name+','
            }
          })
          deletelist = deletelist.substring(0,sj.length-1)
          let list = deletelist.split(',')
          list.forEach((c, index) => {
            this.$store.commit('delete_tabs', c)
          })
          this.$store.commit('set_active_index', 'home')
          this.$router.push({path: '/login'})
        }
    },
    handleSelect(key, keyPath){
      console.log(key, keyPath);
    },
    activeCollapse(){
      this.isCollapse=!this.isCollapse
      this.styleimg = this.isCollapse===true?'fa fa-indent':'fa fa-outdent'
    },
    getMenu(){
      GetUserMenu(this.$store.state.token).then(res => {
        this.menulist =res.data
      }).catch(err => {
        console.log(err);
      })
    },
    //初始化tab加载选择
    initeditableTabsValue(){
      let url = this.$route.fullPath.replace('/','')
      let tabs = this.editableTabs;
      let isExist =false
      tabs.forEach((tab, index) => {
        if (tab.name === url) {
          isExist =true
        }
      })
      if (isExist){
        this.$store.commit('set_active_index', url)
        this.editableTabsValue =this.$store.state.activeIndex
      }else{
        this.$store.commit('set_active_index', 'home')
        this.editableTabsValue =this.$store.state.activeIndex
      }
    },
  },
}
</script>

<style scoped>
.el-header{
  background-color: #4a90e2;
  line-height: 60px;
}

home-header{
  height: 60px;
}
.el-row{
  height: 60px;
  line-height: 60px;
}
.el-col img{
  height: 60px;
}

.home-main{
  font-weight: bold;
  font-size: 30px;
  font-family: 楷体;
  color: white;
  padding-left: 5px;
}

.el-aside {
  background-color: #336699;
}
.el-menu {
  border-right: none;
}

.el-main {
  background-color: #ffffff;
}

.home-container {
  height: 100vh;
}

.el-dropdown {
  color: white;
  float: right;
}

.el-menu-demo{
  float: right;
}

.asidecollapse{
  text-align: center;
}

.el-divider{
  margin: 0 0;
  background-color: #909399;
}
</style>

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ElementUITabs标签可以通过动态绑定数据来实现动态切换标签的效果。具体实现方法如下: 1. 在Vue组件中定义一个数组,用于存储标签的数据,例如: ``` data() { return { tabs: [ { label: '标签1', name: 'tab1' }, { label: '标签2', name: 'tab2' }, { label: '标签3', name: 'tab3' } ], activeTab: 'tab1' } } ``` 2. 在模板中使用`el-tabs`和`el-tab-pane`组件来渲染标签,例如: ``` <el-tabs v-model="activeTab"> <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name"> {{ tab.label }} 的内容 </el-tab-pane> </el-tabs> ``` 3. 在需要动态切换标签的时候,修改`activeTab`的值即可,例如: ``` this.activeTab = 'tab2'; ``` 这样就可以实现动态切换标签的效果了。 ### 回答2: ElementUI是一款非常受欢迎的基于Vue.js开发的前端UI框架。其中的Tabs组件让我们可以方便地组织和切换多个界面功能,极大地提高了Web应用程序的交互性和用户体验。其中包含了许多可配置的属性和方法,我们可以使用它们来实现一些非常有趣的交互效果。 ElementUITabs组件提供了两种标签类型:固定标签和可滚动标签。在固定标签模式下,标签宽度是固定的,如果标签过多,那么会出现切换不方便的问题。而在可滚动标签模式下,标签会自动适应父容器的宽度,并且在标签过多时,在标签列表右侧会显示左右滚动按钮,以方便用户切换标签ElementUITabs组件还提供了动态添加和删除标签的功能。我们可以使用addTab和removeTab方法在运行时添加或删除标签。addTab方法接收一个包含标签相关信息的对象作为参数,包括标签标题、图标、内容等等。removeTab方法则接收一个标签的key值作为参数,用于标识要删除的标签。 除了这些基本的功能,ElementUITabs组件还提供了许多其他的配置项和事件。例如:可以使用tabPosition属性来指定标签的位置(上、下、左、右),可以使用editable属性来开启或关闭标签编辑功能,可以使用tabClick事件来监听标签点击事件等等。这些特性让Tabs组件非常灵活,可以满足各种复杂的业务场景需求。 总的来说,ElementUITabs组件是一个非常强大的标签组件,可以帮助我们轻松地实现多标签应用程序,并提供各种可配置的功能和事件响应。如果您正在开发Web应用程序,并且需要使用到标签功能,ElementUITabs组件将是您不错的选择。 ### 回答3: ElementUI是一个非常流行的Vue.js UI组件库,其中之一的Tabs标签组件可以用于创建标签视图和动态添加或删除标签Tabs标签组件是由一个<el-tabs>组件和一个或多个<el-tab-pane>组成的。 首先,在Vue组件中引入以下内容,使标签组件能够正常工作: ```javascript import { Tabs, TabPane } from 'element-ui' Vue.use(Tabs) Vue.use(TabPane) ``` 然后,我们可以在模板中添加以下内容创建一个基本的标签组件: ```javascript <el-tabs v-model="activeName" @tab-click="handleClick"> <el-tab-pane v-for="(item, index) in tabs" :key="index" :label="item.name">{{ item.content }}</el-tab-pane> </el-tabs> ``` 在上述代码中,v-model属性用于绑定当前激活的选项卡的名称,@tab-click事件用于处理标签单击事件。 为了实现动态添加和删除标签的功能,我们需要使用一个数组来存储标签对象,并设置一个指针来跟踪当前激活的标签。每次添加或删除标签时,都需要更新数组并更新指针。 以下是一个示例组件,演示了如何添加和删除标签: ```javascript <template> <div> <div> <el-button @click="addTab">添加标签</el-button> <el-button @click="removeTab">删除标签</el-button> </div> <el-tabs v-model="activeName" editable> <el-tab-pane v-for="(item, index) in tabs" :key="index" :label="item.name">{{ item.content }}</el-tab-pane> </el-tabs> </div> </template> <script> export default { data() { return { activeName: 'tab1', tabs: [ { name: '标签1', content: '这是标签1的内容', id: 'tab1' }, { name: '标签2', content: '这是标签2的内容', id: 'tab2' } ] } }, methods: { addTab() { const newTabName = `tab${this.tabs.length + 1}` this.tabs.push({ name: `标签${this.tabs.length + 1}`, content: `这是标签${this.tabs.length + 1}的内容`, id: newTabName }) this.activeName = newTabName }, removeTab() { const tabs = this.tabs const activeName = this.activeName let removeIndex = tabs.findIndex(tab => tab.id === activeName) if (removeIndex === -1) { return } tabs.splice(removeIndex, 1) this.activeName = tabs.length ? tabs[removeIndex > 0 ? removeIndex - 1 : 0].id : '' } } } </script> ``` 上述代码中,addTab方法用于向tabs数组中添加一个新标签对象,并将其设置为当前激活的标签。removeTab方法将从tabs数组中删除当前激活的标签对象,并将activeName更新为上一个标签或第一个标签,如果没有标签,则将activeName设置为空字符串。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值