首页 > 解决方案 > 为什么 useEffect 不直接支持异步回调或者清理函数有单独的参数?

问题描述

我知道我不能直接将这样的异步回调传递给 useEffect

  useEffect(async () => { // not supported, as this implicitly returns a Promise
    const result = await axios(
      'https://someurl',
    );
 
    setData(result.data);
  });

因为 React 不期望任何或(清理)函数回调作为useEffect.

但我不明白的是:这种设计选择有什么具体原因吗?为什么没有像useEffect(callback, cleanup, dependencies)这样的签名,然后允许我直接将异步回调作为第一个参数传递,因为清理函数可以很容易地作为第二个参数传递?

标签: reactjsasynchronous

解决方案


但我不明白的是:这种设计选择有什么具体原因吗?

想到的原因之一是以下。当您从中返回函数时,经常会做出反应,useEffect例如取消订阅事物等,并且通常您可能需要从useEffect. 例如:

  useEffect(() => {

    let cancelled = false;
    fakeFetch(person).then(data => {
        if (!cancelled) {
            setData(data);
        }
    });

    return () => {

        cancelled = true;

    }

 }, [person])

使用您的设计,您将无法做到以上。


推荐阅读