求教:最大更新深度超过的原因

Posted

技术标签:

【中文标题】求教:最大更新深度超过的原因【英文标题】:Seeking advice: Reason for maximum update depth exceed 【发布时间】:2020-06-07 21:35:29 【问题描述】:

我是 React 和 GraphQL 的新手。尝试使用 GraphQL 订阅源更新 React 状态,但会产生更新深度错误。

这里是简化的代码:

import  Subscription  from 'react-apollo';
...

function Comp() 
  const [test, setTest] = useState([]);

  const Sub = function() 
    return (
      <Subscription subscription=someStatement>
        
          result => setTest(...test, result.data);
          return null;
        
      </Subscription> 
    );
  ;

  const Draw = function() 
    return ( 
      <div>  test.map(x => <p>x</p>)  </div> 
    );
  ;

  return (
    <div>
      <Sub />
      <Draw />
    <div/>
  );
;
export default Comp;

常规查询在应用程序中运行良好,并且订阅标签返回可用的结果,所以我认为问题出在 React 方面。

我假设显示的代码包含错误源,因为注释掉函数“Sub”会停止深度错误。

【问题讨论】:

【参考方案1】:

你看这部分渲染时会发生什么

    <Subscription subscription=someStatement>
        
          result => setTest(...test, result.data);
          return null;
        
      </Subscription> 

setTest() 被调用并设置了导致重新渲染的状态,重新渲染导致上面的块到re-rendersetTest() 被再次调用并且循环继续。

尝试在您的useEffect() Hook 中获取和setTest(),这样它就不会卡在重新渲染循环中。

useEffect like

  useEffect(() => 
           //idk where result obj are you getting from but it is supposed to be 
           //like this
      setTest(...test, result.data);
  , [test] )

组件喜欢

 <Subscription subscription=someStatement />

【讨论】:

试一试 (codepen.io/danninemx/pen/jOPyYMX?editors=0010) 但似乎我没有正确使用 useEffect。你能详细说明一下吗? 告诉我你从哪里得到result ,我会为你制作一个代码sn-p。

以上是关于求教:最大更新深度超过的原因的主要内容,如果未能解决你的问题,请参考以下文章

ReactJs 超过最大更新深度

超过最大更新深度 - React Js

我从 React 得到一个错误:超过最大更新深度

阿波罗钩子超过了最大更新深度

React Navigations 5:超过最大更新深度

React-Native = Invariant Violation:超过最大更新深度