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;

优点

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

缺点

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

总结

复制代码
根据需求选择适合的方式来缓存页面数据。
相关推荐
yzhSWJ12 分钟前
Spring Boot中自定义404异常处理问题学习笔记
java·javascript
zru_960236 分钟前
Docker 部署 Redis:快速搭建高效缓存服务
redis·缓存·docker
axinawang1 小时前
springboot整合redis实现缓存
spring boot·redis·缓存
zyk_5202 小时前
前端渲染pdf文件解决方案-pdf.js
前端·javascript·pdf
沉迷...3 小时前
手动实现legend 与 echarts图交互 通过js事件实现图标某项的高亮 显示与隐藏
前端·javascript·echarts
for623 小时前
本地缓存大杀器-Caffeine
缓存·caffeine·本地缓存
皮实的芒果3 小时前
前端实时通信方案对比:WebSocket vs SSE vs setInterval 轮询
前端·javascript·性能优化
il4 小时前
Deepdive into Tanstack Query - 2.0 Query Core 概览
前端·javascript
Shawn5904 小时前
前端时间管理实践:从时间标准化到工程化封装
前端·javascript
H5开发新纪元4 小时前
借助 GitHub Copilot 打造一个完美的 React 消息引用系统:从设计到实现的深度剖析
前端·react.js