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

超出最大更新深度。这可能发生在当一个组件调用setState在use效应,但use效应要么没有一个依赖数组

尉迟俊能
2023-03-14

我正在尝试将基于类的组件转换为功能组件。如果在useEffect钩子中使用与componentDidMount下相同的代码,则会出现上述错误。

// Class based component

    class Container extends Component {
      state = {
        elements: [],
        counter: 1,
        bgColor: "#ffffff",
        botTextColor: "#000000",
        botBGColor: "#aaaaaa",
        userTextColor: "#000000",
        userBgColor: "#aaaaaa",
      };
      
      componentDidMount = async () => {
        this.setState({
          bgColor: this.props.chat.currentChat.bgColor,
          botTextColor: this.props.chat.currentChat.botTextColor,
          botBGColor: this.props.chat.currentChat.botBGColor,
          userTextColor: this.props.chat.currentChat.userTextColor,
          userBgColor: this.props.chat.currentChat.userBgColor,
        });
        
        
        this.setState({
          elements:
            this.props.chat.currentChat.elements &&
            this.props.chat.currentChat.elements.length > 0
              ? elements
              : [
                  {
                    id: "0",
                    data: {
                      label: (
                        <WelcomeNode
                          id={"0"}
                          images={this.props.chat.media.map((e) => e.file)}
                          updateChoices={(choices) =>
                            this.updateChoices("0", choices)
                          }
                          updateMessage={(message) =>
                            this.updateMessage("0", message)
                          }
                          updateImage={(e) => this.updateImage(e, "0")}
                          addEdge={this.addEdgeCustom}
                          deleteEdgeChoice={(index) =>
                            this.deleteEdgeChoice("0", index)
                          }
                          isChoiceConnected={(index) =>
                            this.isChoiceConnected("0", index)
                          }
                        ></WelcomeNode>
                      ),
                      message: "",
                      choices: [],
                      type: "welcome",
                      id: "0",
                    },
                    className: "node-elements",
                    position: { x: 100, y: 100 },
                  },
                ],
          counter: elements.length > 0 ? elements.length : 1,
        });
        
       }
      
     }

以下是发生错误的功能组件

// Functional component

const initialState = {.....}

const Container = () => {
  const [state, setState] = useState(initialState);
  const { auth, chat } = useSelector((state) => ({ ...state }));
  const dispatch = useDispatch();
  const history = useHistory();

  useEffect(() => {
    setState({
      ...state,
      bgColor: chat.currentChat.bgColor,
      botTextColor: chat.currentChat.botTextColor,
      botBGColor: chat.currentChat.botBGColor,
      userTextColor: chat.currentChat.userTextColor,
      userBgColor: chat.currentChat.userBgColor,
    });

    setState({
        ...state,
        elements:
          chat.currentChat.elements && chat.currentChat.elements.length > 0
            ? elements
            : [
                {
                  id: "0",
                  data: {
                    label: (
                      <WelcomeNode
                        id={"0"}
                        images={chat.media.map((e) => e.file)}
                        updateChoices={(choices) => updateChoices("0", choices)}
                        updateMessage={(message) => updateMessage("0", message)}
                        updateImage={(e) => updateImage(e, "0")}
                        addEdge={(e) => addEdgeCustom(e)}
                        deleteEdgeChoice={(index) =>
                          deleteEdgeChoice("0", index)
                        }
                        isChoiceConnected={(index) =>
                          isChoiceConnected("0", index)
                        }
                      ></WelcomeNode>
                    ),
                    message: "",
                    choices: [],
                    type: "welcome",
                    id: "0",
                  },
                  className: "node-elements",
                  position: { x: 100, y: 100 },
                },
              ],
        counter: elements.length > 0 ? elements.length : 1,
      });

   
  }, []);

}
  

抛出以下错误,浏览器崩溃未捕获(promise)错误:重新渲染过多。React限制渲染的数量以防止无限循环。

共有2个答案

卓嘉良
2023-03-14

useEffect通常需要依赖项数组。您在useEffect钩子中使用的内容应该包含在该数组中,例如,我们有一个设置id的函数。useEffect依赖项需要数组中的id。因此,只有在id更改时才更新/运行此useEffect挂钩。

useEffect(() => {
   setId(id)
}, [id])

如果只希望在第一次渲染时运行一次useEffect,可以将阵列保留为空,如下所示:

useEffect(()=>{
  //http fetch request or something
}, [])
蒋华美
2023-03-14

很抱歉,您的代码太复杂,无法阅读。请重新组织代码,使其更易于阅读和理解。请尝试将充电useSelector线路连接到此线路:

 const { auth, chat } = useSelector((state) => state);

这会导致多重渲染,因为useSelectordetect状态正在重新创建(使用扩展运算符),因此它将重新渲染组件

另外,在useffect中,当您设置状态usesetState回调时,这不会覆盖您以前的状态更新:

setState(prev=>({...prev,newState}))
 类似资料:
  • 我正在做这个康威的生活游戏react项目,它工作得很好,但当我添加最后几个按钮来清除棋盘和其他一些功能时,react给了我这个错误 从代码片段来看,它向我展示了Clear()函数似乎是这里的问题所在,但我认为我没有在渲染()中设置状态来触发无限循环。这里是Clear和

  • 已经有一些人问了这个问题,但是他们几乎都是由相同的原因引起的(例如< code > 附言:一些实用程序函数是在幕后定义的。 错误出在中。我找不到我无限地重新渲染的地方。

  • 有很多类似的问题,尽管我在这里发布。 我收到以下错误: 未捕获的不变量冲突:超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 请注意,我还没有在page中使用过这样的功能。 选择时出错: 已编辑:我刚刚从setState中移除了矩函数。现在它工作正常

  • 我只想渲染一次拖动,但渲染的是无限循环。我在这个项目中使用反应Dnd方法 显示此警告:超过最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 < code>storeData代码:

  • 我正在用React做我的前几个实验,在这个组件中,我调用了一个外部API来获取所有NBA玩家的列表,通过作为组件道具接收的teamId过滤它们,最后呈现过滤玩家的标记。 一个需要考虑的问题是,由于我调用了API并获得了一个大列表,所以我将它保持在组件的状态,以便对该组件的新调用将使用该状态,而不是再次调用API。这不是生产代码,我没有API,所以我这样做是因为我收到了“太多请求”消息,因为我一直在

  • 当我运行我的代码时,我收到了这个错误。 超过了最大更新深度。当组件重复调用组件WillUpdate或组件DidUpdate中的setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环。 这是代码。它在引用。 我按照React网站上的文章所说的方式设置了我的东西,它“来了”于这个简洁的控制台类型,这就是我产生上述代码的地方。我对React、JSX和Javascript(以及