后台管理系统里点保存,成功后想刷一下让列表更新,随手写了个 window.location.reload()。结果体验很差:弹窗全没了,滚动位置回到顶部,表单里没提交的备注也清空。
它到底做了什么
这行代码让浏览器重新加载当前文档,等价于按 F5。默认不带参数就是普通刷新,可能命中缓存;传 true 相当于强制刷新,会重新请求所有资源,通常对应 Ctrl+F5。
什么时候会触发重复提交
- POST 后刷新:刷新会重发上一次的表单提交,浏览器弹出确认框,点了确定就插了两条数据。
- 事件里没防抖:用户连点两次保存,两次都跑 reload,页面闪烁还发两次请求。
- 状态全丢:单页应用里用 reload 是杀鸡用牛刀,内存里的 store 数据全没了。
更合适的替代做法
要更新列表,直接调接口重新拉数据,别整页刷。要在路由间跳转,用 router.replace 或 push。要保留滚动位置,先记 scrollTop 再恢复。真要重置整个页面状态,location.href 赋成自己有时比 reload 更可控,因为它走的是正常导航流程。
需要强制清缓存时
偶尔确实要硬刷新,可以给请求 URL 加一个时间戳,比如在 href 后面拼上 ?t=Date.now(),绕过浏览器缓存,比 reload 传 true 更可控,也不会把所有资源都重下。
还有一种场景是长时间开着的页面,比如监控大屏,定时刷新一次能防止内存越积越多。这时候配个定时器,半夜没人看的时候刷,比白天闪一下强多了。
说白了 reload 是个粗活,能用局部更新就别用它。只有登录过期跳登录页、权限变了要整页重载这种场景,才值得请它出场。