P粉8059224372023-08-16 15:36:35
const [todos, setTodos] = useState<string[]>([]);
和
const renderItem = useCallback( () => { //todo's here is a closure, it will not update //a dependency of [] means, just run once. }, [] );
這是一個常見的問題,因為它不明顯。因為這種情況經常發生,所以setState
有一個回調版本。在你的程式碼中,你實際上是使用它來設定狀態,但你還需要使用它來取得當前狀態以進行最大10個的檢查。
所以一個簡單的解決方法是將長度檢查放在useState的回呼函數中。
setTodos((curr) => curr.length >= 10 ? curr : [item.name, ...curr]);
在上面的程式碼中,如果目前長度大於或等於10,則只傳回目前狀態,否則新增項目。
另一個選項,當然將todos添加到useCallback的狀態中,但為什麼這在FlashList
中不起作用,不確定。
更好的選擇是將Item
提取為另一個子元件。這樣做還有其他好處,例如更多的組合性、程式碼共享,最重要的是效能。