vue项目做的一个“花名册”页面,从“花名册”页面可以点击某一个人的名字,进入这个人的信息详情表格页面,而且这个人的信息详情页面中有一个“直属上级”字段时可以点击跳转的,点击以后跳转到该汇报人的信息详情页面,汇报人里还有汇报人,以此类推,大概有4层到5层的跳转。
现在的需求是,筛选框有3种状态,每一种状态里只能选择一种分类。如果后退时,必须是原路返回,一层一层的往出退,不能直接退到“花名册”页面,并且退到最外层“花名册”页面时,必须要保留之前的筛选条件

1、点击姓名进入个人信息页

一开始,我把获取个人信息放到了”花名册“的组件中,因为点击姓名后,跳转时,要获取用户的权限,跳转到相应的权限所对应的个人信息页面,而都断接口,将获取权限和获取个人详细信息放到一个接口中 了,所以一开始的做法是,在“花名册”页面将权限和详细信息都获取了,并且跳转时,将个人信息的数据,通过路由传参的形式,传过去,再渲染,此时会有两个问题,第一,个人信息页面刷新后会丢失数据,第二、如果后台数据有所变化,那么页面刷新也获取不到最新的数据。
针对上述问题,我尝试的使用了vux加本地缓存,第一个问题解决了,可是第二个问题得不到解决
最终,我想到,将获取个人信息的方法,放到”个人信息“组件中,将获取权限和获取个人信息分开,就完美的解决了上述问题,并且封装为api.js模块
代码如下:

// 获取花名册员工详细信息接口(分两步,第一步,先获取权限信息,第二步,跳转到员工详细信息页面时,再获取表格数据,完成渲染)// 第一步,先获取权限export const getType = (params) => get('roster/detail?usercode=' + params).then(res => {// 跳转router.push({path: '/roster_userinfo/' + res.data.type,// 携带被查询员工编号query: {info: params}})})// 第二步 跳过去以后,获取被查询员工的详细信息export const getDetailedInformation = (params) => get('roster/detail?usercode=' + params)

这样,就可以在需要的地方导入使用就可以啦

2、实现一层一层后退

如果单纯的利用BOM对象后退,如果url地址地址不变的话,页面是不会刷新的,所以单纯的点击后退按钮是不行的。
给每一个组件加上watch监听,就可以实现啦

// 解决跳转到相同的url路径时,页面不刷星的问题watch: {'$route' (to, from) {this.$router.go(0);}},

3、实现筛选条件保留之前的高亮的状态

实现这个功能,我一开始想到了keep-alive组件,但是跳一次路由可以,如果连续跳2次以上,就不行了。
那么我就想到了vuex + 本地缓存
代码如下:
1、首先封装本地缓存的方法

//storage.js
// 封装本地缓存的方法// 储存数据
export const setItem = (key,data) => {if(typeof data === 'object'){window.sessionStorage.setItem(key,JSON.stringify(data))}else{window.sessionStorage.setItem(key,data)}
}// 读取数据
export const grtItem = (key) => {const item = window.sessionStorage.getItem(key)try{const value = JSON.parse(item)if(typeof value === 'object'){return value}else{return item}}catch(err){return item}
}// 移除数据
export const removeItem = (key) => {window.sessionStorage.removeItem(key)
}

2、vuex代码:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)// 导入本地存储的方法
import { setItem,grtItem } from '@/utils/storage.js'export default new Vuex.Store({state: {// 定义4个状态参数staffstatus: grtItem('staffstatus'),staffstatuschild:grtItem('staffstatuschild'),positiontype: grtItem('positiontype'),page: grtItem('page'),    },mutations: {setStaffstatus(state,data){state.staffstatus = datasetItem('staffstatus',state.staffstatus)},setStaffstatuschild(state,data){state.staffstatuschild = datasetItem('staffstatuschild',state.staffstatuschild)},setPositiontype(state,data){state.positiontype = datasetItem('positiontype',state.positiontype)},setPage(state,data){state.page = datasetItem('page',state.page)}},actions: {},modules: {}
})

3、花名册组件代码:
将设置默认的筛选条件代码写到一个过渡组件中,这样就解决了好多问题,因为这个项目的登录功能不在我的项目中,所以需要一个过渡组件来获取token和保存token,以及把默认状态值设置到过渡组件中时,只有初次打开花名册页面,才回去显示默认状态,因为后退会触发页面刷新,所以不能设置到花名册的组件中,每次后退都会回到默认状态,与保留筛选条件相冲突

// 过渡组件created() {// 页面初次加载,将“在职”状态设置为默认值this.$store.commit('setStaffstatus','5')this.$store.commit('setPage','1')// 获取tokenthis.getToken()}

然后进入了花名册组件

created() {// 页面首次加载,获取花名册表格数据this.getRosterList()},
// 获取全局数据getRosterList: function () {// 筛选条件初始化,把默认值高亮this.active_tab1 = this.$store.state.staffstatusthis.active_tab2 = this.$store.state.staffstatuschildthis.active_tab3 = this.$store.state.positiontypethis.queryInfo.pagenum = Number(this.$store.state.page)if(this.active_tab1 == '5'){this.is_tab2 = true}else{this.is_tab2 = falsethis.$store.commit('setStaffstatuschild','')}if(this.active_tab1 == '6'){// this.is_join_day = falsethis.is_firedate = true}else{// this.is_join_day = truethis.is_firedate = false}// 定义参数let params = {staffstatus:this.$store.state.staffstatus || '',positiontype:this.$store.state.positiontype || '', staffstatuschild:this.$store.state.staffstatuschild || '', page:Number(this.$store.state.page) || 1 ,limit: this.queryInfo.pagesize,}getList(params).then((res) => {// 员工状态选项卡数据赋值this.obj1 = res.data.staffstatus // 在职菜单的二级菜单this.obj2 = res.data.staffStatuschild// 岗位性质选项卡赋值this.obj3 = res.data.positiontype// 总条数渲染this.total = res.data.total// 全部列表数据this.rosterList = res.data.list})},

4、切换筛选条件后,更新vuex的值

// 以其中的一个点击处理函数为例
// 员工状态的点击处理函数selected_1(key) {if(key == '5'){this.is_tab2 = true}else{this.is_tab2 = falsethis.$store.commit('setStaffstatuschild','')}if(key == '6'){// this.is_join_day = truethis.is_firedate = true}else{// this.is_join_day = truethis.is_firedate = false}const i = key == this.active_tab1if(i){this.active_tab1 = ''this.is_tab2 = falsethis.active_tab2 = ''this.is_join_day = truethis.is_firedate = false}else{this.active_tab1 = key;}// 设置tab1this.$store.commit('setStaffstatus',this.active_tab1)this.$store.commit('setPage',1)// 变更筛选条件,将分页的page重置为1this.queryInfo.pagenum = 1this.getRosterList()},

5、最后,我增加了一个功能,刷新页面,将筛选条件恢复到默认状态

一开始我想在created钩子函数中运行舒适化代码,可是不行,因为后退也会触发created,点击刷新也会触发,这样就不对了,于是上网查了查,如何监听单独的浏览器刷新
下面是代码:

// 1 监听浏览器的刷新事件,注册方法mounted() {// 监听浏览器的刷新事件window.addEventListener('beforeunload', this.unload)// window.addEventListener('beforeunload', e => this.unload) // 注册一个匿名函数},// 2 销毁这个监听事件destroyed() {// 销毁这个监听事件,需要找到这个函数,如果使用的是匿名函数的话,无法查找这个函数,这个事件也就没有办法被移除 ,在其他页面仍然会执行这个监听事件window.removeEventListener('beforeunload', this.unload)},methods:{// 3、监听浏览器的刷新,这个方法,后退时是不会触发的unload() {// 用户刷新时,将筛选状态置为默认参数this.$store.commit('setStaffstatus','5')this.$store.commit('setPage','1')this.$store.commit('setStaffstatuschild','')this.$store.commit('setPositiontype','')},}

最后,在这梳理一下,整个过程:
1、页面初次加载在过渡页面设置默认值
2、进入花名册页面时,页面读取vuex中的默认状态数据
3、点击切换筛选条件,改变高亮状态的同时,触发vuex的mutations方法去改变vuex中的数据,vuex的数据时响应式的,数据改变就会驱动试图的更新,同时将改变后的数据做了本地缓存,将vuex的数据持久化
4、这样就实现了,保留状态的后退
欢迎大家补充

VUE项目从详情页退回列表页,保留列表页的筛选条件(筛选条件为单选),以及刷新后恢复默认的一个筛选状态相关推荐

  1. vue项目实现详情页后退缓存之前的数据

    vue项目实现详情页后退缓存之前的数据 2019年02月19日 14:54:57 不想写代码的程序员 阅读数:244 一.需要缓存的内容: 1.后退缓存条件查询的数据 2.后退缓存分页信息 二.实现 ...

  2. vue项目中如何利用lodop控件实现多页打印

    针对windows环境下的vue项目中如何利用lodop控件实现打印的功能,不支持mac环境 下载安装 首先去lodop官网下载中心下载相关的包,完成安装 重点关注前四个文件,安装第一个文件,在第二个 ...

  3. Vue 实现商品详情多播图(点击图片列表轮播图)

    Vue 实现商品详情多播图(点击轮播图) 之前弄商城项目有要到这种效果的商品展示图(商品图片轮播),找了很久没找到,就自己写了一个. 实现效果: 点击左右按钮图片左右移动 点击小图片图片展示到大图 图 ...

  4. 前端Vue项目——课程详情页面实现

    一.详情页面路由跳转 应用 Vue Router 编程式导航通过 this.$router.push() 来实现路由跳转. 1.绑定查看详情事件 修改 src/components/Course/Co ...

  5. Vue 项目前端响应式布局及框架搭建

    Vue 项目前端响应式布局及框架搭建 一.flexible 插件 1.引用 flexible 插件 2.修改 flexible 默认配置 3.展示效果 二.cssrem 插件 (px -> re ...

  6. 使用vscode运行vue项目

    !!学习完vue环境搭建并创建项目后下面我们介绍使用vscode运行vue项目.!! 文章参考:https://www.csdn.net/gather_29/OtTagg3sNzA2LWJsb2cO0 ...

  7. 将springboot项目和vue项目部署到windows 2016 server(服务器)

    将springboot项目和vue项目部署到服务器 1.服务器环境配置 1.1 服务器需要安装的环境 1.2 服务器需要配置的入站与进站规则 2.springboot项目的打包 2.1 springb ...

  8. vue 项目中实现pdf预览 pdf打印 pdf下载

    在Vue项目中实现PDF预览.打印和下载可以通过以下步骤来实现: 安装pdf.js pdf.js是一个JavaScript库,可以用于在Web上渲染PDF文件. 可以使用npm安装pdf.js,命令如 ...

  9. Vue项目 .env .env.development .env.production 配置说明

    1.模式 模式是 Vue CLI 项目中一个重要的概念.默认情况下,一个 Vue CLI 项目有三个模式: development 模式用于 vue-cli-service serve product ...

最新文章

  1. 新建虚拟机update时出现不能得到锁问题
  2. class priority_queue 简单介绍
  3. Oracle11g客户端如何完全卸载
  4. iOS 跨平台开发,该用 Flutter 还是 Swift?
  5. 专访黑石集团CEO苏世民:“我们能见他人所不能见”/巴伦独家
  6. html标签嵌套规则
  7. Uncode、ASCII、UTF-8之前的转换函数
  8. Router路由守卫
  9. 51单片机最小系统电路图
  10. [NLP]OpenNLP词性标注器的使用
  11. 计算机组成原理中的DUBS是,[转帖]实验室名称中英文对照大整理
  12. c语言平 ac自动机,多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考...
  13. Day 12 - 标签图片的方法与实作
  14. 7个简单步骤解释区块链挖掘和交易如何工作
  15. 【考研数学】琴生不等式
  16. 怎样去识别是否双线主机服务器的方法
  17. 2021年计算机视觉工程师学习路线
  18. android 从矢量图SVG获取位图bitmap
  19. 表头顺序不一样的表格如何合并_不同表头的多表合并
  20. 2022最新IntellJ IDEA的mall开发部署文档

热门文章

  1. 网络流建模汇总(转自Edelweiss)
  2. ProgressDialog不显示
  3. cdoj1338郭大侠与英雄学院
  4. 百度云管家在计算机上删除,百度云管家盘符删不掉怎么办?删除百度云管家盘符的方法...
  5. 鹬蚌相争的困局(博弈论的诡计)
  6. 博弈的构成要素(博弈论的诡计)
  7. VS2017报错:E1696 命令行错误: 无法打开 元数据 文件 “platform.winmd”
  8. 线上CPU100%及应用OOM的排查和解决过程
  9. windows7资源管理器中增加XP下的摄像头图标
  10. uniapp开发短视频系统仿哔哩哔哩