自定义 Hook 里怎么正确处理依赖数组?
我写了个自定义 Hook 用来封装数据请求,但 useEffect 的依赖项总报错,说缺少某些变量。比如我用了 axios 实例和一个 url 参数,但加进去又导致无限循环,到底该怎么处理依赖数组才对?
这是我的代码:
function useFetchData(url) {
const [data, setData] = useState(null);
const api = axios.create({ baseURL: 'https://api.example.com' });
useEffect(() => {
api.get(url).then(res => setData(res.data));
}, [url]); // 这里 ESLint 警告说 api 没加到依赖里
}
你的问题根源在于
api每次渲染都会重新创建一个新的实例,把它加到依赖数组里就会无限循环。解决办法有两个,推荐第一种:
把
api实例提到 Hook 外面,这样就只创建一次:如果
api必须根据某些条件动态创建,就用useMemo包一下:顺便提醒一下,你的 Hook 没写
return语句,外面用不了data,记得加上。希望能帮到你!依赖数组这块确实需要多注意,ESLint 的
exhaustive-deps规则虽然烦,但大部分时候它的警告是有道理的。