【问题标题】:changing state with Styled Components -> React, Uncaught RangeError: Maximum call stack size exceeded使用样式化组件更改状态 - > React, Uncaught RangeError: Maximum call stack size exceeded
【发布时间】:2019-12-25 06:57:11
【问题描述】:

我有一个按钮,当它被点击时显示一个面板,当它被点击时隐藏它

按预期工作的代码

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>
  )
}

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, Uncaught RangeError: Maximum call stack size exceeded 我想说我在这里做一些概念上的错误,但找不到它是什么

编辑: 我可以看到这应该可以工作(见codesandbox) 所以我怀疑是样式化组件以某种方式导致循环?

【问题讨论】:

  • 请分享父代码
  • @Siya 我已经加了,但是加的不多(这只是代码的相关部分)
  • @Siya 我已经看到这应该可以工作(参见代码框),所以我猜问题出在样式组件上?

标签: reactjs react-hooks styled-components react-state-management react-state


【解决方案1】:

您的相同代码在样式化组件上看起来可以正常工作 https://codesandbox.io/s/usestate-01-o791y

【讨论】:

  • 确实有效,我已将其重做为更接近我的代码并且它有效codesandbox.io/s/usestate-01-eo75b 但在我的本地代码中这是错误的原因,所以我现在很困惑
  • @GWorking 也许你可以检查你的样式组件版本
  • 刚刚完成,它仍然有效(在我本地的代码和相同的反应和样式版本中),我在这里使用 gatsby 和许多其他包,似乎找到任何东西都是一场噩梦,不要'真的不知道现在该做什么
  • 不知何故,我看到父组件具有不同的子组件,如果我消除其中的一些,错误就会消失,但它似乎不是特别的,但也有很多,有意义吗?
  • 检查是否有任何子组件在渲染函数中使用状态,这通常会导致此问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多