简体   繁体   English

解决 react-hooks/exhaustive-deps 的最佳方法

[英]Best way to resolve react-hooks/exhaustive-deps

Here is my error: "The 'setPartData' function makes the dependencies of useEffect Hook (at line 44) change on every render. Move it inside the useEffect callback. Alternatively, wrap the 'setPartData' definition into its own useCallback() Hook.eslint(react-hooks/exhaustive-deps)"这是我的错误:“'setPartData' 函数使 useEffect Hook(在第 44 行)的依赖项在每次渲染时发生变化。将其移动到 useEffect 回调中。或者,将 'setPartData' 定义包装到它自己的 useCallback() Hook 中。 eslint(react-hooks/exhaustive-deps)"

How should I best resolve this as I am unable to remove the url and setPartData from the array and disable the eslint rule.我应该如何最好地解决这个问题,因为我无法从数组中删除 url 和 setPartData 并禁用 eslint 规则。

    /* eslint-disable no-shadow */
import { useState, useEffect } from 'react';

export const apiStates = {
    LOADING: 'LOADING',
    SUCCESS: 'SUCCESS',
    ERROR: 'ERROR',
};

/**
 *
 * @param {*} url
 */
export const useApi = (url) => {
    const [data, setData] = useState({
        state: apiStates.LOADING,
        error: '',
        data: [],
    });
    /**
     *
     * @param {*} partialData
     */
    const setPartData = (partialData) => setData({ ...data, ...partialData });

    useEffect(() => {
        setPartData({
            state: apiStates.LOADING,
        });
        fetch(url)
            .then((response) => response.json())
            .then((data) => {
                setPartData({
                    state: apiStates.SUCCESS,
                    data,
                });
            })
            .catch((err) => {
                setPartData({
                    state: apiStates.ERROR,
                    error: err,
                });
            });
    }, [url, setPartData]);

    return data;
};

I tried to the useCallBack() hook, but I seem to be implementing it incorrectly as I'm creating an infinite loop.我尝试使用 useCallBack() 钩子,但我似乎在创建无限循环时错误地实现了它。 Any help would be appreciated.任何帮助,将不胜感激。

Move your declaration of setPartData within the useEffect hook, and use the function version of the setData在 useEffect 钩子中移动setPartData的声明,并使用setData的函数版本

const setPartData = (partialData) => setData((data) => ({ ...data, ...partialData }));

If you need the setPartData function outside of the hook too, use useCallback to make it not change on each render如果您也需要钩子之外的 setPartData 函数,请使用useCallback使其不会在每次渲染时更改

const setPartData = useCallback((partialData) => setData((data) => ({ ...data, ...partialData })),[]);

Here's the complete useEffect with the setPartData defined inside这里是完整的 useEffect 里面定义了 setPartData

useEffect(() => {
    /**
     * @param {Partial<typeof data>} partialData
     */
    const setPartData = (partialData) =>
      setData((data) => ({ ...data, ...partialData }));
    setPartData({
      state: apiStates.LOADING,
    });
    fetch(url)
      .then((response) => response.json())
      .then((data) => {
        setPartData({
          state: apiStates.SUCCESS,
          data,
        });
      })
      .catch((err) => {
        setPartData({
          state: apiStates.ERROR,
          error: err,
        });
      });
  }, [url]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM