Vue2编辑返回保留分页页码的几种解决方案

 更新时间:2026年06月28日 15:25:31   作者:toooooop8  
这篇文章主要介绍了Vue路由回退时丢失分页状态的问题,并提出了四种解决方案:路由传参、keep-alive缓存、Vuex/Pinia存储和本地存储,推荐使用组合方案以获得最佳用户体验,需要的朋友可以参考下

问题根源

this.$router.back() 只是单纯回退历史记录,列表页分页、搜索筛选、页码是存在组件 data 里的,路由回退后组件会重新加载,丢失之前分页状态。

四种主流方案(按推荐程度排序)

方案1:路由传参(最简单,无需缓存)

1. 列表页跳转编辑时,带上当前分页参数

// 列表页 点击编辑
handleEdit(row) {
  const page = this.pageNum; // 当前页码
  const size = this.pageSize; // 每页条数
  this.$router.push({
    path: `/product/edit/${row.id}`,
    query: { page, size } // 把分页存在query
  })
}

2. 编辑页保存时,携带页码返回列表

// 编辑确认按钮
async submit() {
  await api.save(this.form);
  // 获取跳转过来时携带的分页参数
  const { page, size } = this.$route.query;
  if (page) {
    // 跳回列表并带上分页,自动加载对应页
    this.$router.push({
      path: '/product/list',
      query: { page, size }
    })
  } else {
    this.$router.back();
  }
}

3. 列表页 created 读取 query 恢复分页

created() {
  // 路由带分页则赋值
  if (this.$route.query.page) {
    this.pageNum = Number(this.$route.query.page);
    this.pageSize = Number(this.$route.query.size);
  }
  this.getList(); // 重新请求对应页码数据
}

优点:简单无副作用;缺点:url会拼接分页参数

方案2:keep-alive 缓存列表组件(最优体验)

页面不会重新请求,直接保留上次滚动、分页、筛选状态

1. 路由配置开启缓存

<!-- App.vue / 路由出口 -->
<router-view v-if="$route.meta.keepAlive" keep-alive></router-view>
<router-view v-else></router-view>

2. router/index.js 给列表路由加标记

{
  path: '/product/list',
  name: 'ProductList',
  component: ProductList,
  meta: { keepAlive: true } // 标记需要缓存
},
{
  path: '/product/edit/:id',
  component: ProductEdit
}

3. 编辑完成直接回退即可

submit() {
  await saveApi();
  this.$router.back(); // 列表组件被缓存,页码数据全部保留
}

补充:如果需要编辑完强制刷新列表

监听 activated 钩子,判断是否从编辑页返回:

// ProductList.vue
activated() {
  // 判断上一页是编辑页,刷新数据
  if (this.$route.meta.fromEdit) {
    this.getList();
    this.$route.meta.fromEdit = false;
  }
}

跳转编辑时打标记:

handleEdit() {
  this.$route.meta.fromEdit = true;
  this.$router.push(`/product/edit/${id}`)
}

方案3:Vuex / Pinia 存储分页状态(多页面共用)

适合多处进入编辑、需要全局保存分页

  1. store 定义分页变量
state: {
  productPage: {
    pageNum: 1,
    pageSize: 10
  }
},
mutations: {
  setProductPage(state, payload) {
    state.productPage = payload
  }
}
  1. 列表每次请求前更新store
this.$store.commit('setProductPage', {
  pageNum: this.pageNum,
  pageSize: this.pageSize
})
  1. 列表 created 读取store恢复
created() {
  const page = this.$store.state.productPage;
  this.pageNum = page.pageNum;
  this.pageSize = page.pageSize;
  this.getList();
}

方案4:本地存储 localStorage(刷新页面也不丢失)

// 列表切换页码时保存
changePage() {
  localStorage.setItem('productPage', JSON.stringify({
    pageNum: this.pageNum,
    pageSize: this.pageSize
  }))
  this.getList()
}

// 列表初始化读取
created() {
  const cache = localStorage.getItem('productPage');
  if (cache) {
    const { pageNum, pageSize } = JSON.parse(cache);
    this.pageNum = pageNum;
    this.pageSize = pageSize;
  }
  this.getList();
}

推荐组合使用方案(项目通用)

  1. 列表路由加 keepAlive 缓存,返回直接保留分页,体验最好
  2. 如需编辑后刷新列表,搭配路由meta标记,在 activated 重新请求接口
  3. 若页面复杂、多入口跳转,补充路由query兜底

踩坑提醒

  1. this.$router.back() 无法携带参数,单纯回退一定会丢失组件内数据,不要只用back
  2. keep-alive 缓存后 created 不会再次执行,改用 activated 处理刷新逻辑
  3. 分页参数一定要转数字,query获取的是字符串,请求接口会报错

以上就是Vue2编辑返回保留分页页码的几种解决方案的详细内容,更多关于Vue2编辑返回保留分页页码的资料请关注脚本之家其它相关文章!

相关文章

  • 配置一个vue3.0项目的完整步骤

    配置一个vue3.0项目的完整步骤

    这篇文章主要介绍了配置一个vue3.0项目的完整步骤,从0开始配置一个vue项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Vue+element使用row-class-name修改el-table某一行解决背景色无效的方法

    Vue+element使用row-class-name修改el-table某一行解决背景色无效的方法

    本文主要介绍了Vue+element使用row-class-name修改el-table某一行解决背景色无效的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • uni-app制作小程序实现左右菜单联动效果

    uni-app制作小程序实现左右菜单联动效果

    这篇文章主要介绍了uni-app制作小程序实现左右菜单联动效果,实现步骤和思路都很简单,今天通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • nuxt.js 在middleware(中间件)中实现路由鉴权操作

    nuxt.js 在middleware(中间件)中实现路由鉴权操作

    这篇文章主要介绍了nuxt.js 在middleware(中间件)中实现路由鉴权操作,具有很好的参考价值,希望大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 基于Vue实现鼠标滚动轮控制页面横向滑动效果

    基于Vue实现鼠标滚动轮控制页面横向滑动效果

    这篇文章主要介绍了如何基于Vue实现鼠标滚动轮控制页面横向滑动效果,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-09-09
  • 解决vue数据更新但table内容不更新的问题

    解决vue数据更新但table内容不更新的问题

    这篇文章主要给大家介绍了vue数据更新table内容不更新解决方法,文中有详细的代码示例供大家作为参考,感兴趣的同学可以参考阅读一下
    2023-08-08
  • 解决vue项目运行提示Warnings while compiling.警告的问题

    解决vue项目运行提示Warnings while compiling.警告的问题

    这篇文章主要介绍了解决vue项目运行提示Warnings while compiling.警告的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vue-router中query取值的坑及解决

    vue-router中query取值的坑及解决

    这篇文章主要介绍了vue-router中query取值的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • vue+elementui通用弹窗的实现(新增+编辑)

    vue+elementui通用弹窗的实现(新增+编辑)

    这篇文章主要介绍了vue+elementui通用弹窗的实现(新增+编辑),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • vue2实现pdf电子签章问题记录

    vue2实现pdf电子签章问题记录

    仿照e签宝,实现pdf电子签章 => 拿到pdf链接,移动章的位置,获取章的坐标,怎么实现呢,下面小编给大家介绍vue2实现pdf电子签章问题记录,感兴趣的朋友一起看看吧
    2023-12-12

最新评论