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

React使用自定义useStore钩子出现RangeError栈溢出问题求助

解决自定义useStore钩子出现的"RangeError: Maximum call stack size exceeded"错误

核心问题:无限递归渲染

你的StoreContextProvider组件内部犯了一个低级错误——你在组件的返回值里调用了组件自身,而不是StoreContext对应的Provider组件。这会导致每次组件渲染时,都会递归创建新的StoreContextProvider实例,最终触发栈溢出错误。

错误代码片段:

export const StoreContextProvider = ({ children }) => (
  // 这里误用了组件自身,导致无限递归
  <StoreContextProvider value={useStore()}>{children}</StoreContextProvider>
);

修复方案

把组件内部的StoreContextProvider替换为StoreContext.Provider(createContext返回的对象自带Provider属性):

import { useState, createContext, useContext } from "react";

//custom hook , useStore
const useStore = () => {
  const [user, setUser] = useState("");
  const [cartCount, setCartCount] = useState(0);

  return {
    user,
    cartCount,
    login: () => setUser("Jack"),
    logout: () => setUser(""),
    // 额外优化:用函数式更新避免闭包陷阱
    addToCart: () => setCartCount(prevCount => prevCount + 1),
  };
};

const StoreContext = createContext(null);

// 修复递归问题:使用StoreContext.Provider
export const StoreContextProvider = ({ children }) => (
  <StoreContext.Provider value={useStore()}>{children}</StoreContext.Provider>
);

export const useLogin = () => useContext(StoreContext).login;
export const useLogout = () => useContext(StoreContext).logout;
export const useAddToCart = () => useContext(StoreContext).addToCart;
export const useUser = () => useContext(StoreContext).user;
export const useCartCount = () => useContext(StoreContext).cartCount;

额外优化说明

上面的代码还优化了addToCart方法:原本的setCartCount(cartCount + 1)依赖闭包中的cartCount值,当连续调用addToCart时,可能会因为闭包捕获的是旧值导致状态更新不生效。改用函数式更新setCartCount(prevCount => prevCount + 1),可以确保每次都基于最新的状态值进行更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:32:16