javascript - 反应钩子:回调作为道具重新渲染每个钩子,这取决于它何时被调用
问题描述
onError
在下面的示例中,当我调用prop in时,我进入了一个循环fetchItems()
。我不明白为什么,当被调用时,它会根据它触发钩子。我怎样才能解决这个问题?谢谢!
const Component = ({onError}) => {
const [items, setItems] = useState([]);
const itemsRef = useRef(items);
const fetchItems = useCallback(() => {
const [first] = itemsRef.current;
fetchNewItemsSince(first || 0).then((newItems) => {
setItems((oldItems) => [...oldItems, ...newItems]);
}).catch(onError);
}, [onError]);
// Update ref to dispose closure on `items` state
useEffect(() => {
itemsRef.current = items;
}, [items]);
// Call once on mount
useEffect(() => {
fetchItems();
}, [fetchItems]);
// Make an interval
useEffect(() => {
const id = setInterval(fetchItems, ONE_MINUTE);
return () => {
clearInterval(id);
};
}, [fetchItems]);
};
解决方案
正如我在评论中所说,onError
正在触发父级的重新渲染,因此子级也将再次渲染。
有人建议onError
从useCallback
依赖数组中删除。尽管它可能有效,但它被认为是一种不好的做法,因为它可能导致内存泄漏。您是否尝试过移除useCallback
函数的环绕?
推荐阅读
- aws-lambda - 如何让现有的 aws 帐户进入登陆区?
- .net - 在 Docker 映像中安装声纳扫描仪时出错
- c - 用大数生成从 n 到 m 的序列的最快方法是什么?
- python - 如何仅返回嵌套字典的键?
- nginx - NGINX 将 URL 保存在 /location/some-path 并提供 /location/?
- angular - Angular9 http.get() 给出未定义
- c - Valgrind 错误对我的程序意味着什么
- c++ - 处理 Valarray
- drake - 全关节连接多体系统?
- react-native - React Native SectionList 不能可靠地呈现其部分之一