簡體   English   中英

如何使用反應正確更新陣列中的 state?

[英]How to correctly update state in array using react?

上一個問題中,我得到了關於如何更新數組的答案,這是通過以下方式實現的:

onClick(obj, index) {
  if (data.chosenBets[index]) {
    // Remove object.
    data.chosenBets.splice(index, 1);
  } else {
    // Add object.
    data.chosenBets.splice(index, 0, obj); 
  }
}

這不會在我的 UI 中觸發重新渲染。 如何在觸發重新渲染時更新數組(以與上述相同的方式)?

僅僅改變 state 不會觸發重新渲染。 您需要調用setState() function:

// class component
onClick = () => {
  // update state
  this.setState(newState);
}

// functional component
...
  const [ state, setState ] = useState();

  ...

  setState(newState);

此外,執行不可變的 state 更新非常重要,因為 React 通常依賴於 refs(尤其是在使用memo()PureComponent )。 因此,最好使用相同的項目創建新的數組實例。

onClick(obj, index) {
  let newData;
  if (data.chosenBets[index]) {
    newData = data.slice();
    newData.chosenBets.splice(index, 1);
  } else {
    newData = [ obj, ...data ]; 
  }

  setState(newData);
}

而且您總是可以使用一些庫來進行不可變更新,例如immerobject-path-immutable等。

在編寫 React 代碼時盡量避免使用不純函數。 在這里,拼接是一種不純的方法。 我建議使用以下代碼:

onClick(obj, index) {
  if (this.state.data.chosenBets[index]) {
    // Remove object.
    const data = {
        ...this.state.data,
        chosenBets: this.state.data.chosenBets.filter((cBet, i) => i !== index)
    };
    this.setState({ data });
  } else {
    // Add object.
    const data = {
        ...this.state.data,
        chosenBets: [ ...this.state.data.chosenBets, obj ]
    };
    this.setState({ data }); 
  }
}

我假設您已經將該數組保存在 state 中。 然后你可以做這樣的事情:

onClick = (idx) => {
  let arr = [...this.state.arrayToModify];
  arr.splice(idx,1);
  this.setState({ arrayToModify: arr });
}

希望這可以幫助!

我需要制作數組的副本:

let arr = appState.chosenBets
arr.splice(index, 1)
appState.chosenBets = arr

而不是簡單地做

data.chosenBets.splice(index, 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM