【问题标题】:React Hook useEffect has a missing dependency: 'fetchTracker'. Either include it or remove the dependency arrayReact Hook useEffect 缺少依赖项:'fetchTracker'。包括它或删除依赖数组
【发布时间】: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 想要的,因为每次调用 useTrackerfetchTracker 都会有所不同。
  • 您可能想使用useCallback 来创建fetchTracker,这应该依赖于updateTrackerapi。那么useEffect 应该只依赖于fetchTracker
  • @FelixKling 我可能错了,但fetchTracker 是一个函数,所以它不会改变(即使这个函数的结果可能会改变)。
  • @Nico_:函数声明在useTracker 内部。因此,每次执行 useTracker 时(即每次渲染组件时)都会创建一个新的“版本”fetchTracker。简化示例:function createFunc() { return () => {};}; console.log(createFunc() === createFunc());.

标签: javascript reactjs react-hooks


【解决方案1】:

您需要包含它以防止副作用。为了防止无限循环将其包装在 useCalback 中:


const useTracker = ({ api = 'all' }) => {
    const [tracker = {}, updateTracker] = useState(defaultState);

    const fetchTracker = React.useCallback(async () => {
        let route = ENDPOINTS.find(({ id } = {}) => id === api);
        let response;

        if (!route) {...}

        try {...} catch (e) {...}

        const { data } = response;

        updateTracker((prev) => {
            return {
                ...prev,
                state: 'ready',
                data
            };
        });
    },[api]);

    useEffect(() => {
        fetchTracker();
    }, [api, fetchTracker]);

    return {
        fetchTracker,
        ...tracker
    };
};

【讨论】:

猜你喜欢
  • 2021-10-29
  • 2020-07-19
  • 2020-05-31
  • 2021-08-24
  • 2023-04-09
  • 1970-01-01
  • 2021-09-10
  • 2020-09-26
  • 2020-11-05
相关资源
最近更新 更多