【发布时间】:2021-08-27 03:52:09
【问题描述】:
使上下文清晰的示例:
我正在尝试使用来自 API 调用的两组数据来呈现组件。如果第一个 API 调用失败,我也会提前返回。第二个 API 调用依赖于第一个 API 结果的数据。我不想结合这两种效果,因为这意味着整个组件在我获得机器人 API 结果之前不会呈现。
这是伪代码
const DataList = () => {
const [dataFromEffect1, setDataFromEffect1] = useState([]);
const [dataFromEffect2, setDataFromEffect2] = useState([]);
useEffect(() => {
const callApi1 = async () => setDataFromEffect1(await (await fetch('/api1')).json());
callApi1();
}, []);
// early return so that all the complex logic below is not called on ever render
if (!dataFromEffect1) return <div>No Data1</div>;
const data1 = complexMassagingOver(dataFromEffect1); // data1 to be used in second effect
useEffect(() => {
const callApi2 = async () => setDataFromEffect2(await (await fetch('/api2', { headers: data1 })).json());
callApi2();
}, [data1]);
return (
<div>
{/* no need to null check here, because of the early return on top */}
{dataFromEffect1}
{/* null check required here, so that it doesnt render this child component to not render till we get the data for it */}
{dataFromEffect2 ? (
<div>
{dataFromEffect2}
</div>
) : null}
</div>
);
};
问题
上面的代码不起作用,因为你不能有条件地添加一个 useEffect (提前返回搞砸了) 试图找到解决此问题的最佳解决方法。
【问题讨论】:
标签: reactjs react-hooks use-effect early-return