You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router切换页面时如何保持Context API的计数器状态?

解决方案

你当前使用的localStorage属于持久化本地存储,只要用户不主动清理缓存数据就会一直保留,不符合你关闭浏览器自动重置状态的需求,替换为会话级存储sessionStorage即可:

  • sessionStorage的生命周期和浏览器会话绑定,关闭浏览器或者当前站点的所有标签页后,存储的数据会自动清空
  • 同一站点下的客户端路由切换(你使用的React Router跳转属于这类场景)时,sessionStorage的数据会全局共享,完全满足页面切换保留计数器值的需求

另外你现有代码存在边缘场景缺陷:如果存储中没有对应值,JSON.parse会返回null导致计数器初始值异常,需要添加默认值回退逻辑,还可以优化计数器更新逻辑为函数式写法避免闭包问题,修改后的完整代码如下:

export const CounterContext = React.createContext()

function App() {
  const [Counter, setCounter] = useState(0)
  useEffect(() => {
    // 替换为sessionStorage,无存储值时默认回退到0
    const savedCount = window.sessionStorage.getItem('count')
    setCounter(savedCount ? JSON.parse(savedCount) : 0);
  }, []);

  useEffect(() => {
    window.sessionStorage.setItem('count', JSON.stringify(Counter));
  }, [Counter]);
  
  function ChangeCounter() {
    // 函数式更新避免闭包陷阱
    setCounter(prev => prev + 1);
  }
  console.log(Counter);

  return (
    <CounterContext.Provider value={{Counter, ChangeCounter}}>
    <Router>
    <div className="App">
      <header className="App-header">
        <Navbar />
      </header>
      <div className="Content">
        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/Products">
            <Products />
          </Route>
          <Route path="/Contact">
            <Contact />
          </Route>        
        </Switch>
      </div>
      
      <footer>
        <Footer />
      </footer>
    </div>
    </Router>
    </CounterContext.Provider>
  );
}

内容的提问来源于stack exchange,提问作者EmFor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:06:00