簡體   English   中英

React 跟蹤對象數組更改的最佳方式

[英]React best way to track changes to an array of objects

假設我有一個這樣的對象數組,它存儲在 state 中:

interface CheckItem {
  label: string;
  checked: boolean;
  disabled: boolean;
}

const [checkboxes, setCheckboxes] = useState<CheckItem[] | undefined>(undefined);


const checkboxArr: CheckItem[] = [
{label: 'item1', checked: true, disabled: false}, 
{label: 'item2', checked: false, disabled: false}
];

useEffect(() => {
  setCheckboxes(checkboxArr);
}, [])

//should remain disabled until changes are made
//should revert to disabled if changes are undone
<Button disabled={disabled}>Apply Changes</Button>

我還有一個按鈕,在更改原始元素之一之前,該按鈕應保持禁用狀態。

跟蹤對數組中每個元素的任何屬性所做的更改的最佳方法是什么? 數組可以是任意長度,所以我想優化空間/時間。

根據你的問題我能理解的是你想知道是否有人點擊了復選框?

您可以簡單地跟蹤更改,方法是讓您已經創建的名為 checkBoxArr 的常量變量並將其與新數組(如 tempCheckBoxArr)進行比較。

所以說我們創建一個數組const [tempCheckBoxArr, setTempCheckBoxArr] = useState<string[]>([])

這是一個空數組,我們可以將項目的標簽存儲在該數組中。

現在假設您在復選框上有一個 onclick function。

所以,

checkboxArr.map((checkbox) => {
  return(
      <div>
        <input type="checkbox" checked={checkbox.checked} onClick={() => handleCheckBox(checkbox.label)}/>
      </div>
  )
})

而 function handleCheckBox 是:

const handleCheckBox = (label: string) => {
  if(!tempCheckBoxArr.includes(label)){
    tempCheckBoxArr.push(label)
    setTempCheckBoxArr(tempCheckBoxArr)
  }else{
    let tempArr = tempCheckBoxArr.filter((labelInclude) => labelInclude !== label)
    
    setTempCheckBoxArr(tempArr)
    
  }
}

根據我們創建的tempCheckBoxArr.length的長度,您可以跟蹤您的按鈕是否應該被禁用以及是否有更改。

謝謝,有問題歡迎留言。

暫無
暫無

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

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