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

React setState在调用时两次呈现组件

石俊雄
2023-03-14

我试图建立一个连接4的游戏,它有一个由7列组件组成的板组件,所有包含6个空间组件。每个列的上方都有一个拖放按钮,该按钮将用于将该件拖放到列中。为了在“红色”和“黑色”玩家之间交替,我创建了一个状态“redorblue”,它返回一个布尔值。

简而言之,当单击Drop按钮时,我希望切换“redorblue”的值,以跟踪轮到谁了。我已经将onClick函数设置为setState({redorblue:!this.state.redorblue)},但是,调用此函数将导致react在单击按钮的列的正下方呈现一个额外的列。我知道setState会自动重新呈现DOM,但如何避免它呈现组件的副本呢?谢谢你的帮助!

class Column extends Component{
  constructor(){
    super();
    this.state = {
      myArray: [],
      buttonArray: [],
      buttonNumber: null,
      newArray: [],
      redOrBlue: true
    }
  }
  makeRow(){
    var component = <Space className="space"/>
    for(var i = 0; i < 6; i++){
      this.state.myArray.push(component);
    }
  }

  handleClick(){
    var num = this.props.colNumber;
    var array = this.props.boardArray[num];
    var boolean = false;
    var color;
    if(this.state.redOrBlue === true){
      color = "red"
    }else{
      color = "black"
    }
    for(var i = 5; i > -1; i--){
      if(boolean === false){
        if(array[i] === null){
          array[i] = color;
          boolean = true;
        }
      }
    }
    this.setState({redOrBlue: !this.state.redOrBlue})
    console.log(array)
  }

  render(){
    {this.makeRow()}
    return(
      <div className="column">
        <DropButton onClick={() => this.handleClick()} id={'button-' + this.props.colNumber} buttonNumber={this.props.colNumber} className={this.props.className}/>
        {this.state.myArray.map(function(component, key){
          return component
        })}
      </div>
    )
  }
}

共有1个答案

东明德
2023-03-14

您需要在代码中更改许多内容:

*首先,永远不要将UI项存储在状态变量中,state变量应该只包含数据和值。

*永远不要通过this.state.a=''或this.state.a.push({})state变量进行任何更改,始终将state值视为不可变,并且只使用setstate更改该值。

*如果您想要动态地创建,请始终调用render内的函数,该函数将直接创建UI部分

从render调用Makerow方法,它将直接返回ui,而不将其存储在状态变量中,如下所示:

makeRow(){
    var component = [];
    for(var i = 0; i < 6; i++){
      component.push(<Space key={i} className="space"/>);
    }
    return component;
 }

render(){
    return(
        <div className="column">
            <DropButton onClick={() => this.handleClick()} id={'button-' + this.props.colNumber}
                buttonNumber={this.props.colNumber} className={this.props.className}/>
            {this.makerow()}
        </div>
    )
}
 类似资料:
  • 我正在构建一个PhotoViewer,当用户按左键或右键时,它可以更改照片。我正在使用React、Redux、React router和React router Redux。当用户按下左键或右键时,我会做两件事,使用并发送一个操作来更新当前查看的照片,。我订阅状态更改以进行调试。 上面的每一行都会触发一个新的状态更改。因为我更新了,所以发送操作会更新存储,而更新url会更新存储,因为react r

  • 问题内容: 我这里有一些简单的代码 每次单击按钮,控制台上都会显示2条日志,指示该组件呈现两次。 这是一个codeandbox链接,可以尝试一下。 问题答案: 呈现您的App组件的原因是在其中导致代码在严格模式下运行,并且在严格模式下,控制台显示两次,因为每个功能在开发模式下均运行两次 根据react docs: 严格模式无法自动为您检测副作用,但可以通过使其更具确定性来帮助您发现它们。这是通过有

  • 我在一个表单上有一个TextField输入,问题是当我在它上键入时,刚刚键入的值的显示/呈现有一种延迟,我想防止这种延迟。 代码:

  • 我在useEffect钩子中调用一个GetAPI,以在组件装载之前获取数据,但是它多次调用API,并且我得到一个错误“多次API调用”。 输出: 请让我知道这是在组件使用useEffect钩子呈现之前从API获取数据的最佳方法。

  • 我使用c#在Visual Studio中创建了一个WebApi服务器。客户端应用程序通过以下方式调用服务: 第一次就可以了。如果我再次尝试从客户端使用此服务,它将始终失败,并出现ServerProtocolViolation异常。 如果我再试一次,它再次正常工作。然后在第二次尝试时发生相同的错误。此外,当我尝试调用不同的方法时,第二个总是会崩溃。 这是例外: null 任何人想要一个主意都是我的错

  • 当我们点击“添加”链接时,我试图呈现需要组件。下面是主要组件的代码: 下面是以防万一的需求组件: 我在第一次单击add链接时实现了我试图实现的目标,即在第一次单击add链接时,need组件没有任何条件地被呈现,当我单击“add”时,need组件再次被呈现,但当我第二次单击“add”链接时,我没有看到任何变化。为什么会这样,我希望在每次单击“Add”链接时呈现Need组件。