Vue Router 路由动态缓存组件

文章目录

  • 一、简介
    • 基本用法
    • 生命周期钩子
  • 二、定义是否缓存组件
  • 三、缓存组件
    • 1. 通过 :include 属性实现
      • vue2.x中
      • vue3.x中
    • 2. 通过 v-slot 功能实现
    • 3. 通过 v-if 来实现
  • 四、注意事项


一、简介

Vue Router 允许你缓存路由组件,这样在用户导航回之前的页面时,组件的状态会被保留而不是重新渲染。这可以通过使用 <keep-alive> 组件来实现。

<keep-alive> 是一个内置抽象组件,它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

它的主要作用是缓存不活动的组件实例,而不是销毁它们。

当组件在 <keep-alive> 包裹下被切换时,它的状态(包括数据、DOM 结构等)都会被保留,以便在下次重新显示时能够恢复之前的状态,而不是重新创建组件实例。

基本用法

<keep-alive>  <component :is="currentTabComponent"></component>  
</keep-alive>

在上面的例子中,currentTabComponent 是一个动态组件,它的值会根据当前选中的标签页而变化。
使用 <keep-alive> 后,当切换标签页时,之前的组件实例会被缓存起来,而不是被销毁。

生命周期钩子

<keep-alive> 包裹的组件拥有两个特有的生命周期钩子:activateddeactivated

  • activated:当组件被激活时调用,即在 keep-alive 缓存中组件再次可见时被调用。

  • deactivated:当组件被停用时调用,即在 keep-alive 缓存中组件不可见时被调用。

这两个钩子可以帮助你更好地管理组件的状态,比如当组件重新被激活时,你可能需要重新获取数据或者更新视图。


二、定义是否缓存组件

根据路由的 meta 字段中的 keepAlive 属性来决定是否缓存组件。

如果 keepAlive 为 true,则组件会被缓存;否则,它会被缓存。

const routes = [{path: '/foo',component: Foo,meta: { keepAlive: true } // 这个组件会被缓存},{path: '/bar',component: Bar,meta: { keepAlive: false } // 没有设置 meta.keepAlive 或其值为 false,则组件不会被缓存}// ... 其他路由配置
];

三、缓存组件

1. 通过 :include 属性实现

可利用keep-aliveincludeexclude 属性(include 和 exclude 包含的name 是组件的name不是router name)来设置缓存:

  • include 值为字符串或者正则表达式匹配的组件name会被缓存
  • exclude 值为字符串或正则表达式匹配的组件name不会被缓存

vue2.x中

通过 <keep-alive>:include 属性来实现动态缓存组件

<template><div id="app"><keep-alive :include="cachedViews"><router-view></router-view></keep-alive></div>
</template><script>export default {name: 'App',data() {return {cachedViews: [] // 存储需要缓存的组件名};},watch: {$route(to, from) {// 过滤出需要缓存的组件,即 meta.keepAlive = true 的组件const keepAliveComponent = to.matched.filter(record => {return record.meta && record.meta.keepAlive;});if (keepAliveComponent.length) {// 把需要缓存的组件的name放到cachedViews集合里this.cachedViews = this.cachedViews.concat(keepAliveComponent.map(record => record.name));} else {const index = this.cachedViews.indexOf(to.name);if (index > -1) {this.cachedViews.splice(index, 1);}}}}};
</script>

.

vue3.x中

在 Vue 3 中同样可以使用 <keep-alive>:include 属性来实现动态缓存组件:

<template><div id="app"><keep-alive :include="cachedViews"><router-view></router-view></keep-alive></div>
</template><script>import { ref, onMounted, watch, onUnmounted } from 'vue';import { useRoute } from 'vue-router';export default {name: 'App',setup() {const cachedViews = ref([]);const route = useRoute();const updateCachedViews = () => {const keepAliveComponent = route.matched.filter(record => {return record.meta && record.meta.keepAlive;});cachedViews.value = keepAliveComponent.map(record => record.name);};onMounted(() => {updateCachedViews();});watch(route,() => {updateCachedViews();},{ immediate: false });onUnmounted(() => {// 清理操作,如果需要的话});return {cachedViews};}};
</script>

2. 通过 v-slot 功能实现

由于Vue 3 由于引入了组合式 APIv-slot 功能,有更简洁的方式来实现动态缓存:

<template><div id="app"><router-view v-slot="{ Component }"><keep-alive v-if="Component.meta && Component.meta.keepAlive"><component :is="Component" /></keep-alive><component v-else :is="Component" /></router-view></div>
</template><script>import { defineComponent } from 'vue';export default defineComponent({name: 'App'});
</script>

使用<router-view>v-slot 功能来访问当前路由组件的实例。

然后,我们检查这个组件的 meta.keepAlive 属性来决定是否将其包裹在 <keep-alive> 中。


3. 通过 v-if 来实现

在Vue2和Vue3中都可以使用 v-if="$route.meta.keepAlive" 来判断哪些组件需要缓存,简单粗暴

<template><div id="app"><keep-alive v-if="$route.meta.keepAlive"><router-view></router-view></keep-alive><router-view v-if="!$route.meta.keepAlive"></router-view></div>
</template><script>import { defineComponent } from 'vue';export default defineComponent({name: 'App'});
</script>

四、注意事项

  • 虽然 <keep-alive> 可以提高性能,但也要避免过度使用,因为缓存的组件实例会占用内存。

  • 当组件被 <keep-alive> 包裹时,它的 createdmounted 钩子只会在第一次渲染时调用,之后的切换不会再次触发这两个钩子。

  • 如果需要强制刷新缓存的组件,可以通过改变 key 属性或者使用 ·include/exclude· 属性来动态控制哪些组件需要被缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python:算法竞赛入门之一

计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.py 如下 # -*- coding: utf-8 -*- """ 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;""" import sys from …

Go 认证与授权(Authentication)

场景 我们应用开发经常会遇到认证和授权问题&#xff0c;比如&#xff1a;ERP系统、OA系统、CRM系统等等&#xff0c;这些系统都需要用户登录后才能访问&#xff0c;如何实现用户登录和权限认证呢&#xff1f; 我们来看下对应的解决方案&#xff1a; Python的装饰器模式 熟…

程序员Java.vue,python前端后端爬虫开发资源分享

bat面试资料 bat面试题汇总 提取码&#xff1a;724z 更多资料

项目总体测试计划书

目的&#xff1a;编写此测试方案的目的在于明确测试内容、测试环境、测试人员、测试工作进度计划等&#xff0c;以保证测试工作能够在有序的计划安排进行。 测试目标&#xff1a;确保XXX项目的需求分析说明书中的所有功能需求都已实现&#xff0c;且能正常运行&#xff1b;确保…

【Web】DASCTF 2023 0X401七月暑期挑战赛题解

目录 EzFlask MyPicDisk ez_cms ez_py 让俺看看401web题 EzFlask 进来直接给了源码 import uuidfrom flask import Flask, request, session from secret import black_list import jsonapp Flask(__name__) app.secret_key str(uuid.uuid4())def check(data):for i i…

nuxt.config.js配置

babel 预设在构建客户端/服务端的版本。 默认为 nuxt/babel-preset-app 在client构建中是ie&#xff1a;9&#xff0c;在server构建中是node:current。 build.babel.presets 中配置的预设将应用于客户端和服务器构建。目标将由 Nuxt 相应地设置&#xff08;客户端/服务器&#…

React ant 点击导航条闪烁

问题 : 点击当前位置会出现闪一下的效果 另一种点击方式 , 不会闪 原因 : 没有传递具体的参数给点击事件 , 导致在函数内部无法准确判断要展示哪个子菜单&#xff0c;可能导致页面状态的短暂变化&#xff0c;出现闪烁效果 代码 : // 左侧子菜单弹出const showSonMenu routeK…

【数据挖掘】实验7:高级绘图(上)

实验7&#xff1a;高级绘图&#xff08;上&#xff09; 一&#xff1a;实验目的与要求 1&#xff1a;了解R语言中各种图形元素的添加方法&#xff0c;并能够灵活应用这些元素。 2&#xff1a;了解R语言中的各种图形函数&#xff0c;掌握常见图形的绘制方法。 二&#xff1a;实…

python-study-day1

ps&#xff1a;前言 可做毕设&#xff0c;html&#xff0c;web&#xff0c;app&#xff0c;小程序&#xff0c;bug修改&#xff0c;可加急 作者自述 作为一名前端开发工程师&#xff0c;这个大环境不好的情况下&#xff0c;我试过我前端接单子但是没有后端&#xff0c…

用java实现单链表的头插,尾插和反转

今天来练习以下单链表的一些操作&#xff0c;以下的操作都是带有头节点的链表。 定义链表节点类 定义了节点中的值&#xff0c;节点的下一个节点&#xff0c;和一些基本的方法。 public static class ListNode{int val;ListNode next;public ListNode() {}public ListNode(in…

NPM 命令备忘单

NPM 简介 Node Package Manager (NPM) 是 Node.js 环境中不可或缺的命令行工具&#xff0c;充当包管理器来安装、更新和管理 Node.js 应用程序的库、包和模块。对于每个 Node.js 开发人员来说&#xff0c;无论他们的经验水平如何&#xff0c;它都是一个关键工具。 NPM 的主要…

pom.xml显示灰色并被划线

在使用 IDEA 进行开发的过程中&#xff0c;有时候会遇到 pom.xml 显示灰色并被划线的情况&#xff0c;如下图&#xff1a; 这一般是因为该文件被 Maven 忽略导致的&#xff0c;可以进行如下操作恢复&#xff1a; 设置保存后&#xff0c;可以看到 pom.xml 恢复了正常&#xff1a…

计算机网络书籍--《网络是怎样连接的》阅读笔记

第一章 浏览器生成信息 1.1 生成HTTP请求信息 1.1.1 URL Uniform Resource Locator, 统一资源定位符。就是网址。 不同的URL能够用来判断使用哪种功能来访问相应的数据&#xff0c;比如访问Web服务器就要用”http:”&#xff0c;而访问FTP服务器用”ftp:”。 FTP&#xff…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址&#xff1a;https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念&#xff1a;FSM&#xff08;有限状态机&#xff09;&#xff0c;模式之间转换 状态机&#xff0c;也叫有限状态机&#xff08…

label 的作用是什么?如何使用?

label标签来定义表单控件的关系&#xff1a;当用户选择label标签时&#xff0c;浏览器会自动将焦点转到和label标签相关的表单控件上。 使用方法1&#xff1a; <label for"mobile">Number:</label> <input type"text" id"mobile&quo…

Linux Docker挂载群晖WebDAV到本地

挂载群晖的WebDAV&#xff0c;使用群晖的WebDAV Server搭建的服务。 群晖配置了证书。 使用镜像&#xff1a; docker-webdav-client docker run -it --rm \--device /dev/fuse \--cap-add SYS_ADMIN \--security-opt "apparmorunconfined" \--env "WEBDRIVE_U…

零基础如何学习linux知识

零基础学习Linux需要一个结构化和逐步深入的学习计划。以下是一个学习方向和框架仅供参考&#xff1a; 一&#xff0c; 学习方向 1. **了解Linux基础**&#xff1a; - 理解开源概念。 - 了解Linux的历史和它的重要性。 - 认识不同的Linux发行版。 2. **命令行操作*…

基于OptiTrack跟踪系统和Turtlebot机器人的视觉SLAM定位评估

本文旨在介绍使用OptiTrack光学跟踪系统和Turtlebot机器人进行视觉SLAM定位实验的详细流程&#xff0c;包括实验平台搭建过程、数据处理过程以及SLAM估计评估方法。由于涉及知识较多&#xff0c;部分内容只给出了相关参考博文链接。 1 实验平台搭建 实验平台包括OptiTrack光学…

Golang | Leetcode Golang题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; func removeDuplicates(nums []int) int {n : len(nums)if n 0 {return 0}slow : 1for fast : 1; fast < n; fast {if nums[fast] ! nums[fast-1] {nums[slow] nums[fast]slow}}return slow }

前端面试问题汇总 - HTTP篇

1. 登录拦截如何实现&#xff1f; 在前端&#xff0c;可以拦截所有需要登录的请求&#xff0c;如果用户未登录或者登录过期&#xff0c;则跳转到登录页面。 2. http 缓存有哪些&#xff1f; 强缓存&#xff1a; 强缓存是指在客户端请求资源时&#xff0c;先检查本地是否存在缓存…