为什么加了request依赖项就会陷入死循环?

为什么加了request依赖项就会陷入死循环?

老师您好,


视频5分38秒 - 6分30秒没有听明白,为什么useEffect中加了request依赖项就会陷入死循环?

局部代码Home/index.tsx

const Home = () => {
    const [page, setPage] = useState(1);
    const [requestData, setRequestData] = useState(defaultRequestData);
    // 发送请求
    const { request } = useRequest<ResponseType>(requestData);
    useEffect(() => {
        request().then(data => {
            console.log(data);
        }).catch(e => {
            console.log(e?.message);
        })
    }, [requestData, request]);

    // 获取经纬度
    useEffect(() => { ......

局部代码utils/useRequest.tsx

const request = (requestOptions?: AxiosRequestConfig) => {
        setData(null);
        setError('');
        setLoaded(false);
        // 发送请求
        return axios.request<T>({
            url: requestOptions?.url || options.url,
            method: requestOptions?.method || options.method,
            params: requestOptions?.params || options.params,
            data: requestOptions?.data || options.data,
            signal: controllerRef.current.signal,
            // headers参数发送给后端
            headers
        }).then(response => {
            setData(response.data);
            return response.data;
        }).catch((e: any) => {
            // localStorage中的token过期,删除token,重新登录
            if(e?.response?.status === 403){
                localStorage.removeItem('token');
                navigate('/account/login');
            }
            setError(e.message || 'unknown request error');
            throw new Error(e.message);
        }).finally(() => {
            setLoaded(true);
        });
    }

我的理解是Home页面不会一直重复渲染才对,request不会生成新的引用,所以没理解。

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,这不遇上了经典的面试问题了么,其实就是useEffect的第二个参数是依赖的话useEffect在每次运行时会改变依赖产生新的(引用地址发生了变化)所以又会重新触发useEffect。

祝学习愉快!

  • 晓之蛇 提问者 #1

    1、useEffect的执行会引起页面的重新渲染

    2、request是匿名函数,页面的重新渲染会导致request引用地址发生变化

    3、request作为依赖项,request改变导致useEffect执行,页面又重新渲染了(又回到第一步),陷入死循环。

    是这样吗?李哥?

    2024-01-24 11:25:40
  • 好帮手慕小李 回复 提问者 晓之蛇 #2

    果然聪明如你!很棒啊。

    2024-01-24 11:41:36
  • 晓之蛇 提问者 回复 好帮手慕小李 #3

    有些难...

    2024-01-24 12:12:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师