实现VUE路由当前页面刷新

本文介绍如何在Vue应用中利用provide/inject特性实现当前路由的刷新,避免了使用window.reload()或router.go(0)带来的页面闪烁问题,提供了一种更优的用户体验解决方案。

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

当前路由刷新

进行当前路由刷新:

1.场景

在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。

2.遇到的问题

  1. 用vue-router重新路由到当前页面,页面是不进行刷新的

  2. 采用window.reload(),或者router.go(0)刷新时,整个浏览器进行了重新加载,闪烁,体验不好

  3. 解决方法

3.provide / inject 组合

作用:允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

<template>
  <div id="app">
    <router-view name="header"></router-view>
    <router-view v-if="isRouterAlive" name="default"></router-view> // 定义isRouterAlive
    <router-view name="footer"></router-view>
    <BackTop></BackTop>
  </div>
</template>

<script>
export default {
  name: "app",
  provide() {
    return {
      reload: this.reload
    };
  },
  data() {
    return {
      isRouterAlive: true
    };
  },
  methods: {
    reload() { // 定义reload方法
      this.isRouterAlive = false;
      this.$nextTick(() => {
        this.isRouterAlive = true;
      });
    }
  }
};
</script>

4.provide / inject 用法
provide:选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性。

inject:一个字符串数组,或一个对象,对象的 key 是本地的绑定名

提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。

在页面注入App.vue组件提供(provide)的 reload 依赖,在逻辑完成之后(删除或添加…),直接this.reload()调用,即可刷新当前页面。
在这里插入图片描述
这个部分是在某些当前页面操作并且提交之后显示在当前页面,没有白屏效果。

### 在 Vue实现跳转路由刷新页面的方法 在 Vue 开发中,有时需要在路由跳转后强制刷新页面以重新加载数据或重置组件状态。以下是几种常见的实现方法及其适用场景: --- #### 方法一:使用 `$route` 的 `watch` 监听器 通过监听 `$route` 对象的变化,在检测到路由发生变化时主动刷新页面。 ```javascript watch: { &#39;$route&#39;(to, from) { if (to.name !== from.name || to.params.id !== from.params.id) { window.location.reload(); // 当路由变化时刷新整个页面 } } } ``` 这种方法适用于需要彻底刷新页面的场景,但它会中断单页应用(SPA)的优势[^1]。 --- #### 方法二:创建中间过渡组件 通过引入一个空白的中间组件作为中转站,间接达到刷新效果。 ##### 步骤说明: 1. 创建一个新的组件 `Refresh.vue`,用于短暂停留后再返回原路径。 2. 设置路由规则以便能够访问该组件。 3. 在需要刷新的情况下,先导航至 `Refresh.vue`,然后再回到目标路径。 ###### **Refresh.vue** ```html <template> <div></div> <!-- 空白模板 --> </template> <script> export default { name: &#39;refresh&#39;, beforeRouteEnter(to, from, next) { next((vm) => { vm.$router.replace(from.path); // 返回之前的路径 }); }, }; </script> ``` 这种方式较为灵活,尤其适合那些不想破坏 SPA 结构又希望模拟全量刷新的行为[^2]。 --- #### 方法三:利用动态路由参数触发组件更新 如果只是想在同一组件内部根据不同参数调整视图而无需实际意义上的“刷新”,那么可以采用动态路由的方式,并确保每次改变参数都能触发生命周期钩子。 例如定义如下路由配置: ```javascript { path: &#39;/work_exhibition/:workId&#39;, name: &#39;WorkExhibition&#39;, component: () => import(&#39;@/components/WorkExhibition.vue&#39;), }, ``` 接着在父级组件内调用 `$router.push()` 并附带新的参数值: ```javascript this.$router.push({ name: &#39;WorkExhibition&#39;, params: { workId: newId }, }); // 手动调用初始化函数来同步最新的数据 this.init(); ``` 这种策略特别适合于展示型界面,其中大部分逻辑围绕着特定实体展开[^3]。 --- #### 方法四:基于 `v-if` 控制组件实例化 另一种优雅的做法是在根布局文件(通常是 App.vue)里加入变量控制 `<router-view>` 是否渲染,以此迫使当前活动组件经历完整的卸载与重建过程。 ##### 修改 App.vue 文件结构如下所示: ```html <template> <div id="app"> <router-view v-if="isRouterAlive"></router-view> </div> </template> <script> export default { name: "App", provide() { return { reload: this.reload, }; }, data() { return { isRouterAlive: true, }; }, methods: { reload() { this.isRouterAlive = false; this.$nextTick(() => (this.isRouterAlive = true)); }, }, }; </script> ``` 随后任何地方都可以简单地注入并调用 `reload` 函数完成局部区域内的伪刷新操作[^4]。 --- ### 总结 以上四种方案各有优劣,开发者应依据项目实际情况选取最合适的解决方案。通常情况下推荐优先考虑第三种和第四种方式,因为它们既保留了良好的用户体验又能满足功能性需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值