30、Vuex 为啥可以进行缓存处理

  1. Vuex 状态管理基础与缓存的关联

    • Vuex 的核心概念

      • Vuex 主要由五个部分组成:statemutationsactionsgettersmodules。其中,state是存储数据的地方,类似于一个全局的数据仓库。在这个菜谱 APP 的例子中,缓存的数据就存储在state中。
      • 例如,我们可以在state中定义一个对象来存储菜谱品类和菜谱的数据,像这样:

        javascript

        const state = {recipeCache: {}
        };
        

        这里的recipeCache就是用来缓存菜谱相关数据的对象,以品类下标作为键,对应的菜谱数据作为值。
    • 组件与 Vuex 数据的交互

      • 组件可以通过mapStatemapGetters等辅助函数来获取state中的数据。这样,不同的组件(如左边的菜谱品类展示组件和右边的菜谱展示组件)都能够访问和使用存储在state中的缓存数据。
      • 比如,在一个组件中,我们可以这样获取缓存的菜谱数据:

        javascript

        import { mapState } from 'vuex';
        export default {computed: {...mapState(['recipeCache'])}
        };
        

        这使得组件能够方便地获取recipeCache中的数据,并根据这些数据进行渲染。
  2. 缓存处理的具体实现与优势

    • 减少接口调用次数

      • 最初,每次切换菜谱品类时,都会调用接口获取数据。有了 Vuex 缓存后,在获取数据之前,可以先检查state中的recipeCache对象是否已经存在对应的品类数据。
      • 例如,有一个方法用于获取菜谱数据,改造后的代码可能如下:

        javascript

        async getRecipeData(categoryIndex) {if (this.$store.state.recipeCache[categoryIndex]) {return this.$store.state.recipeCache[categoryIndex];}// 如果缓存中没有数据,则调用接口获取const data = await api.getRecipeData(categoryIndex);this.$store.commit('setRecipeData', { categoryIndex, data });return data;
        }
        

        这里通过判断recipeCache中是否存在数据来决定是否调用接口,从而避免了不必要的接口调用,减少了性能消耗。
    • 数据共享与一致性

      • 由于 Vuex 的state是全局共享的,多个组件可以访问相同的缓存数据。这确保了整个应用中菜谱数据的一致性。
      • 比如,左边的菜谱品类组件和右边的菜谱展示组件都可以访问recipeCache中的数据。当左边组件切换品类时,右边组件可以直接使用更新后的缓存数据进行渲染,而不需要重新获取数据,保证了数据在不同组件之间的同步和共享。
  3. 引用类型问题及深复制解决方案

    • 引用类型在响应式系统中的挑战

      • 在 JavaScript 中,对象和数组是引用数据类型。在 Vue 的响应式系统中,如果只是修改了引用数据类型内部的属性,而没有改变数据的引用地址,Vue 可能无法检测到数据的变化。
      • 例如,在recipeCache中存储的菜谱数据是一个对象。如果直接修改这个对象的某个属性,像这样:

        javascript

        this.$store.state.recipeCache[categoryIndex].recipeName = '新菜谱名称';
        

        Vue 可能不会触发组件的更新,因为数据的引用地址没有改变。
    • 深复制的原理与应用

      • 深复制是创建一个全新的对象,它的所有属性和子属性都是原始对象的副本。在mutation中进行深复制,可以确保每次更新数据时,数据的引用地址发生变化,从而触发 Vue 的响应式更新。
      • 假设我们有一个mutation用于更新recipeCache中的数据,可能会这样做:

        javascript

        mutations: {setRecipeData(state, { categoryIndex, data }) {// 使用深复制库(如lodash的cloneDeep)const newData = _.cloneDeep(data);state.recipeCache[categoryIndex] = newData;}
        }
        

        通过这种方式,每次更新数据时,都会将全新的数据副本赋值给recipeCache,使得 Vue 能够正确地检测到数据的变化并更新组件。
  4. 缓存清除与生命周期钩子的配合

    • 缓存清除的原因

      • 虽然缓存数据可以提高性能,但如果后台数据发生变化,而缓存没有更新,页面将显示旧的数据。因此,需要在适当的时候清除缓存,以便下次访问页面时能够重新获取最新的数据。
      • 例如,当用户退出菜谱页面或者在一定条件下(如后台数据更新通知),应该清除recipeCache中的数据。
    • 生命周期钩子的选择

      • destroyed 生命周期钩子:在组件正常销毁时,destroyed钩子会被触发。如果组件没有被Keep - alive包裹,这个钩子可以用来清除缓存。例如:

        javascript

        destroyed() {this.$store.commit('clearRecipeCache');
        }
        
      • deactivated 生命周期钩子:当组件被Keep - alive包裹时,组件在切换时不会被销毁,而是会触发deactivated钩子。在这种情况下,应该在deactivated钩子中清除缓存,以确保数据的及时更新。例如:

        javascript

        deactivated() {this.$store.commit('clearRecipeCache');
        }
        

        这里的clearRecipeCache是一个mutation,用于清除recipeCache中的数据,比如将recipeCache对象重置为空对象等操作。

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

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

相关文章

25届数字IC验证秋招总结

一、个人概况 双非本9硕,2024年初开始通过白皮书蓝皮书自学验证,半年实习经验,有竞赛无专利论文,在秋招期间投递企业130余家,绝大部分投递岗位为数字验证,面试20家,收到5个offer。因为背景和相关…

【商城实战(37)】Spring Boot配置优化:解锁高效商城开发密码

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配&#xf…

网页制作12-html,css,javascript初认识のJavascipt脚本基础

一、JavaScript的三种基本使用方法:body|head|外部 网页效果: 运行代码: .html <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title><script> function n1(){document.getElementById(…

全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解

在当今的多媒体时代&#xff0c;视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…

麒麟服务器操作系统PostgreSQL环境部署手册

软件简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。 ORDBMS(对象关系数据库系统)是面向对象技术与传统的关系数据库相结合的产物,查询处理是 ORDBMS 的重要组成部分,它的性能优劣将直接影响到DBMS 的性能。 软件环境 操作系统…

【蓝桥杯速成】| 4.递归

递归 题目一&#xff1a;最大公约数 问题描述 1979. 找出数组的最大公约数 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;返回数组中最大数和最小数的 最大公约数 。 两个数的 最大公约数 是能够被两个数整除的最大正整数。 解题步骤 需要…

当大模型训练遇上“双向飙车”:DeepSeek开源周 DualPipe解析指南

前言 在大模型训练中&#xff0c;传统流水线并行因单向数据流和通信延迟的限制&#xff0c;导致GPU利用率不足60%&#xff0c;成为算力瓶颈。DeepSeek团队提出的DualPipe双向流水线架构&#xff0c;通过双向计算流与计算-通信重叠的创新设计&#xff0c;将前向与反向传播拆解为…

蓝桥杯好题推荐---前缀和

&#x1f308;个人主页&#xff1a; 羽晨同学-CSDN博客 &#x1f4ab;个人格言:“成为自己未来的主人~” 题目链接 【模板】前缀和https://ac.nowcoder.com/acm/problem/226282 解题思路 这种题目是要求我们找到一个数组中从l到r的元素的和&#xff0c;查询Q次&#xff0c;…

Nginx快速上手

什么是nginx Nginx 是一款开源的高性能 HTTP 和反向代理服务器&#xff0c;同时也提供了 IMAP/POP3/SMTP 代理功能。它由俄罗斯程序员 Igor Sysoev 于2004年首次发布&#xff0c;最初设计目的是为了解决 C10k 问题&#xff0c;即如何让单台服务器同时处理1万个并发连接的问题。…

【C++】:STL详解 —— 布隆过滤器

目录 布隆过滤器的概念 布隆过滤器的优点 布隆过滤器的缺点 布隆过滤器使用场景 布隆过滤器的实现 布隆过滤器的概念 布隆过滤器&#xff08;Bloom Filter&#xff09; 是一种空间效率极高的概率型数据结构&#xff0c;用于快速判断一个元素是否属于某个集合。其核心特点…

从Instagram到画廊:社交平台如何改变艺术家的展示方式

从Instagram到画廊&#xff1a;社交平台如何改变艺术家的展示方式 在数字时代&#xff0c;艺术家的展示方式正在经历一场革命。社交平台&#xff0c;尤其是Instagram&#xff0c;已经成为艺术家展示作品、与观众互动和建立品牌的重要渠道。本文将探讨社交平台如何改变艺术家的…

MySQL(事物上)

目录 示例&#xff1a; 一 引入事物 1. 概念 2. 事物的4大特性 3. 为什么要有事物&#xff1f; 二 事物操作 1. 查看存储引擎支持的事物 2. 事物的提交方式 2.1 查看事物的默认提交方式 2.2 设置事物的默认提交方式 2.3 查看事物的全局隔离级别 2.4 验证事物的回滚…

Spring Boot 实现多数据源配置

一、配置流程 在 Spring Boot 中实现多数据源配置通常用于需要连接多个数据库的场景。主要有以下几个步骤&#xff1a; 配置多个数据源的连接信息。定义多个数据源的 Bean。为每个数据源配置MyBatis的SqlSessionFactory和事务管理器。为每个数据源定义Mapper接口和Mapper XML…

p5.js:绘制各种内置的几何体,能旋转

向 豆包 提问&#xff1a;请编写 p5.js 示例&#xff0c; 绘制各种内置的几何体&#xff0c;能让这些几何体缓慢旋转。 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . 此代码创建了一个包含多个内置几何体的 3D 场景&#xff0c;每个几何体都有不同的颜色和位置。运行代…

结构体定义与应用

引言 到今天为止,c语言的基础操作和基础数据类型,就都已经结束了,大家都知道,如果要实现复杂的功能,大家都可以通过函数封装调用,那么如果要实现基础数据类型的封装,该怎么办呢?答案就是结构体。 在C语言编程中,结构体(struct)是非常重要的一个概念,它为程序员提供…

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…

R语言零基础系列教程-01-R语言初识与学习路线

代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境&#xff0c;是一门用于统计计算和作图的语言。“一切皆是对象”&#xff0c;数据、函数、运算符、环境等等都是对象。易学&#xff0c;代码像伪代码一样简洁&#xff0c;可读性高强大的统计和可视…

PythonWeb开发框架—Flask-APScheduler超详细使用讲解

1.定时任务的两种实现方式 1.1 用scheduler.task装饰任务 安装插件&#xff1a; pip install Flask-APScheduler pip install apscheduler 脚本实现&#xff1a; ###app.py##导入依赖库 from flask import Flask import datetime import config from flask_apscheduler i…

python_巨潮年报pdf下载

目录 前置&#xff1a; 步骤&#xff1a; step one: pip安装必要包&#xff0c;获取年报url列表 step two: 将查看url列表转换为pdf url step three: 多进程下载pdf 前置&#xff1a; 1 了解一些股票的基本面需要看历年年报&#xff0c;在巨潮一个个下载比较费时间&…

从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(2)消息队列与消息中间件

文章大纲 原始视频队列Python 内存视频缓存优化方案(4GB 以内)一、核心参数设计二、内存管理实现三、性能优化策略四、内存占用验证五、高级优化技巧六、部署建议检测结果队列YOLO检测结果队列技术方案一、技术选型矩阵二、核心实现代码三、性能优化策略四、可视化方案对比五…