我试图在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.如果我们想在调用中传递参数,那么我们需要像下面这样调用方法 因为我们使用的是箭头函数,所以不需要在构造函数中绑定方法。

onClick={() => this.save(id)} 

当我们像这样在构造函数中绑定方法时

this.save= this.save.bind(this);

然后,我们需要调用该方法而不传递任何参数,如下所示

onClick={this.save}

我们尝试在调用函数时传递参数 如下所示,然后误差就像最大深度超出。

 onClick={this.save(id)}

其他回答

先忘掉react: 这与react无关,让我们了解Java Script的基本概念。例如,您已经在java脚本中编写了以下函数(名称为A)。

function a() {

};

问题1)如何调用我们已经定义的函数? 答:一个();

问题2)如何传递函数的引用,以便稍后调用它? 答:让乐趣= a;

现在回到你的问题,你已经使用了函数名的paranthesis,这意味着当下面的语句将被渲染时,函数将被调用。

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

那么如何改正呢? 简单! !只要去掉括号。通过这种方式,您已经将该函数的引用提供给onClick事件。它只在单击组件时才会回调函数。

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

一个与反应相关的建议: 避免使用有人在回答中建议的内联函数,这可能会导致性能问题。 避免下面的代码,它将在函数被调用时一次又一次地创建同一个函数的实例(lamda语句每次都会创建新实例)。 注意:并且不需要显式地将事件(e)传递给函数。你可以在函数中访问它而不传递它。

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

https://cdb.reacttraining.com/react-inline-functions-and-performance-bdff784f5578

在我的例子中,这是由于无限循环。

我的一个函数是设置状态,组件正在重新加载,该组件依次导致函数重新运行,然后函数再次设置状态。这个循环一直到无穷。

为了避免这种情况,我把我的函数包装在useEffect钩子中,并给它一些依赖,这样这个函数只在依赖被改变时运行。

这是因为你在渲染方法中调用toggle,这将导致重新渲染,toggle将再次调用,再次重新渲染,等等。

代码中的这一行:

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

你需要使onClick指向这个。切换而不是调用它。

要解决这个问题,请这样做:

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

onClick你应该调用函数,这叫做你的函数切换。

onClick={() => this.toggle()}

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

inputDigit(digit){
  this.setState({
    displayValue: String(digit)
  })

<button type="button"onClick={this.inputDigit(0)}>

为什么呢?

<button type="button"onClick={() => this.inputDigit(1)}>1</button>

onDigit函数设置状态,这将导致再现 导致onDigit触发,因为那是你设置的值 onClick使状态被设置,从而引起渲染, 这会导致onDigit触发,因为那是你的值。等等