【问题标题】:Call and API inside useEffect in react native?反应原生的useEffect中的调用和API?
【发布时间】:2021-03-28 14:50:38
【问题描述】:

我正在调用 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>
  );
};

【问题讨论】:

  • 是的,这似乎是正确的。但是,如果您没有任何错误并且只想让别人查看您的代码,请访问codereview.stackexchange.com。这是一个很棒的社区,人们愿意就潜在改进向您提供详细的反馈。

标签: javascript react-native use-effect


【解决方案1】:

看起来你的效果绕了一圈:

  1. 在每次渲染时,效果都会查看products 以查看它是否已更改。

  2. 如果它发生了变化,它将调用你获取新产品的效果。

  3. 当您获得新产品时,您会更新您的 products 状态。

  4. 这会导致效果再次运行。

您可能只想在组件挂载时运行该效果一次。在这种情况下,您可以简单地写:

  useEffect(() => {
    getProducts().then((response) => {
      setProducts(response);
      setLoading(false);
    });
  }, []); // <-- note the empty array, which means it only runs once when mounted

如果单个 API 调用过于繁重,那么您需要更多地查看请求中的分页等内容,或者修改响应以仅返回您真正需要的数据。但我认为这超出了这个问题的范围。

如果您有任何问题,请告诉我。

【讨论】:

  • 感谢您的回答。这正是它正在发生的事情。效果不会停止运行。我从解决方案stackoverflow.com/questions/53949393/… 添加了isMounted,因为我收到了这个警告:无法对未安装的组件执行 React 状态更新。
  • 哦,好的。这适用于 isMounted 变量吗?我想我现在可以看到你解释了。如果答案是正确的,您介意接受吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2018-09-01
  • 2018-02-18
  • 1970-01-01
  • 2021-09-05
  • 2021-05-01
  • 2020-09-18
相关资源
最近更新 更多