ReactJS: 超出最大更新深度错误

2022-08-30 00:23:17

我试图在ReactJS中切换组件的状态,但我得到一个错误,指出:

已超出最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。React 限制嵌套更新的数量以防止无限循环。

我在代码中看不到无限循环,任何人都可以帮忙吗?

ReactJS 组件代码:

import React, { Component } from 'react';
import styled from 'styled-components';

class Item extends React.Component {
    constructor(props) {
        super(props);     
        this.toggle= this.toggle.bind(this);
        this.state = {
            details: false
        } 
    }  
    toggle(){
        const currentState = this.state.details;
        this.setState({ details: !currentState }); 
    }

    render() {
        return (
            <tr className="Item"> 
                <td>{this.props.config.server}</td>      
                <td>{this.props.config.verbose}</td> 
                <td>{this.props.config.type}</td>
                <td className={this.state.details ? "visible" : "hidden"}>PLACEHOLDER MORE INFO</td>
                {<td><span onClick={this.toggle()}>Details</span></td>}
            </tr>
    )}
}

export default Item;

答案 1

因为你在渲染方法内部调用了切换,这将导致重新渲染,而切换将再次调用并重新渲染,依此类推

代码中的这一行

{<td><span onClick={this.toggle()}>Details</span></td>}

你需要参考不叫它onClickthis.toggle

解决此问题,请执行以下操作

{<td><span onClick={this.toggle}>Details</span></td>}

答案 2

调用函数时应传递事件对象:

{<td><span onClick={(e) => this.toggle(e)}>Details</span></td>}

如果您不需要处理 onClick 事件,您也可以键入:

{<td><span onClick={(e) => this.toggle()}>Details</span></td>}

现在,您还可以在函数中添加参数。