【发布时间】:2020-09-10 08:41:54
【问题描述】:
我在我的一个项目中遇到了这个问题。此特定文件跟踪数据,以便可以将其放置在应用程序的地图上。
我在 StackOverflow 上的其他地方查看了该问题的解释和解决方案,但我没有找到任何可行的方法。任何见解将不胜感激。
import { useEffect, useState } from 'react';
import axios from 'axios';
const API_HOST = '...';
const ENDPOINTS = [...];
const defaultState = {...};
const useTracker = ({ api = 'all' }) => {
const [tracker = {}, updateTracker] = useState(defaultState);
async function fetchTracker() {
let route = ENDPOINTS.find(({ id } = {}) => id === api);
let response;
if (!route) {...}
try {...} catch (e) {...}
const { data } = response;
updateTracker((prev) => {
return {
...prev,
state: 'ready',
data
};
});
}
useEffect(() => {
fetchTracker();
}, [api]);
return {
fetchTracker,
...tracker
};
};
export default useTracker;
谢谢
【问题讨论】:
-
你只需要在你的useEffect依赖中添加
fetchTrackeruseEffect(() => { fetchTracker(); }, [api, fetchTracker]); -
@Nico_:然而,这可能不是 OP 想要的,因为每次调用
useTracker时fetchTracker都会有所不同。 -
您可能想使用
useCallback来创建fetchTracker,这应该依赖于updateTracker和api。那么useEffect应该只依赖于fetchTracker。 -
@FelixKling 我可能错了,但
fetchTracker是一个函数,所以它不会改变(即使这个函数的结果可能会改变)。 -
@Nico_:函数声明在
useTracker内部。因此,每次执行useTracker时(即每次渲染组件时)都会创建一个新的“版本”fetchTracker。简化示例:function createFunc() { return () => {};}; console.log(createFunc() === createFunc());.
标签: javascript reactjs react-hooks