vue实现返回上一页面,页面停留在原来位置,不刷新

在Vue.js应用中,从列表页面进入详情页面再返回时,如何避免接口重复调用和页面滚动到顶部的问题?本文介绍了通过配置路由缓存和`<router-view>`组件,结合`this.$router.back()`方法,来实现返回时保持页面状态和滚动位置,提升用户浏览体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候会有这种情况。从列表页面进入详情页面,然后点击返回的时候,我们的接口会重新调用,页面也会跑到顶部,这样用户体验是很不好的,每次用户都得从上往下从新翻,下面就给大家介绍如何解决这种问题

  1. 配置路由缓存
export default new Router({
  routes: [
    {
      path: '/hello',
      name: 'HelloWorld',
      component: HelloWorld,
      meta: {
        keepAlive: true // 需要缓存
      }
    },
    {
      path: '/hello2',
      name: 'HelloWorld2',
      component: HelloWorld2,
      meta: {
        keepAlive: false // 不需要缓存
      }
    }
  ],
  mode: 'history',
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }

2.配置App.vue文件种的<router-view/>

<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

3.使用this.$router.back()返回

当用户在详情页点击返回的按钮时,我们把按钮的返回事件 this.router.go(-1)换成this.router.back(), 必须用这个才能生效哦

转载:https://www.jianshu.com/p/f0eab1424a39

### 防止页面在调用 `uni.navigateBack` 返回重新加载 为了防止页面在调用 `uni.navigateBack` 后重新加载,可以采取以下几种策略: #### 使用缓存机制保存页面状态 通过使用本地存储或 Vuex 来保持页面状态,在页面显示时读取这些状态是每次都请求新数据。这可以通过监听页面生命周期函数来实现。 ```javascript // 在离开当前页面之前保存必要的状态信息到全局变量或其他持久化方式中 onHide() { uni.setStorageSync('orderState', JSON.stringify(this.orderList)); } ``` ```javascript // 当页面再次展示时恢复之前的界面状态 onShow() { const savedOrderState = uni.getStorageSync('orderState'); if (savedOrderState) { this.orderList = JSON.parse(savedOrderState); } } ``` 这种方法能够有效减少必要的网络请求,并且提供更好的用户体验[^1]。 #### 利用 Vue 的 keep-alive 组件 对于某些特定场景下的单页应用(SPA),如果希望保留组件实例而被销毁,则可以在路由配置里设置 `meta.keepAlive=true` 属性,并配合 `<keep-alive>` 标签起工作。这样做的好处是可以让页面停留在上次浏览的位置会因为导航操作而导致整个视图重置。 ```html <template> <div id="app"> <!-- 路由出口 --> <router-view v-slot="{ Component }"> <transition name="fade" mode="out-in"> <keep-alive :include="['YourPageName']"> <!-- 替换成实际要缓存的页面名称 --> <component :is="Component"></component> </keep-alive> </transition> </router-view> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; const YourPageName = ref(['your-page-name']); </script> ``` 这种方式适用于那些频繁切换但又想丢失内部状态的应用场景[^2]。 #### 修改 navigateBack 行为逻辑 另种解决方案是在调用 `navigateBack` 之后立即触发自定义事件通知目标页面需要刷新其内容。例如,在源页面完成某个动作后发送广播消息给目的页面告知它应该维持现有状态不变。 ```javascript payData.success = (res) => { uni.showToast({ title: '支付成功', success: () => { setTimeout(() => { // 发送事件告诉订单列表页刷新 uni.$emit('doNotRefreshOrders'); uni.navigateBack(); }, 2000) } }) }; ``` 而在接收端(即订单列表页),可以根据收到的消息决定是否执行默认行为: ```javascript onShow() { let shouldRefresh = true; uni.$once('doNotRefreshOrders', function(){ shouldRefresh=false; }); if(shouldRefresh){ this.gettradelist(); } } ``` 此方法允许更灵活地控制同情况下页面的行为模式[^3]。 综上所述,以上三种方案都可以有效地解决因 `uni.navigateBack` 导致的页面重复加载问题。具体选择哪种取决于项目的架构和个人偏好等因素。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值