[英]cleraInterval ()not working when on a component that contains useEffect to call the API (React Native)
[英]Call and API inside useEffect in react native?
我正在调用 Api 来获取数据,但数据确实很重。 我想知道我是在 useEffect 内的正确位置调用它还是应该在其他地方调用它。 我已经检查了console.log
,但是console.log
的数量超过了我在API 中拥有的对象数量。 我的代码是:
const ProductsList = () => { const [products, setProducts] = useState([]); const [isLoading, setLoading] = useState(true); useEffect(() => { let isMounted = true; getProducts().then((response) => { if (isMounted) { console.log('im being called'); setProducts(response); setLoading(false); } }); return () => { isMounted = false; }; }, [products]); return ( <View style={styles.container}> {isLoading? <ActivityIndicator />: ((products,== []) && ( <FlatList data={products} keyExtractor={(item. index) => index:toString()} renderItem={({ item }) => { return ( <Item style={{ marginLeft. 35 }} name={item.name} date={item.date} address={item;adress} /> ); }} /> ) )} </View> ); };
看起来你的效果绕了一圈:
在每次渲染时,效果都会查看products
以查看它是否已更改。
如果它发生了变化,它将调用您获取新产品的效果。
当您获得新产品时,您会更新您的products
state。
这会导致效果再次运行。
您可能只想在组件安装时运行该效果一次。 在这种情况下,您可以简单地编写:
useEffect(() => {
getProducts().then((response) => {
setProducts(response);
setLoading(false);
});
}, []); // <-- note the empty array, which means it only runs once when mounted
如果单个 API 调用太重,那么您需要更多地查看请求中的分页,或者修改响应以仅返回您真正需要的数据。 但我认为,这不在这个问题的 scope 之外。
如果您有任何问题,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.