当前位置: 首页 > 知识库问答 >
问题:

使用样式组件更改状态->React,未捕获的RangeError:超出最大调用堆栈大小

管和志
2023-03-14

我有个按钮,点开就显示面板,点开面板就隐藏

代码,按预期工作

const Loged = () => {
  const [modal, setModal] = useState(0)
  const input_id = React.createRef()
  const input_pass = React.createRef()

  return (
    <MenuLogin modal={modal}>
      <div
        onClick={e => {
          e.stopPropagation()
          setModal(1)
        }}
      >
        Click Me
      </div>

      <div
        onClick={e => {
          e.stopPropagation()
          setModal(0)
        }}
      >
        <div onClick={e => e.stopPropagation()}>
          <input ref={input_id} onClick={e => e.stopPropagation()} placeholder="id" type="text" />
          <input ref={input_pass} onClick={e => e.stopPropagation()} placeholder="password" type="text" />
        </div>
      </div>
    </MenuLogin>
  )
}

其中< code>MenuLogin是一个样式化组件

const MenuLogin = styled.div`
  & > div:last-child {
    visibility: ${props => (props.modal ? 'visible' : 'hidden')};
    opacity: ${props => (props.modal ? '1' : '0')};
  }
`

但是,现在我想在这个组件之外使用setModal,所以我要做的是将const[modal, setModal]=useState(0)移动到父元素并将这些变量作为参数传递

所以现在我有了

const Loged = (modal, setModal) => {
...
}

使用这样的父代码

const ParentComponent = () => {
  const [modal, setModal] = useState(0)
  return (<ChildComponent modal={modal} setModal={setModal} />)
}

但现在,当我试图在同一位置(子组件内)隐藏元素(setModal(0))时,我得到React,Uncaught RangeError:Maximum call stack size exceeded

如果我做类似的事情

const ParentComponent = () => {
  const [modal, setModal] = useState(0)
  const changeState = (s) => setModal(s)
  return (<ChildComponent modal={modal} setModal={changeState} />)
}

在得到错误(??)之前,我可以额外单击两次

阅读 React,未捕获的 RangeError:超过了最大调用堆栈大小,我会说我在这里做了一些概念上错误的事情,但找不到它是什么

编辑:我可以看到这应该是可行的(参见代码沙盒),所以我怀疑是样式化组件以某种方式导致了循环?


共有1个答案

白晋鹏
2023-03-14

相同的代码看起来可以很好地处理样式化组件https://codesandbox.io/s/usestate-01-o791y

 类似资料:
  • 问题内容: 我正在做反应,基本上我想用工具提示制作一个按钮,现在我正在制作工具提示。我正在更改css display属性,以使其在鼠标进入和离开时不可见。但是有一个错误,我不知道该怎么办… 这是我的代码: 在控制台中,我收到此错误: 我找不到问题所在。我知道这可能与调用一个函数有关,后者又调用另一个函数。但是我在代码中看不到这样的东西,而且不确定是否全部。感谢帮助 :) 问题答案: 每当您看到从函

  • 这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返

  • 我在chrome上收到错误“未捕获的范围错误:超出最大调用堆栈大小”。这是我的j查询函数 从这行

  • 我在使用jQuery ajax时遇到了一个问题。我有javascript 这段代码产生错误“UncaughtRangeError:Maximum call stack size exceeded”,我不明白为什么。我没有触发器,我使用了preventDefault和stopPropagation,但我仍然有这个错误。有人能帮我吗?

  • 当我为图表(react-chartjs-2)获取数据时,我收到了这个错误。我实现了try/catch块,但不知道如何删除这个错误。在Edge浏览器上,我得到了CRIPT28:SCRIPT28:堆栈空间不足 这是我在组件中调用的操作。 这是连接到redux存储的组件。它在我看来一切都很好。

  • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此: