reactjs-更改状态不会重新渲染组件

马修斯·阿尔维斯(Matheus Alves)

我正在使用一个map函数根据一系列对象创建一个游戏板,然后单击setState以使游戏发生。我可以成功更新状态,但是在执行其他操作之前视图不会更新。我猜测问题出在map函数如何将props传递给子元素(Cell),但我无法弄清楚自己在做什么错。

var board = [];
var width = 50;
var height = 30;
var size = width * height;


for (var i=1; i<=size; i++) {
    board[i] = {id: i, status: 'dead'};
}

var Cell = React.createClass({
  turn: function() {
    this.props.turn(this.props.id);
  },

  render: function() {
    return <div id={this.props.id} className={this.props.status} onClick={this.turn}></div>
  }
});

var GameBoard = React.createClass({  
  getInitialState: function() {    
    return {
      board: board
    };
  },

  handleClick: function(id) {
    var newBoard = this.state.board;
    newBoard[id] = {id: id, status: 'alive'};
    this.setState({board: newBoard});
  },

  move: function() {
    var board = this.state.board;
    var newBoard = board;
    for (var j=1;j<=board.length;j++) {
      if (board[j].status == 'alive') {
        newBoard[j-1] = {id: j-1, status: 'alive'};
        newBoard[j] = {id: j, status: 'dead'};
      }
    }
    this.setState({board: newBoard});
  },

  render: function() {
    var squares = this.state.board.map(function(item){
      return <Cell id={item.id} status={item.status} turn={this.handleClick}/>
    }.bind(this));
    return (
      <div>
        <h1>Game of Life</h1>
        <button className="btn btn-default" onClick={this.move}>Run</button>
        <div className='boardContainer'>{squares}</div>
      </div>
    );
  }
});

ReactDOM.render(<GameBoard/>,document.getElementById('app'));    

http://codepen.io/Theeeus/pen/YpQzPO?editors=0010

山姆

move函数中的循环是一对一的,因此在到达时会引发错误setState方法的前两行仅this.state.board在变量中分配对的引用newBoard因此,您是在“更新”状态,但不能使用正确地进行状态更新setState这就是为什么在你的下一个点击,它调用板更新setStatehandleClick

1)您应该修改状态的深层副本,而不是状态本身

2)修复for循环中的一一错误

var board = this.state.board;
var newBoard = board; // Note, this is a reference to this.state.board. That's bad!
for (var j=1; j<=board.length - 1; j++) { // note, -1
    ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ReactJS谷歌地图组件不会重新渲染

由于父级重新渲染,ReactJS计算组件道具更改时的状态

只需更改状态对象属性,是否可以触发ReactJs组件重新渲染?

为什么我的ReactJS组件状态更改未触发重新渲染?

在 ReactJS (preact) 中单击按钮时状态更改后,React 不会重新渲染

上下文值更改后,标题导航中的 ReactJS 组件不会再次重新渲染

reactjs useState:选择 onChange 触发 setState 但组件不会重新渲染

子节点更改后,ReactJS不会重新渲染

reactjs表示组件在redux状态更改时未重新呈现

状态更改后,ReactJS元素不会重新加载

ReactJS 组件不会在父状态更改时更新

ReactJS组件textarea不会在状态更改时更新

Reactjs状态更改不会传播到动态创建的子组件

ReactJS:更改子组件的状态

更改 reactJs 父组件中的状态不会更改 react 子组件中的道具

ReactJs在状态改变时重新渲染

ReactJs:防止包装组件的重新渲染

在 this.setState() 之后 Reactjs 不会重新渲染

ReactJS:即使重新渲染组件后,复选框状态仍然存在

ReactJS-内联样式不会在重新渲染组件时更新

当 prop 更改时,无状态组件不会重新渲染

我更改状态后,React组件不会重新渲染

状态更改后,React组件不会重新渲染

状态更改时,React组件不会重新渲染

使用Redux更改状态时,React组件不会重新渲染

更改其他组件的状态-ReactJS

在状态更改时交换 ReactJS 功能组件

如何在状态更改时重新呈现子组件(父)reactjs

当 redux 更改商店中的状态时,我的 reactJS 应用程序不会重新呈现