[英]React hooks: how to get rid of a state dependency
在下面的示例中,我想知道如何擺脫useEffect()
中的items
依賴性我只想執行一次以設置間隔。 最好的做法是什么? 謝謝!
const Component = () => {
const [items, setItems] = useState([])
useEffect(() => {
const fetchItems = () => {
fetchNewItemsSince(items.length ? items[items.length - 1].id : 0) // How to get rid of items dependency
.then((newItems) => {
setItems((oldItems) => [...oldItems, ...newItems])
})
}
fetchItems()
setInterval(fetchItems, 60 * 10000)
return () => clearInterval()
}, [items]) // <= I want to get rid of that dependency!!
}
這個片段中有一些錯誤,比如清理間隔和在 useEffect 中調用清理useEffect
,我會把這個邏輯重寫為:
const Component = () => {
const [items, setItems] = useState([]);
const itemsRef = useRef(items);
const fetchItems = useCallback(() => {
const [first] = itemsRef.current;
fetchNewItemsSince(first || 0).then((newItems) => {
setItems((oldItems) => [...oldItems, ...newItems]);
});
}, []);
// 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]);
};
我會做這樣的事情,使用react-use
庫中的useInterval
鈎子:
const Component = () => {
const [items, setItems] = useState([]);
const lastItemId = useMemo(
() => (items.length ? items[items.length - 1].id : 0),
[items],
);
const fetchNewItems = useCallback(async () => {
const newItems = await fetchNewItemsSince(lastItemId);
if(newItems.length) {
setItems((oldItems) => [...oldItems, ...newItems]);
}
}, [lastItemId, setItems]);
useInterval(fetchNewItems, 60 * 10000);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.