美文网首页
什么是路由缓存问题?

什么是路由缓存问题?

作者: Goorln | 来源:发表于2023-09-25 11:16 被阅读0次

响应路由参数的变化

使用带有参数的路由时,当用户从/users/tom导航到/users/bob时,相同的组件实例将被重复使用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会被调用

问题:一级分类的切换正好满足上面的条件,组件实例复用,导致分类数据无法更新

routes: [{
        path: '/',
        component: Layout,
        children: [{
            path: '',
            component: Home
        }, {
            path: '/category/:id',
            component: Category
        }]
    }]
路由缓存问题.gif

如上图动画显示:路由变化了,但是页面还有缓存,数据未变化

解决上面路由缓存问题的思路:

  1. 让组件实例不复用,强制销毁重建
  2. 监听路由变化,变化之后执行数据更新操作
方案一:给 router-view 添加 key

以当前路由完整路径为key的值,给router-view组件绑定

<RouterView :key="$route.fullpath">

最常见的用例是v-for结合:

<ul>
  <li v-for="item in items" :key="item.id">...</li>
</ul>

也可用于强制替换一个元素或组件而不是复用它。当你想这么做时他可能会很有用:

  • 在适当的时候触发组件的生命周期钩子
  • 触发过渡


    添加key.gif

    如上图,但是这样在我们上面的项目中会造成banner接口重复调用问题,造成资源浪费

方案二:使用beforeRouteUpdate导航钩子

beforeRouteUpdate钩子函数可以在每次路由更新之前执行,在回调中执行需要数据更新的业务逻辑即可

或者,使用beforeRouteUpdate,它也可取消导航:

const User={
  template: '...',
  async beforeRouteUpdate(to, from) {
    // 对路由变化做出响应
    this.userData = await fetchUser(to.params.id)
  }
}

在项目中修改:

import { onBeforeRouteUpdate } from "vue-router";
// 目标:路由参数变化的时候,可以把分类数据接口重新发送
onBeforeRouteUpdate((to) => {
  console.log(to);
  getCategoryAPI(to.params.id)
});
onBeforeRouteUpdate.gif

如上图: 发现banner接口没有存在多余请求了

总结
  1. 路由缓存问题产生的原因是什么?
    答:路由只有参数变化时,会复用组件实例
  1. 两种方案都可以解决路由缓存问题,如何选择呢?
    答:在意性能问题,选择 onBeforeRouteUpdate,精细化控制
    不在意性能问题,选择添加 key,简单粗暴

相关文章

  • 家里WiFi变慢了怎么办?清除路由器缓存让网速起飞

    如果你的路由器容易卡顿,除去被蹭网的可能性,那你的路由器多半是缓存需要清理了。 路由器缓存是什么情况 路由器别看是...

  • Vue缓存路由

    一、缓存全部路由: 二、缓存指定路由: include 使用meta: (1). 路由中做如下配置: (2). 在...

  • VUE 动态移除缓存路由

    VUE 动态移除缓存路由 在缓存路由时,有时候需要将缓存的路由清除掉达到刷新页面数据的效果。方法如下: 配置路由时...

  • Laravel本就好玩

    隐式控制器 路由声明: 控制器写法 缓存 路由缓存 在你的项目部署完成后执行 生成路由缓存,缓存一旦生成,app/...

  • 组件缓存

    页面内部缓存: 路由跳转缓存:

  • vue中三级路由无法缓存问题

    1、问题表述: 三级路由设置cache不起作用,该路由页不会被缓存 2、路由结构(json): 3、 解决办法 第...

  • tp5 提升性能的几个方法

    1 生成路由缓存 如果你的应用定义了大量的路由规则,那么建议在实际部署后生成路由缓存文件,可以免去路由注册的开销,...

  • Vue3+TS Day23 - vue-router、路由动画、

    1、如何给路由切换添加动画? 2、如何给路由切换添加缓存? 使用 keep-alive 包裹 3、为什么要【动态的...

  • 路由缓存

    1、路由缓存 2、重置data的值

  • 路由缓存

    keep-alive组件 路由组件特有的两个生命周期

网友评论

      本文标题:什么是路由缓存问题?

      本文链接:https://www.haomeiwen.com/subject/thnqbdtx.html