为了账号安全,请及时绑定邮箱和手机立即绑定

React:在 setState 中设置数组对象

React:在 setState 中设置数组对象

POPMUISE 2022-10-27 16:10:49
我正在尝试使用 React 中的 setState 方法重置数组。在构造函数中,我最初将 tile_arrays 设置为 null。第一个 console.log() 在嵌套的 for 循环完成后生成所需的 N Tile 对象数组。当 setState 被调用并且随后的 console.log() 之后,状态仍然是 null 并且没有更新。我不是想将新信息附加到 states 数组,而是完全替换它。createTileArray(){        let new_array= [];        let size = this.state.size;        for(let row = 0; row < size; row++){                        for(let column = 0; column < size; column++){                                if(row === 0 || row === 1){                    //Player 1                    new_array.push(new Tile(column, row, true, 1))                }                else if(row === size - 1 || row === size - 2){                    //Player 2                    new_array.push(new Tile(column, row, true, 2))                }                else{                    //Empty Tile                    new_array.push(new Tile(column, row, false, 0))                }            }        }        console.log("Tile to be set into the state", new_array)        this.setState({            tile_arrays:new_array                    },        () => console.log("Updated Tiles: ", this.state.tile_arrays))    }
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

将您的代码复制并粘贴到一个片段中,以演示我一小时前发表的评论。


尝试在渲染中记录它


class Tile {

  constructor(column, row, something, player) {

    this.column = column;

    this.row = row;

    this.something = something;

    this.player = player;

  }

}

class App extends React.Component {

  state = {

    size: 3,

  };

  createTileArray() {

    let new_array = [];

    let size = this.state.size;

    for (let row = 0; row < size; row++) {

      for (let column = 0; column < size; column++) {

        if (row === 0 || row === 1) {

          //Player 1

          new_array.push(new Tile(column, row, true, 1));

        } else if (row === size - 1 || row === size - 2) {

          //Player 2

          new_array.push(new Tile(column, row, true, 2));

        } else {

          //Empty Tile

          new_array.push(new Tile(column, row, false, 0));

        }

      }

    }

    console.log('Tile to be set into the state', new_array);

    this.setState({

      tile_arrays: new_array,

    });

  }

  componentDidMount() {

    this.createTileArray();

  }

  render() {

    //was that so difficult?

    console.log('tile arrays', this.state.tile_arrays);

    return (

      <pre>{JSON.stringify(this.state, undefined, 2)}</pre>

    );

  }

}


ReactDOM.render(<App />, document.getElementById('root'));

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>



<div id="root"></div>


查看完整回答
反对 回复 2022-10-27
?
侃侃无极

TA贡献2051条经验 获得超10个赞

setState是异步的,但它确实允许回调。


 this.setState(

   { tile_arrays: tile_array },

   () => console.log("Updated Tiles: ", this.state.tile_arrays)

 )


查看完整回答
反对 回复 2022-10-27
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

经过一些测试,我找到了解决方案。在我的组件的初始构造函数中,而不是设置

tile_arrays:null

我将它设置为等于一个空数组

tile_arrays:[]

该问题似乎已解决并且现在可以正常工作。


查看完整回答
反对 回复 2022-10-27
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号