路由状态持久化:v6实现方案

Kevin345 +0/-0 0 0 正常 2025-12-24T07:01:19 React-Router

在React Router v6中实现路由状态持久化是升级过程中的重要议题。本文将介绍如何通过自定义Hook和useEffect来实现路由状态的持久化。

核心思路

在v6中,路由状态不再像v5那样自动保持,需要手动实现状态管理。我们可以通过localStorage或sessionStorage来存储路由参数和组件状态。

实现方案

import { useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';

const usePersistentState = (key, initialValue) => {
  const [state, setState] = useState(() => {
    try {
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      return initialValue;
    }
  });

  useEffect(() => {
    window.localStorage.setItem(key, JSON.stringify(state));
  }, [key, state]);

  return [state, setState];
};

const PersistentRoute = () => {
  const location = useLocation();
  const navigate = useNavigate();
  const [routeState, setRouteState] = usePersistentState('routeState', {});

  useEffect(() => {
    // 当路由变化时,保存当前状态
    setRouteState(prev => ({
      ...prev,
      [location.pathname]: { timestamp: Date.now() }
    }));
  }, [location.pathname]);

  return <div>持久化路由组件</div>;
};

使用步骤

  1. 创建usePersistentState自定义Hook
  2. 在需要的组件中使用该Hook
  3. 在路由变化时自动保存状态
  4. 应用重启时自动恢复状态
推广
广告位招租

讨论

0/2000
Yara565
Yara565 · 2026-01-08T10:24:58
别被v6的路由状态丢失给坑了,localStorage存状态看似简单,但实际坑很多。我见过不少人直接用location.state存,结果页面刷新就没了,还得手动处理key值冲突,建议封装成独立hook时一定要加版本控制和清理机制,否则下次升级可能直接炸库。
SilentFlower
SilentFlower · 2026-01-08T10:24:58
这个实现方案听着挺美,但别忘了浏览器存储的局限性。localStorage有5MB限制,如果路由状态太多,页面一多就容易爆掉。我建议加上状态压缩逻辑,比如只保存关键字段,或者按时间窗口清理旧数据,不然用户访问几次就得清缓存了