亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對原始狀態的更改副本做出反應狀態更改?

對原始狀態的更改副本做出反應狀態更改?

holdtom 2023-07-20 17:25:13
我正在嘗試使用 React 制作一個簡單的游戲,例如紫色宮殿游戲中的紫色對。我有一個名為 的方法clickBtn,它應該在單擊時增加計數并在第二次單擊時減少,但我不知道為什么該handleClick方法會更改chosen以及clicked狀態屬性,即使在不使用方法的情況下制作了新狀態的副本setState。你能幫我解決這個問題嗎?class GameBoard extends React.Component {  constructor() {    super();    this.state = {      score: 0,      time: 0,      list: [...generateObList(), ...generateObList()],      count: 0    };  }  handleClick = (id) => {    this.clickBtn(id);    const list = this.state.list.slice();    const current = list.find((a) => a.id === id);    for (let x of list) {      if (x.clicked && x.value == list.find((a) => a.id == id).value) {        x.chosen = true;        x.clicked = false;        current.chosen = true;        current.clicked = false;        // this.setState((prev) => ({        //   list: prev.list.map((el) =>        //     el.id === id ? current : el.value === current.value ? x : el        //   ),        //   score: prev.score + 1        // }));      }    }  };  clickBtn = (id) => {    const current = this.state.list.slice().find((e) => e.id === id);    let deClick = current.clicked;    current.clicked = !current.clicked;    console.log(current);    this.setState(      (prev) => ({        list: prev.list.map((el) => (el.id === id ? current : el)),        count: prev.count + (deClick ? -1 : 1)      }),      () => {        console.log(this.state.count, deClick, current);      }    );  };  render() {    const boardStyle = {      gridTemplateColumns: `repeat(5, 1fr)`,      gridTemplateRows: `repeat(5,1r)`    };    let list = this.state.list.map((n) => (      <Card        value={n.value}        onClick={(e) => {          this.handleClick(n.id);        }}        show={!n.chosen}      />    ));    return (      <div class="gameBoard" style={boardStyle}>        {list}      </div>    );  }}
查看完整描述

1 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

slice()只需返回數組的淺表副本,因此如果項目是引用類型(對象),則原始和副本都引用相同的數組項目。

對于對象切片,將對象引用復制到新數組中。原始數組和新數組都引用同一個對象。如果對象發生更改,則新數組和原始數組都可以看到這些更改。

嘗試深度復制對象。您可以使用以下方法輕松進行深度復制:JSON.parse(JSON.stringify(arr))

也可以試試lodashcloneDeep()方法。

查看完整回答
反對 回復 2023-07-20
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號