element-ui页签改写:路由+缓存模式(keep-alive)

成倅
• 阅读 8315

基于element-ui框架实现页签

传送门:
elment-ui页签:https://element.faas.ele.me/#...
keep-alive: https://cn.vuejs.org/v2/api/#...
demo地址:https://github.com/haryzxw/zx...
实现思路

整体:基于element-ui的框架,搭配keep-alive以及路由功能,能实现不同组件的页签切换的缓存功能

核心代码

1.代码片段1

    <div class="el-tab-list">
        <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab" @tab-click='chooseTab'>
          <el-tab-pane
            :key="item.name"
            v-for="(item, index) in editableTabs"
            :label="item.title"
            :name="item.name"
          >
          </el-tab-pane>
        </el-tabs> 
      </div>   
      <keep-alive :include="includeList">
        <router-view></router-view>
      </keep-alive>
  • element-ui原先写在el-tab-pane标签内的content直接去掉了,换成更灵活的路由写法
  • 将页签对应的跳转路由信息(pathquery)增加到页签的项中。
  • 对应的页面组件需要定义不同的name值,keep-aliveinclude属性匹配首先检查组件自身的name选项,如果name选项不可用,则匹配它的局部注册名称 (父组件components选项的键值)
  • 移除页签的时候,需要将对应组件的缓存也要去掉

2.代码片段2

 // 判断是否已存在同名页签,否则新增页签,并在缓存数组中新增
addTab(item){  
      // 当前新增的页签是否存在页签数组中的判断
      var hasSame = this.editableTabs.filter(item1 => item1.name == item.tab) 
      if(!hasSame.length){
        // 如果此时页签数组没有该项,则将它加入到页签数组中,注意将跳转路由以及组件实例名字同步赋值
        this.editableTabs.push({
          title: item.label,
          name: item.tab,
          router:{
            path: item.path,
            query: item.query
          },
          componentName:item.componentName,
        });
        // 如果此时页签数组没有该项,则将它加入缓存数组中
        this.includeList.push(item.componentName)
      }
      // 改变当前选中的页签值
      this.editableTabsValue = item.tab;
    }, 
  • 新增页签时,先判断当前页签数组中是否有对应项,如果没有,则将点击的菜单项加入到页签(包括项的跳转信息及组件实例的名字)
  • 新增页签,也要同步修改缓存的includeList的数组
  • 修改当前页签选中的值为点击传入的值
注意要点
  • 页签的切换其实是路由的切换
  • 使用keep-alive时,要注意给对应的缓存组件实例指定唯一name
  • 在新增和删除页签时,除了对页签数组做处理以外,还需要对缓存数组做同步处理
总结

这个demo相对比较简单,其他就不多说啦,具体的可以参考demo(demo地址在开头就给啦)。demo里面我也例举了复用组件的情况,当页签为复用组件时,并不能很好的缓存复用组件的页面的状态。因此后来考虑用动态组件的方式去解决这个问题,限于篇幅,动态组件生成页签的方式再单独整理成新的一篇笔记吧(写完会回来放链接的~)
总结&分享,知识能很好的内化。当然也希望能提供一些帮助和参考啦。
行文仓促,欢迎指正!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(