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
提取为另一个子组件。这样做还有其他好处,比如更多的组合性、代码共享,最重要的是性能。