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

React setState不重新呈现

长孙鸿
2023-03-14
import React from 'react';

class Button extends React.Component {
  constructor(props){
      super(props)
      this.state = {
          id : props.id
      }
  }
  render() {
      console.log('Button state id is', this.state.id)
      return(
          <div>
              'hi ' +  {this.state.id}
              <br/>
              <button type='submit' onClick={this.props.handleSubmit}>
                  submit
              </button>
          </div>
      )
  }
}

export default class App extends React.Component {
  constructor(props) {
      super(props)
      this.state = {
          id: 1
      }
      this.changeId = this.changeId.bind(this)
  }
  changeId() {
      let id = this.state.id
      console.log('parent state id is', id)
      this.setState({
          id: ++id
      })
  }
  render() {
      return(
          <Button id={this.state.id} handleSubmit={this.changeId}/>
      )
  }
}

共有1个答案

华煜祺
2023-03-14

要在子组件中重新呈现数字,您需要对代码进行以下更改:

在当前场景中,changeId函数中的id值是event,所以不能做++id。您必须将其更新为:

changeId() {
    this.setState({
        id: ++this.state.id
    })
}

对于子组件重新呈现道具值,您必须监听道具是否有任何变化。为此,使用componentDidUpdate React的生命周期。像这样:

componentDidUpdate(prevProps){
   if (this.props.id !== prevProps.id) {
    this.setState({id: this.props.id});
  }
}
class Button extends React.Component {

  render() {
      return(
          <div>
              'hi ' +  {this.props.id}
              <br/>
              <button type='submit' onClick={this.props.handleSubmit}>
                  submit
              </button>
          </div>
      )
    }
}

class App extends React.Component {
  constructor(props) {
      super(props)
      this.state = {
          id: 1
      }
      this.changeId = this.changeId.bind(this)
  }
  changeId() {
      this.setState({
          id: ++this.state.id
      })
  }
  render() {
      return(
          <Button id={this.state.id} handleSubmit={this.changeId}/>
      )
    }
}

ReactDOM.render(<App />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />
 类似资料:
  • 我不知道为什么这不起作用 单击该按钮显然会更改道具,但旧的仍在输入中!那么什么给了?我做错了什么?这是虫子吗?有变通办法吗?

  • 基本上,我有一个非常简单的react组件。它所做的是,环绕“反应-对讲机”,只有当状态发生变化时才会呈现它。为了简化这个问题,我硬连接了方法以始终返回false。 发生的是它总是重新发送,这不应该发生。 有人知道为什么会这样吗?

  • 我的目标是有两个不同的FullCalendar元素保持同步。我不做任何网络调用,在这一点上只是客户端数组。 当我添加一个事件时(比如通过点击或者在它构建之后),日历实际上不会像文档所说的那样重新呈现。 我还尝试使用“renderEvents”和“renderEvent”风格,但这似乎没有必要,因为“updateEvents”将/应该更新这些事件的呈现。我还遇到了一个问题,日历列表版本上的“rend

  • 我猜这可能与从父级打开有关,但我有其他组件,它们内部的状态发生变化,所以我有点困惑,为什么这个组件不尊重它的新状态。 谢谢

  • 问题内容: 我正在使用react-router寻找一种更新页面URL /哈希的方法,而无需路由器重新渲染整个页面。 我正在开发一个全页轮播,并且希望每个幻灯片都有其自己的URL(允许用户刷新页面并返回正确的幻灯片)。转盘稍后将进行类似于此演示的滑动,这意味着 下 一张幻灯片已预渲染。 我的旋转木马的精简版在这里提供。 当前的幻灯片更改如下所示: 这可以正常工作,没有URL更新。我真正想要的是: 这

  • 我是新来的反应。作为一个学习练习,我正在构建一个国际象棋应用程序 我想根据父级中的状态更改子级的DOM。当前,在父级组件的状态变化时,子级组件没有变化。 PS:请忽略任何语法错误。这段代码是实际代码的精简。如果你想看完整的代码,请看这里