Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • JavaScript

  • TypeScript

  • Vue

    • Vue 编码指南
    • vue-cli 启动本地服务局域网不能访问的原因分析
    • 解决 Vue 相同路由参数不同不会刷新的问题
    • 解决 vuex requires a Promise polyfill in this browser 问题
    • 关于父组件通过 v-on 接收子组件多个参数的一点研究
    • Vue $attrs 和 $listeners
    • Vue axios 发送 Form Data 数据格式请求
    • Vue 开发技巧
    • Vue 动态路由
    • Vue 集成 UEditor 富文本编辑器
    • Vue 修饰符
    • Vue 问题集合
    • Vue props 传多值的问题
    • vue-router 在 IE11 下手动更改 URL 的 hash 不会触发路由
    • vue-router 路由参数刷新消失的问题
    • 那些年被我们忽略的 vue 语法
    • vue 生命周期深入
    • vue 组件通信深入
    • vue 组件通信深入 Vuex
    • vue项目移动端、pc端适配方案
    • vuepress 如何引入 vuex
  • ElementUI

  • React

  • AntD

  • 前端
  • Vue
Henry
2019-02-15

解决 Vue 相同路由参数不同不会刷新的问题

通常情况下我们喜欢设置 keepAlive 包裹 router-view

<div id="app">
  <keep-alive>
    <router-view></router-view>
  </keep-alive>
</div>
1
2
3
4
5

同时在 created 中触发请求, 在路由参数不同的情况下并不会执行对应的操作. 原因就是第一次路由渲染之后已经存到了缓存里, 第二次就不会触发组件的生命周期钩子, 因此获取不到

解决方法:

1、给 router-view 设置 key 属性为路由的完整路径

<keep-alive>
  <router-view :key="$route.fullPath"></router-view>
</keep-alive>
1
2
3

这种方法我觉得应该是一劳永逸的方法, 可能对性能造成一定损耗. 不适用于一个 tab 切换路由并加载列表的组件, 会造成页面白屏, dev 模式不会自动刷新, 是个坑

2、官方给出的方法是通过 watch 监听路由变化, 做判断路由路径然后调用响应的方法

watch: {
  '$route'() {
    if (this.$route.path === 'test') {
      this.test()
    }
  }
}
watch: {
  id: {
    //调用方法
    handler: 'test',
    //进入立即执行一次
    immediate: true
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

这两种方法推荐第一种, 第二种需要先对参数 id 进行赋值

3、通过组件导航守卫来设置对应的 meta 属性

beforeRouteEnter: (to, from, next) => { // 写在当前组件
  to.meta.keepAlive = false
  next()
}
beforeRouteLeave: (to, from, next) => { //写在前一个组件
  to.meta.keepAlive = false
  next()
}
1
2
3
4
5
6
7
8

4、通过 created 和 beforeRouteUpdate 两个钩子搭配使用

beforeRouteUpdate(to, from, next) {
  this.getData(to.query.id)
  next()
}
created() {
  this.getData(this.$route.query.id)
}
methods: {
  getData (id) {
    console.log(id)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

第一次路由渲染执行 created , 以后再次进入执行 beforeRouteUpdate

编辑 (opens new window)
#Vue
上次更新: 5/27/2023, 1:02:05 PM
vue-cli 启动本地服务局域网不能访问的原因分析
解决 vuex requires a Promise polyfill in this browser 问题

← vue-cli 启动本地服务局域网不能访问的原因分析 解决 vuex requires a Promise polyfill in this browser 问题→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式