[英]Update array of object in React useState
我有一個 class ListItem
,它是Item
的列表。 它有一些 function 像setItem
更新列表中的項目和addItem
添加項目和filterItem
設置visible
Item
是一個 object,看起來像{name,number,discount,visible}
我有一個像這樣的偽代碼的視圖ListItemView
export default function ListItemView() {
const [items, setItems] = useState([])
useEffect(() => {
setItems(new ListItem(getItems()))
}, [])
function toggleChange(f,newF){
setItems((current) => current.setItem(f,newF))
}
function filter(search){
setItems(Items.filterItem({search}))
}
return (
<>
<button onClick={() => setItems(items.addItem())}> ADD Item</button>
<input onChange={(e) => filter(e.target.value)} />
{items.items.map((Item) =>
!item.visible && item.visible !== undefined ? null :
<div key={Item.id}>
<ItemLine f={item} toggleChange={toggleChange} />
</div>
)}
</>
)
}
而ItemLine
只是一個組件,它使用我的項目數據顯示輸入
所以有我的問題:
要更新我的項目,我每次都被迫使用setItems
嗎? 因為它導致頁面的完全重新呈現,這對我來說很愚蠢,因為當我們只是在整個列表的一個 object 中設置 1 個數據時?
我的過濾器 function 在我輸入時很快(在我的列表中過濾),但是當我必須重新顯示列表中的每個項目時它非常慢,有 300 個項目將無法使用,我該如何更改?
我聽說過 ReactHook 表單,它對我有用嗎?
感謝您的專業知識:)
要更新我的項目,我每次都被迫使用 setItems 嗎? 因為它導致頁面的完全重新呈現,這對我來說很愚蠢,因為當我們只是在整個列表的一個 object 中設置 1 個數據時?
是的,您需要調用 setItems 來更新您的 state,即使它是添加一個元素或更新一個元素。
但是,您可以通過將映射值轉換為組件並使用React.memo
來避免重新渲染來優化重新渲染。
function Item = React.memo(({item, toggleChange}) => {
return !item.visible && item.visible !== undefined ? null :
<div key={Item.id}>
<ItemLine f={item} toggleChange={toggleChange} />
</div>
})
export default function ListItemView() {
const [items, setItems] = useState([])
useEffect(() => {
setItems(new ListItem(getItems()))
}, [])
// using useCallback to have only one instaance of toggleChange being created even on re-renders
const toggleChange = useCallback(function toggleChange(f,newF){
setItems((current) => current.setItem(f,newF))
}, []);
function filter(search){
setItems(Items.filterItem({search}))
}
return (
<>
<button onClick={() => setItems(items.addItem())}> ADD Item</button>
<input onChange={(e) => filter(e.target.value)} />
{items.items.map((Item) =>
<Item key={item.id} item={item} toggleChange={toggleChange}/>
)}
</>
)
}
我的過濾器 function 在我輸入時很快(在我的列表中過濾),但是當我必須重新顯示列表中的每個項目時它非常慢,有 300 個項目將無法使用,我該如何更改?
如果您正在渲染大型列表,您應該致力於虛擬化這些列表,即僅渲染視圖中的項目。 react-window
和react-virtualized
是您可以探索的流行庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.