react 页面数据缓存方案

在 React 应用中,可以通过多种方式缓存页面数据,从而提升性能、优化用户体验,尤其在需要频繁请求和重渲染的场景中。以下是实现页面数据缓存的几种常见方法及其代码示例。

1. 在组件状态中缓存数据

复制代码
在页面未卸载的情况下,将数据存储在组件的 state 中,避免重复请求。
js 复制代码
import React, { useState, useEffect } from "react";

function MyPage() {
  const [data, setData] = useState(null);

  useEffect(() => {
    // 模拟数据请求
    if (!data) {
      console.log("Fetching data...");
      setTimeout(() => {
        setData("This is cached data!");
      }, 1000);
    }
  }, [data]);

  return (
    <div>
      <h1>页面数据缓存示例</h1>
      <p>{data || "Loading..."}</p>
    </div>
  );
}

export default MyPage;

优点

复制代码
简单易用。
数据只在页面卸载时丢失。

缺点

复制代码
页面卸载后数据会丢失。
不适合需要持久化的数据。

2. 使用 localStorage 持久化缓存

复制代码
将页面数据存储到 localStorage 中,在刷新或重新进入页面时自动加载。

示例代码

js 复制代码
import React, { useState, useEffect } from "react";

function MyPage() {
  const [data, setData] = useState(() => {
    // 初始加载时从 localStorage 读取数据
    const cachedData = localStorage.getItem("myPageData");
    return cachedData ? JSON.parse(cachedData) : null;
  });

  useEffect(() => {
    if (!data) {
      console.log("Fetching data...");
      setTimeout(() => {
        const fetchedData = "This is persistent cached data!";
        setData(fetchedData);
        localStorage.setItem("myPageData", JSON.stringify(fetchedData));
      }, 1000);
    }
  }, [data]);

  return (
    <div>
      <h1>页面数据缓存示例</h1>
      <p>{data || "Loading..."}</p>
    </div>
  );
}

export default MyPage;

优点

复制代码
数据在页面刷新或关闭后仍然可用。
适合需要长期保存的数据。

缺点

复制代码
手动管理数据清理。
数据存储容量有限(通常 5-10MB)。

3. 使用 sessionStorage 短期缓存

复制代码
将页面数据存储在 sessionStorage 中,浏览器关闭时数据会自动清除。

示例代码

js 复制代码
import React, { useState, useEffect } from "react";

function MyPage() {
  const [data, setData] = useState(() => {
    const cachedData = sessionStorage.getItem("myPageData");
    return cachedData ? JSON.parse(cachedData) : null;
  });

  useEffect(() => {
    if (!data) {
      console.log("Fetching data...");
      setTimeout(() => {
        const fetchedData = "This is session cached data!";
        setData(fetchedData);
        sessionStorage.setItem("myPageData", JSON.stringify(fetchedData));
      }, 1000);
    }
  }, [data]);

  return (
    <div>
      <h1>页面数据缓存示例</h1>
      <p>{data || "Loading..."}</p>
    </div>
  );
}

export default MyPage;

优点

复制代码
比 localStorage 更适合短期缓存。
数据清除后不会影响其他页面。

缺点

复制代码
浏览器关闭后数据会丢失。

4. 使用状态管理库(如 Redux)缓存

复制代码
通过全局状态管理,将页面数据存储在 Redux Store 中,避免跨组件的数据丢失。

示例代码

1.定义 Redux Store 和 Action:

java 复制代码
// store.js
import { createStore } from "redux";

const initialState = { pageData: null };

function reducer(state = initialState, action) {
  switch (action.type) {
    case "SET_DATA":
      return { ...state, pageData: action.payload };
    default:
      return state;
  }
}

const store = createStore(reducer);

export default store;

2.在组件中使用 Redux

java 复制代码
import React, { useEffect } from "react";
import { useSelector, useDispatch } from "react-redux";

function MyPage() {
  const data = useSelector((state) => state.pageData);
  const dispatch = useDispatch();

  useEffect(() => {
    if (!data) {
      console.log("Fetching data...");
      setTimeout(() => {
        const fetchedData = "This is Redux cached data!";
        dispatch({ type: "SET_DATA", payload: fetchedData });
      }, 1000);
    }
  }, [data, dispatch]);

  return (
    <div>
      <h1>页面数据缓存示例</h1>
      <p>{data || "Loading..."}</p>
    </div>
  );
}

export default MyPage;

优点

复制代码
数据在组件间共享。
适合复杂的状态管理场景。

缺点

复制代码
增加了项目复杂度。
配置 Redux 需要额外的学习成本。

5. 使用 React Query 进行缓存

复制代码
React Query 是一种流行的异步数据管理库,可以轻松实现数据缓存和自动刷新。

示例代码

安装 react-query:

bash 复制代码
npm install @tanstack/react-query

使用 useQuery 缓存数据:

java 复制代码
import React from "react";
import { useQuery } from "@tanstack/react-query";

function fetchPageData() {
  return new Promise((resolve) =>
    setTimeout(() => resolve("This is React Query cached data!"), 1000)
  );
}

function MyPage() {
  const { data, isLoading } = useQuery(["pageData"], fetchPageData);

  return (
    <div>
      <h1>页面数据缓存示例</h1>
      <p>{isLoading ? "Loading..." : data}</p>
    </div>
  );
}

export default MyPage;

优点

复制代码
自动管理数据缓存和刷新。
支持分页和复杂数据同步。

缺点

复制代码
需要额外安装库。

总结

复制代码
根据需求选择适合的方式来缓存页面数据。
相关推荐
默_笙21 分钟前
🧀 让大模型的答案"流"出来:NestJS AI 模块 + SSE + RxJS 实战
javascript·人工智能
mbshqqb23 分钟前
TypeScript基础教程之同步生成器
前端·javascript·typescript
尤水就下1 小时前
🔥预热:在线文档的 block 架构是如何实现的(未完待续...)
前端·javascript·架构
song5011 小时前
React Native for OpenHarmony 实战:三方库 react-native-parallax-scroll-view 的鸿蒙化适配指南
分布式·react native·react.js·transformer·harmonyos
全栈项目管理程序猿2 小时前
ArcGIS JS 基础教程(29):CSVLayer 表格点位图层
前端·javascript
骑着蜗牛撵大象3272 小时前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
溪语流沙2 小时前
【Web全栈进阶】前端世界观:现代工具链与框架为什么存在
前端·javascript·vue.js
kyriewen2 小时前
我逐个测了 JSON.stringify 的 7 个坑:第 1 个就在丢数据
前端·javascript·程序员
一个有温度的技术博主3 小时前
两级缓存一致性实战:Redis + 本地缓存,如何不让数据“分裂”?
redis·spring·缓存
song5013 小时前
React Native for OpenHarmony 实战:三方库 react-native-ratings 的鸿蒙化适配指南
javascript·react native·react.js·分类·harmonyos