当前位置:   article > 正文

ruoyi页面切换查询条件保留_vue 如何切换标签后保留数据

vue 如何切换标签后保留数据

场景描述

业务遇到需求,管理平台的页面打开后输入的查询条件、已经点击的页码、已经查询的数据要求保留下来,在tab菜单切换时保留,在关闭菜单时重置清空。

解决方案

1.使用cookie、localStorage或者sessionStorage

这个方式能解决部分需求,比如记录下查询条件或者页码之类的,但是有缺陷,储存大小有限制。

cookie数据大小不会超过4K,session storage和local storage可以达到5M。不是好的办法,可以满足如全局检索条件这种需求。

2.使用vue的keep-alive

keep-alives是组件缓存,主要用于保留组件状态或避免重新渲染,意思是说vue页面的created等只执行一次。这能做什么呢?这可做的多了,这样的话我们可以将查询条件或者已查询到的数据在created时保留,切换tab时由于没有重新渲染不会重新created,但是在关闭菜单后再打开菜单又会重新渲染并执行created。

这时只需要在created时重置查询条件和页码及查询数据对象,再执行查询后台并保留这时的查询条件及数据即可实现需求。

这种方式可以解决页面使用的是同一组件这种场景。因为使用同一组件时,不使用keep-alive的话不管是进行tab菜单切换还是关闭后重新打开菜单都会重新渲染,都会执行created等之后的步骤。

代码实现

一、要使用keep-alive需要满足2点:

1.路由配置文件设置keepAlive=true

  1. //index.js
  2. import Vue from 'vue'
  3. import Router from 'vue-router'
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/bookOrder',
  9. name: 'BookOrder',
  10. // 设置keepAlive属性
  11. meta: {
  12. keepAlive : true
  13. },
  14. component: resolve => require(['@/views/order/BookOrder'], resolve)
  15. }
  16. ],
  17. mode:'history'
  18. })

2.标注需要缓存的组件,用<keep-alvie>包裹

若以ruoyi的AppMain.vue

  1. <template>
  2. <section class="app-main">
  3. <transition name="fade-transform" mode="out-in">
  4. <keep-alive :include="cachedViews">
  5. <router-view v-if="!$route.meta.link" :key="key" />
  6. </keep-alive>
  7. </transition>
  8. <iframe-toggle />
  9. </section>
  10. </template>
  11. <script>
  12. import iframeToggle from "./IframeToggle/index"
  13. export default {
  14. name: 'AppMain',
  15. components: { iframeToggle },
  16. computed: {
  17. cachedViews() {
  18. return this.$store.state.tagsView.cachedViews
  19. },
  20. key() {
  21. return this.$route.path
  22. }
  23. }
  24. }
  25. </script>

3.页面vue文件的name要与Router中的name一致

比如上面Router中name是BookOrder,则bookOrder.vue中也必须是这个

  1. export default {
  2. name: "BookOrder",
  3. data{}
  4. }

二、实现

组件MyTempPage.vue

  1. //关键代码
  2. data() {
  3. .....
  4. // 总条数 从需要留存的数据中读取
  5. total: this.config.remainData.total,
  6. // 表格数据 从需要留存的数据中读取
  7. tableList: this.config.remainData.tableList,
  8. .....
  9. // 查询参数
  10. queryParams: this.config.queryParams,
  11. .....
  12. },
  13. created() {
  14. //清空查询条件、页码、缓存的数据
  15. this.queryParams=this.config.queryParams= {};
  16. this.config.remainData = {tableList:[],total:0}
  17. this.queryParams.pageNum = 1;
  18. this.queryParams.pageSize = 10;
  19. this.resetForm("queryForm");
  20. //请求后台
  21. this.getList();
  22. },
  23. methods: {
  24. //请求后台
  25. getList() {
  26. this.loading = true;
  27. if(this.config.parseQueryParams) this.config.parseQueryParams(this.queryParams);
  28. this.api.list(this.queryParams).then(response => {
  29. let list = response.rows;
  30. if(this.config.parseData) list.forEach(this.config.parseData)
  31. this.tableList = response.rows;
  32. this.total = response.total;
  33. this.loading = false;
  34. //留存数据
  35. this.config.remainData.tableList = response.rows;
  36. this.config.remainData.total = response.total;
  37. });
  38. },
  39. },
  40. activated() {
  41. //不需要记录数据的页面,重新执行查询
  42. if(!this.config.isRemainData) {
  43. //重新加载数据
  44. this.getList();
  45. }
  46. }

三、效果展示

Q&A

Q:ruoyi需要自己做keep-alive吗?

A:不用,ruoyi已经实现了。反映在哪里了呢?注意看 系统管理-菜单管理-编辑-是否缓存

Q:我用的是ruoyi,菜单设置是否缓存选择的缓存,为啥actived和deactivated没生效啊?

A:注意页面vue文件的name要与Router中的name一致,另外注意ruoyi在做动态router时的代码

所以vue页面中的name也需要是首字母大写的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/250850
推荐阅读
相关标签
  

闽ICP备14008679号