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

setState()不会触发重新渲染

丌官利
2023-03-14

尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题:

// Grid.js, render a grid of random-colored boxes

constructor(props){
        super(props); 
         this.initialcolors = this.initialcolors.bind(this); 
         this.updatecolors = this.updatecolors.bind(this);  
         this.state = {colors: this.initialcolors()}
    }

// ...

    updatecolors(index){
    let currentColors = [...this.state.colors];
    let currentColor = currentColors[index];
    let newColors = this.props.colors.filter(c => c !== currentColor)
    let newColor = newColors[Math.floor(Math.random() * newColors.length)];
    currentColors[index]=newColor; 
    this.setState(st => ({colors: currentColors}))
}

render(){
     return(<div>
           {this.state.colors.map( (color, index) => 
              <Box key={index} position={index} color={color} updatefunc={this.updatecolors} className="Box.css"/>
           )}
            </div>)
}

// Box.js, the colored box, onClick triggers state-change by calling updatefunc from parent

constructor(props){
    super(props);
    this.state = {color: this.props.color}; 
    this.changeColor = this.changeColor.bind(this); 
}

changeColor(evt){
    this.props.updatefunc(this.props.position); 
}

render(){
    return(
    <div style={{backgroundColor: this.state.color, 
                 height: 100, 
                 width: 100, 
                 padding: 0.5}} 
         onClick={this.changeColor}> </div>
    )
}

}

从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。

试图避免常见的错误:

  • 颜色数组只有在通过扩展运算符从状态复制后才被修改
  • 通过setState()传递新数组
  • 此外,我还处理了两个组件中函数的实例绑定

但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的另一个方面是什么?

非常感谢!

共有1个答案

曾景龙
2023-03-14

Box.js使用this.state.color作为背景颜色,它永远不会改变,因为每个框只调用一次构造函数。您可能想要使用this.props.color,其颜色已从Grid更改。

class Box extends Component {
  constructor () {
    super();
    this.changeColor = this.changeColor.bind(this); 
  }

  changeColor (evt) {
    this.props.updatefunc(this.props.position); 
  }

  render () {
    return (
      <div
        style={{
          backgroundColor: this.props.color, 
          height: 100, 
          width: 100, 
          padding: 0.5
        }} 
        onClick={this.changeColor}
      />
    )
  }
}
 类似资料:
  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 我已经初始化了一个数组状态,当我更新它时,我的组件不会重新渲染。以下是一个最低限度的概念证明: 根据这段代码,似乎输入应该包含要开始的数字0,并且无论何时更改,状态也应该更改。在输入中输入“02”后,应用程序组件不会重新渲染。但是,如果我在5秒后执行的onChange函数中添加setTimeout,则表明数字确实已更新。 对为什么组件不更新有什么想法吗? 这是一个带有概念证明的代码沙盒。

  • 我试图在if语句中设置状态,但它不会这样做。结果,我需要从if语句中更新状态,在那个里我可以接收经度和纬度坐标,但它不会保存状态。若我在If语句之外的控制台中回显,我将只读取第一个setState值表单componentWillMount。有什么问题吗?我做错了什么?结构如下:

  • 问题内容: Parent(在我的示例中)组件通过Child()组件呈现一个数组。父级决定更改数组中的属性,React触发子级重新渲染的方式是什么? 调整数据后,我想出的只是在Parent中。这是触发更新的hack还是React方法? JS小提琴:https: //jsfiddle.net/69z2wepo/7601/ 问题答案: 这里的问题是您要在中存储状态,而不是。由于此组件是mutating

  • 问题内容: 我一直在尝试了解新的React Context API并正在使用它。我只是想检查一个简单的案例-更新提供者的数据时,所有这些都会重新呈现。 在Codesandbox上 查看 这个小例子 因此,在我的示例中,我有一个组件-其状态如下所示- 我创建了一个新的从这里包含语境做出反应,并从国家和值传递给两位消费者和。 所以我的假设是,如果随机数更新,它将更改上下文,并且两个组件都应触发重新渲染

  • 问题内容: 我记得当我发现它是异步的时,我感到非常惊讶。现在,我偶然发现了一种“怪异”的行为,这种行为不符合我对异步性的理解。 考虑下面的代码片段(由于某种原因导致,这是外部沙箱:https : //codesandbox.io/s/zwrvkz74y3): 如果运行此程序并检查控制台,您将看到该调用被两次调用,但是不应该仅一次累积和更新Component吗? 更新 :我认为我的困惑来自React