【VUE3使用记录】页面及路由刷新

文章介绍了在Vue.js应用中实现页面刷新的三种方式:1)使用provide和inject组合,通过控制<router-view>的显示隐藏实现平滑刷新;2)调用router.go(0)利用路由历史刷新当前页面,但可能会有短暂白屏;3)使用location.reload()直接刷新页面,可选是否从服务器获取新资源。同时提到了location.replace()的区别,它会替换当前历史记录。

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

整理工作中用到的页面刷新方式:
1.provide/inject
2.router.go(0)
3.location.reload()
4.重复点击菜单时刷新页面

一、使用provide和inject

控制<router-view>的显示隐藏
默认<router-view v-if="isRouterAlive" /> isRouterAlive是true,在需要刷新的时候把这个值设为false,接着再重新设为true。搭配provide和inject使用,不会使页面出现短暂的空白,体验效果比较好
App.vue
testtset
需要刷新的组件:

// 导入inject
import { inject } from 'vue';
// 注入刷新事件,这里括号中的参数要对应上前面provide中的第一个参数
const goRefresh = inject('reload');

// 在需要执行的地方调用方法
goRefresh();

二、router.go(0)

利用了history中前进、后退的功能,传入0来刷新当前页面。相当于F5键刷新
刷新时页面会有一段时间的白屏。

const router = useRouter();
router.go(0);

三、location.reload()

效果同router.go(0)

location.reload();
1.JavaScript 中的一个方法,用于重新加载当前页面。这个方法可以在页面加载完成后使用,它将重新请求服务器并重新加载页面。
2.可传入布尔型参数,默认为false:

true :强制浏览器从服务器获取当前页面资源
忽略本地缓存,确保获取的是服务器上的最新版本,实现带缓存刷新的效果。
false:从缓存中读取当前页面
如果页面及其依赖资源(如图片、脚本等)在缓存中可用且未过期,浏览器将直接使用这些缓存的副本,而不会向服务器发起请求。这种方式的刷新速度较快,但不会检查服务器上是否有更新的内容,适用于需要快速重载页面而不关心内容是否更新的场景。

3.对比location.replace()
replace() :通过指定url替换当前缓存历史,试用replace()后不能再"前进、后退"来访问已被替换的url

四、重复点击菜单实现页面刷新

router.push()默认情况下不会重新加载组件,它只是改变URL并触发路由切换,如果目标路由对应的组件已经加载过,则不会重新创建和渲染该组件。这对于提高性能是有益的,但在需要强制刷新当前页面数据的场景下,这种方法就不适用了。

1.实现方法

要在Vue中实现点击菜单后刷新页面数据,而不实际重新加载整个页面,可以采取以下几种策略:
1.1 使用路由守卫
可以在目标路由的 beforeEach 导航守卫中,监听到导航发生时,手动调用组件的初始化方法或数据更新方法。

// 在路由配置中或全局前置守卫里
router.beforeEach((to, from, next) => {
  if (to.name === 'YourTargetRouteName') { // 替换为你的目标路由名称
    // 假设你有一个刷新数据的方法名为 refreshData
    to.meta.refreshData && to.meta.refreshData();
  }
  next();
});

然后,在定义路由时,可以给目标路由添加一个元信息(meta)来标记需要刷新数据:

{
  path: '/your-path',
  name: 'YourTargetRouteName',
  component: YourComponent,
  meta: {
    refreshData: () => {
      // 实现你的数据刷新逻辑
    }
  }
}

也可以使用组件内路由守卫

Vue 中的 onBeforeRouteUpdate生命周期钩子是在组件被复用时,即路由参数变化(需要给路由加入不同的参数如时间戳)但组件不重新创建的情况下触发的,它并不直接控制页面的刷新

beforeRouteUpdate(to, from, next) {
  // 强制重新加载当前路由
  next({ ...to, force: true });
}

1.2 使用key属性强制重新渲染组件
在Vue组件上使用:key属性,当:key的值变化时,Vue会认为这是一个全新的组件而进行重新渲染。
1.3 直接使用强制刷新

2.记录实际使用 key属性强制重新渲染 <router-view>

在路由参数变化时强制刷新页面
点击菜单tab栏时路由加入时间戳参数
在这里插入图片描述
利用 key 属性强制重新渲染
在这里插入图片描述

### 在 Vue3 中实现在不使用 `vue-router` 的情况下刷新页面 为了在 Vue3 应用中实现页面刷新而不依赖于 `vue-router`,可以利用 JavaScript 原生方法来控制浏览器行为。以下是几种常见的做法: #### 使用 location.reload 方法 最简单的方式就是调用浏览器的 `location.reload()` 函数来进行整个页面的重新加载。 ```javascript window.location.reload(); ``` 这种方法会强制浏览器重新请求服务器并重绘整个网页,效果如同用户手动点击了浏览器上的刷新按钮[^1]。 #### 利用 hashchange 事件模拟局部刷新 如果目标只是更新部分视图而不是完全重新载入页面,则可以通过改变 URL 的哈希值 (# 后面的部分),触发 `hashchange` 事件从而达到类似的效果而无需真正意义上刷新整个文档对象模型 (DOM)。 ```html <!-- HTML --> <a href="#section">Go to Section</a> <div id="content"> <!-- Content here --> </div> <script> // 监听 hash 变化 window.addEventListener(&#39;hashchange&#39;, function () { const newSection = window.location.hash.substring(1); updateView(newSection); // 自定义函数用于切换显示的内容区域 }); </script> ``` 这种方式不会引起完整的页面刷新,而是允许开发者自定义逻辑处理不同片段之间的转换。 #### 调整 history API 进行无刷新导航 对于更复杂的场景,还可以考虑采用 History Web API 来管理浏览历史记录条目,在不影响当前页面状态的前提下更改地址栏中的URL路径。 ```javascript function navigateTo(path){ window.history.pushState({}, &#39;&#39;, path); } navigateTo(&#39;/new-page&#39;); ``` 此操作仅改变了 URL 地址却不涉及实际资源获取过程;配合相应的监听器可构建出单页应用(SPA)-风格的功能特性,但同样不需要借助第三方库如 `vue-router` 即可完成基本需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值