【发布时间】:2022-01-08 19:19:06
【问题描述】:
我有一个基本的 useFetch 钩子实现,它定义了一个 fetchData 函数,如果成功,它将 setData 到一些 JSON,然后我会在没有依赖关系的 useEffect 上调用它,并且钩子返回有状态的数据值。我发现这并不理想,因为我想根据事件动态获取内容。
因此,我改为将 useFetch 挂钩更改为简单地将 fetchData 函数引用与数据一起返回,并且不再在挂钩内调用 fetchData。
const useFetch = () => {
const [data, setData] = useState([]);
const fetchData = async (url) => {
try {
const response = await fetch(url);
if (response.ok) {
const jsonData = await response.json();
setData(jsonData);
} else {
throw new Error(response.status);
}
} catch (err) {
console.error(err);
}
};
return { fetchData, data };
};
然而,这在我使用这个钩子的地方引入了问题。我以前从未使用过这种模式,所以我真的不知道我在做什么,但是在调用 fetch 函数后我无法对数据值做任何事情。这基本上是我在另一个功能组件中使用钩子的方式:
const [displayedItems, setDisplayedItems] = useState([]);
const { fetchData, data } = useFetch();
useEffect(() => {
fetchData(urlGoesHere);
}, []);
useEffect(() => {
setDisplayedItems(data);
console.log(displayedItems);
}, [data]);
这很丑陋,而且不起作用。我尝试将它们全部放在一个 useEffect 中,但这也不起作用。有时,当我在 CRA 中重新加载时,我可以看到正在记录的数据,但通常当我的页面加载时,数据只是保持未定义。所以我基本上通过改变 useFetch 来创建另一个问题,而不是实际使用 fetch 函数(它的缺点是无法在我的常规函数和事件回调中调用),现在我似乎什至无法渲染任何东西。
我对 React 和异步的东西还很陌生,所以我很感激能考虑到这一点的回应。如果我正在尝试做的事情有更好的模式,我很想听听,但我想把它放在香草反应地里,所以没有图书馆,等等。再一次,我的原因'返回对 fetch 函数的引用是因为我希望能够在回调和其他东西中使用它。
谢谢大家!
编辑:如果我在第二个 useEffect 中检查数据的真实性,它会起作用,但无论如何,这个实现能更好吗?
useEffect(() => {
fetchData(urlGoesHere);
}, []);
useEffect(() => {
if (data) {
setDisplayedItems(data);
console.log(displayedItems);
}
}, [data]);
这是否意味着每次我想在加载时获取某些东西时都必须使用 2 个完整的 useEffects?
【问题讨论】:
-
这是一个学习练习吗? “
useFetch”钩子的其他实现已经存在(例如useSWR) -
@jsejcksn 差不多就是这样。我知道这不切实际,但尝试在我的第一个使用 React 的项目中保持原样,这样我就可以更多地理解 React。不过,我在某个时候查看了 SWR,所以感谢您提醒我。我会调查的
标签: javascript reactjs react-hooks