element-ui Tabs 标签页刷新页面状态不丢失

转载请表明出处 https://www.cnblogs.com/niexianda/p/14765111.html

效果

一般在使用Tabs组件,我们选择了标签2后刷新,tab组件会重新回到标签1,每次都需要在刷新后从新选择标签页。给人感觉不友好。

要求

  1. 尽量减少代码更改
  2. 记录当前tag选中信息,刷新后可以反选

思路

  1. 使用directives监听tab加载与切换
  2. 使用mixins确保全局可调用
  3. 在directives切换将信息写入到query中,刷新页面时读取query中信息进行反选

实现

  1. 首先创建mixins文件

param2Obj 方法

export function param2Obj (url) {
const search = url.split('?')[1];
if (!search) {
return {}
}
return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}');
}

mixins/index.js

import { param2Obj } from '@/utils/index'
// 全局引用方法
export default {
// v-tab-change:activeName="setActiveName"
directives: {
'tab-change': {
// 绑定时读取query是否有action字段
bind(el, binding) {
let param = param2Obj(window.location.href)
if (param.active) {
binding.value({ action: 'setActiveName', key: binding.arg}, param.active);
}
},
// 切换时query写入action字段
update(el, binding) {
// setTimeout(0) 等待dom完成后进行操作
setTimeout(() => {
let param = param2Obj(window.location.href)
// 获取dom
// 此处详见 注1
let queryList = document.querySelectorAll('.el-tabs__item')
for (let index = 0; index < queryList.length; index++) {
const item = queryList[index]
if (item.className.indexOf('is-active') !== -1) {
let activeName = item.id.split('-')[1]
// 防止重复调用push方法
if (param.active !== activeName) {
binding.value({ action: 'setPath' }, activeName);
}
}
}
}, 0);
}
}
},
methods: { setActiveName({ action, key }, activeName) {
// 写入tabs默认值
if (action === 'setActiveName') {
this[key] = activeName
} else {
// 使用 replace 方法防止产生记录
this.$router.replace({
query: {
active: activeName
}
})
} }
}
}
  1. 在main.js中全局引用
// 全局mixin
import mixinsIndex from '@/mixins/index'
Vue.mixin(mixinsIndex)
  1. 使用
<template>
<!-- activeName为当前绑定的v-model,key值。 setActiveName是mixin定义的方法 -->
<el-tabs v-model="activeName" v-tab-change:activeName="setActiveName">
<el-tab-pane label="tab1" name="tab1">tab1 </el-tab-pane>
<el-tab-pane label="tab2" name="tab2">tab2 </el-tab-pane>
<el-tab-pane label="tab3" name="tab3">tab3</el-tab-pane>
</el-tabs>
</template> <script>
export default {
name: 'tabDemo',
data () {
return {
activeName: 'tab1'
}
}
}
</script>

注1:

is-active 为当前选中的tab,class中包含当前的name值

element-ui Tabs 标签页刷新页面状态不丢失的更多相关文章

  1. element ui tabs 标签页支持展开收起修改

    <template> <div class="com-resource-legend" style=""> <el-tabs ty ...

  2. easyui,获取tabs标签页内容,以及刷新datagrid

    因为先点开tab页xxx查看表格,再点另一个tab页xxxx修改部分信息,再切换到tab页xxx,tab页xxx里的datagrid表格不会刷新,显示不了修改的信息(在此tab页按F5刷新可以解决,但 ...

  3. 布局-EasyUI Panel 面板、EasyUI Tabs 标签页/选项卡、EasyUI Accordion 折叠面板、EasyUI Layout 布局

    EasyUI Panel 面板 通过 $.fn.panel.defaults 重写默认的 defaults. 面板(panel)当做其他内容的容器使用.它是创建其他组件(比如:Layout 布局.Ta ...

  4. tabs标签页的数据缓存

    一进入tabs标签页默认就将所有标签页的数据请求到,并渲染到页面上, 这样如果数据量太大的话会渲染很久, 我的需求就是点击不同的标签时再请求数据,同时对点击过的标签页数据进行缓存,下次点击时不再重新请 ...

  5. 踩iviewui中Tabs 标签页数据绑定坑

    今天小颖要实现点击Tabs 标签页中每个标签,并动态获取当前点击的标签值. 一句话说不清楚,那就看动态图吧 小颖一开始看官网写的代码是: <template> <Tabs :valu ...

  6. JSF中使用f:ajax标签无刷新页面改变数据

    ajax本是用在前端的一种异步请求数据的操作,广泛用于js中,一般的js框架如jq都有被封装好的方法,用于发起异步请求操作.异步操作可以增强用户体验和操作,越来越多的程序都在使用ajax.JSF的fa ...

  7. HTML:模拟链接被按下,在新标签页打开页面,不使用window.open(可能被拦截)

    当按下一个按钮时,想打开一个新的标签页,可以使用window.open去实现但是因为使用window.open在新窗口或者新标签页中打开页面,有可能被浏览器给拦截.为了解决这个问题,可以模拟链接被按下 ...

  8. (转载)HTML:模拟链接被按下,在新标签页打开页面,不使用window.open(可能被拦截)

    原文: http://www.cppblog.com/biao/archive/2010/08/21/124196.html 当按下一个按钮时,想打开一个新的标签页,可以使用window.open去实 ...

  9. 关于button标签会刷新页面的问题

    当button标签在form表单里面时,这时点击button按钮会提交表单刷新页面. <form action=""> <button>点击</but ...

  10. js实现在新标签页打开页面

    这种方法打开新标签页要在IE9+以上浏览器才可以! <html> <head> <meta http-equiv="Content-type" con ...

随机推荐

  1. 递推求解DAG最长路径长度及最长路径条数

    说明 在一般图中,求解最长路或最短路只能通过最短路算法解决 但是在DAG中,由于不存在环,因此可以通过递推,以线性复杂度计算处最长路或最短路.当然需要首先对有向图进行Tarjan缩点转化为DAG 例题 ...

  2. 微前端框架single-spa子应用加载解析

    作者:京东物流 宁冲 1 前言 什么是微前端? 微前端是指存在于浏览器中的微服务. 本文主要通过对微前端框架single-spa的基座应用加载子应用的single-spa-vue函数库进行分析,通过代 ...

  3. 机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别

    1.机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别 1.1 LDA算法简介和应用 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种 ...

  4. 在 Rainbond 上使用 Curve 云原生存储

    Curve 是网易主导自研的现代化存储系统, 目前支持文件存储(CurveFS)和块存储(CurveBS). CurveBS 的核心应用场景主要包括: 虚拟机/容器的性能型.混合型.容量型云盘或持久化 ...

  5. Spring 源码阅读之标签解析

    全局目录.md 引子 1.容器最基本使用.md 系列1 - bean 标签解析: 2.XmlBeanFactory 的类图介绍.md 3.XmlBeanFactory 对xml文件读取.md 4.xm ...

  6. [Tomcat/Java EE/Linux]Tomcat启动异常:StandardServer.await: create[localhost:8005]: java.net.BindException: 无法指定被请求的地址

    1 问题背景 部门新成员小J在一台虚拟机(ip:192.168.191.96)内安装部署部门的数据治理产品(含: 20余个微服务模块 + 1套(用户)基础管理系统BMS). 小J启动BMS的Tomca ...

  7. Redis缓冲区溢出及解决方案

    缓冲区(buffer),是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区. 一.Redis缓冲区溢出影响 在Redis ...

  8. 可视化大屏:mapbox+vue全攻略

    如题图,mapbox是一个支持真3D地形展示的webGIS框架,与常用的Leaflet.Cesium和Openlayers并称四大框架,本文将介绍mapbox-gl js 在 vue 中的用法. 为什 ...

  9. Python if 语句练习

    if语句 练习 # 1.以特殊方式跟管理员打招呼 # 创建一个至少包含 5 个用户名的列表,且其中一个用户名为 'admin' .想象你要编写代码,在每位用户登录网站后都打印一条问 # 候消息.遍历用 ...

  10. Locust 界面简介(非使用级)

    一.认识Locust 1.简介 Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在 ...