Vue 项目页面刷新方案:从原生方法到无白屏优化

更新日期: 2026-03-25 阅读: 21 标签: 刷新

vue 项目中,通过 window.location.href 实现页面自动刷新是常见需求。本文整理了原生刷新写法、无白屏优化方案以及不同场景的最佳实践,所有方案均可直接复制使用。


1. 方案一:window.location.href 刷新写法

这是原生 JavaScript 语法,Vue 中可直接使用,无任何依赖:

// 写法1:标准完整版(语义最清晰)
window.location.href = window.location.href;

// 简写版(效果完全一致)
location.href = location.href;

核心原理:将当前页面的 URL 重新赋值给 window.location.href 属性,浏览器检测到地址栏 URL 发生赋值行为后,会强制重新请求该 URL 并重载整个页面,从而实现刷新效果。


2. 方案二:同源的原生刷新(写法更简洁)

window.location.reload() 与 window.location.href 同属 window.location 对象的原生 api,功能等价,写法更简洁:

// 推荐写法
window.location.reload();

// 简写版
location.reload();

两种原生刷新的区别

  • 功能上:完全一致,都触发浏览器级别的完整页面刷新,会重新请求 html/css/JS 资源,销毁 Vue 实例后重新创建

  • 写法上:reload() 更简洁,是专门的刷新 API;href 是通过地址赋值间接实现刷新

  • 兼容性:无差别,所有浏览器都支持,Vue2/Vue3 通用


3. 带 URL 参数的页面如何刷新

如果页面 URL 带有参数(如 http://localhost:8080/user?id=10&name=test),以上两种写法完全适配,无需修改:

// 会保留所有 URL 参数
location.href = location.href;
// 等价
location.reload();

原理:location.href 本身就包含了完整的 URL(域名 + 路径 + 参数),赋值后自然会保留所有参数,刷新后页面参数不变。


4. 原生刷新的缺点(重要)

在 Vue 项目中使用原生刷新,会有一个明显影响体验的问题:页面白屏 + 闪烁。浏览器会先销毁当前页面的所有 dom 和 Vue 实例,等待重新请求资源后再渲染页面,白屏时长取决于网络速度和资源大小。

适用场景:适合简单页面,或必须完全重置页面所有状态的场景(如退出登录、清除所有缓存后刷新)。


5. 最优解:Vue 项目无白屏刷新方案

针对原生刷新的白屏问题,Vue 官方推荐「组件级刷新」方案,无白屏、无闪烁、体验更佳。以下是两种主流实现方式。

5.1 方式一:provide + inject 实现路由组件刷新

这是 Vue 官方推荐的刷新方案,只刷新当前路由匹配的组件,不会刷新整个浏览器页面,本质是销毁组件后重新挂载,因此无白屏、无闪烁、速度极快,Vue2/Vue3 通用。

实现步骤(两步完成,可全局复用)

步骤1:在根组件 App.vue 中配置刷新方法

<!-- App.vue -->
<template>
  <!-- 添加 key 属性,通过修改 key 实现组件刷新 -->
  <router-view :key="routerKey" />
</template>

<script>
export default {
  provide() {
    return {
      reload: this.reload
    }
  },
  data() {
    return {
      routerKey: 0 // 通过修改 key 值触发组件重新渲染
    }
  },
  methods: {
    reload() {
      // 每次调用刷新,key 值 +1,router-view 会销毁旧组件、挂载新组件
      this.routerKey += 1
    }
  }
}
</script>

步骤2:在任意页面组件中调用刷新

<!-- 业务组件,如 Home.vue / User.vue -->
<script>
export default {
  inject: ['reload'], // 注入根组件的刷新方法
  methods: {
    handleRefresh() {
      this.reload() // 无白屏刷新
    }
  }
}
</script>

5.2 方式二:空白页中转刷新

适用于存在全局状态(Vuex/Pinia)、全局缓存、全局事件总线等复杂逻辑的项目,同样无白屏、无闪烁。原理是通过路由跳转实现刷新:

  1. 新建空白页面 Blank.vue

  2. 刷新时先跳转到 Blank.vue,再立即跳回当前页面

  3. 跳转为前端路由级别,不会请求服务器,因此无白屏

实现代码(封装成全局方法)

// src/utils/index.js
export function pageReload() {
  const currentPath = window.location.href // 获取当前页面完整地址
  // 先跳转到空白页,再立即跳回原页面
  window.location.href = '/blank' // 空白页路由
  setTimeout(() => {
    window.location.href = currentPath
  }, 50)
}

// 组件中调用
import { pageReload } from '@/utils'
pageReload()

6. 关键注意事项

6.1 原生刷新会重置所有数据

window.location.href / location.reload() 会销毁整个 Vue 实例,页面上的 data 数据、Vuex/Pinia 状态、localStorage 以外的缓存都会被清空,刷新后恢复初始值。

适用场景:需要彻底重置页面状态的场景(如退出登录、修改用户信息后刷新)。

6.2 刷新时机的注意事项

在接口请求、定时器、异步操作之后执行刷新,必须将刷新代码写在回调函数内部,否则会出现刷新提前执行的问题:

// 错误写法:刷新会先执行,接口还没请求完
axios.post('/api/update', data)
this.reload()

// 正确写法:异步操作完成后再刷新
axios.post('/api/update', data).then(res => {
  if (res.code === 200) {
    location.reload() // 接口请求成功后,再刷新
  }
})

6.3 Vue3 中 setup 语法糖的兼容性

Vue3 项目使用 <script setup> 时,所有方案完全兼容,无需修改:

<script setup>
const handleRefresh = () => {
  window.location.href = window.location.href
  // 等价
  window.location.reload()
}
</script>

7. 所有刷新方案总结

刷新方式写法优点缺点适用场景
Vue 官方方案provide + inject无白屏、无闪烁、速度快仅刷新当前路由组件90% 的 Vue 业务场景(列表刷新、表单重置等)
原生刷新1location.href = location.href写法简单、原生无依赖白屏闪烁、销毁 Vue 实例必须清空所有状态(退出登录、清除缓存)
原生刷新2location.reload()写法更简洁同上同上
空白页中转路由跳转中转无白屏、兼容复杂全局状态多一个空白页路由复杂项目(有 Vuex/Pinia 全局状态)

8. 最终总结

  1. window.location.href 自动刷新的最简正确写法:location.href = location.href,Vue 中直接调用即可生效

  2. 等价的更优写法:location.reload(),功能完全一致,代码更简洁,推荐优先使用

  3. 原生刷新会有白屏闪烁,追求体验时优先使用 Vue 官方的 provide + inject 方案,这是 Vue 项目的最佳实践

  4. 所有方案 Vue2/Vue3 通用,无兼容性问题,带参数页面无需额外处理


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13501

相关推荐

js实现返回上一页(页面刷新与不刷新)

history.go(-1), 返回两个页面: history.go(-2);window.history.forward() 返回下一页;window.history.go(返回第几页,也可以使用访问过的URL) ;如果要强行刷新的话就是:window.history.back();

vue强制刷新子组件

把一个组件重置到初始状态是一个常见的需求,推荐的做法有两种:一种是父组件重置子组件的 prop,另一种是子组件暴露一个重置的方法供父组件调用。

Vue刷新当前页面的3种实现

缺点:同 this.$router.go(0) 一样,会白屏。通过 $nextTick(),协助实现。先把 <router-view /> 移除,移除后再重新添加,达到刷新当前页面的功能。是目前最合适的实现方式。

解决使用vuex刷新页面state数据消失

在实际的vue项目中,当我们的应用遇到多个组件之间的共享问题时,通常会用到Vuex(一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化),解决组件之间同一状态的共享问题。

vue页面如何返回不刷新_ vue页面撤退不能返回到顶部的实现

vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?1、使用vuex存储滚动状态,2、使用缓存keepAlive的实现

vue实现局部刷新

使用2.2.0 新增的provide / inject控制<router-view>的显示隐藏,在App.vue中使用provide,在使用局部刷新的组件中使用inject

$this.router.push到当前页面,只是传入参数不同,页面不刷新的问题解决

在vue中使用$this.router.push()方法,如果只是传入的参数不同,会出现url地址变化了,但是页面没有重新请求数据,需要刷新一下页面才有新的数据

浏览器刷新事件的监听和使用

浏览器F5刷新的时候有一个刷新执行之前的事件,beforeunload 事件,这个事件可以提示用户在刷新页面之前有一个提示。下面是beforeunload的用法:

js刷新当前页面的5种方式

当调用 location.reload() 方法时, aspx页面此时在服务端内存里已经存在, 因此必定是 IsPostback 的。如果有这种应用: 需要重新加载该页面,也就是说期望页面能够在服务端重新被创建,期望是 Not IsPostback 的

Vue 实现前进刷新,后退不刷新的效果

在一个列表页中,第一次进入的时候,请求获取数据。点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷新。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!