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

反应js:Uncaught RangeError:超出最大调用堆栈大小

丌官绍元
2023-03-14

React.js用props给后代组件发值错了?

const Child = props => <div onClick={ e => console.log(props.value) }>Click to see value.</div>
const Father = props => <div>{ React.cloneElement(props.children, props) }</div>
const GrandFather = props => <div>{ React.cloneElement(props.children, props) }</div>

ReactDOM.render(
  <GrandFather value="This is Test">
    <Father>
      <Child />
    </Father>
  </GrandFather>,
  document.getElementById('root')
)

我编写了前面的演示来测试使用props向后代组件发送信息。但它导致了错误:

未捕获的范围错误:对象超过了最大调用堆栈大小。克隆元素

但是我在演示运行良好后才写,所以你能告诉我是什么原因导致错误吗?

const Child = props => <div onClick={ e => console.log(props.value) }>Click to see value.</div>
const Father = props => <div>{ React.cloneElement(props.children, props) }</div>

ReactDOM.render(
  <Father value="This is Test">
    <Child />
  </Father>,
  document.getElementById('root')
)

共有2个答案

董建茗
2023-03-14

经过一些测试,我解决了这个问题。

首先,我在< code >父亲组件中定位问题。

其次,错误的信息超过了最大调用堆栈大小总是由无限创建而没有回收造成的。

因此,我发现我发送给< code >父亲的道具具有值< code >孩子本身就是< code >父亲。

< code >祖父有道具:

{
  value: "This is Test",
  children: Father React Element
}

当我使用React时。cloneElement(child,props)props。children=父反应元素也发送到父组件。

在我检查了 React API 之后,.clone 元素的第三个参数是克隆元素的元素。

毕竟,我的解决方案是:

const Father = props => <div>{ React.Children.map(props.children, child => React.cloneElement(child, props, child.props.children)) }</div>

整个演示是在:

const CloneProps2Children = props => <div>{ React.Children.map(props.children, child => React.cloneElement(child, props, child.props.children)) }</div>
const Child = props => <div onClick={ e => console.log(props.value) }>Click to see value.</div>

export default (
  <CloneProps2Children value="This is test for many middles">
    <CloneProps2Children>
      <CloneProps2Children>
        <Child></Child>
      </CloneProps2Children>
    </CloneProps2Children>
  </CloneProps2Children>
)
杜晨朗
2023-03-14

您必须只克隆一个元素。React.Children是一个数组

https://facebook.github.io/react/docs/react-api.html#cloneelement

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

  • 问题内容: 我有一台服务器,可能导致以下输出死亡: 但是,如果没有堆栈转储或跟踪,就无法确定这是无限递归还是只是链太大而已,更不用说问题函数在哪里了。 使用该选项运行Node 不仅使我的测试运行缓慢(正如人们期望的那样),而且没有重现该问题。 有人有任何解决方案或提示来深入了解此问题吗? 问题答案: 看来目前的答案是:站稳脚步,等待Node.js更新到新的V8版本,或者使用此Chromium项目错

  • 问题内容: 当我运行我的代码时,Node.js引发由过多的递归调用引起的异常。我试图将Node.js堆栈大小增加,但是Node.js崩溃而没有任何错误消息。当我不使用sudo再次运行此命令时,Node.js将输出。是否有可能在不删除递归调用的情况下解决此问题? 问题答案: 您应该将递归函数调用包装到 , 要么 函数使node.js有机会清除堆栈。如果您不这样做,并且有很多循环没有任何 真正的 异步

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

  • 如果用户未登录,我尝试将用户重定向到“TrapPage”。 这是我的代码: 当我将函数requireAuth放在onEnter上时,控制台给我一个错误: 我是一个反应迟钝的人,请耐心点:) 我的代码有什么问题?

  • 在我的插座里。io应用程序,我正在尝试将房间中的一组用户发送到客户端,以便创建一个显示房间中所有用户的元素。文档中说,您可以使用以下代码返回给定命名空间和文件室中的所有套接字实例: 但是,它涉及到,这是我不太熟悉的。我只是把代码块放在一个函数中,我不确定这是最好的方法。 当我尝试运行此操作时,控制台中出现以下错误: 我试着对此做了一些研究,发现了这个答案,建议将代码包装在块中。我已经做到了: 但是