You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React触发未挂载组件状态更新警告 已清理定时器仍报错如何修复

问题原因

你仅清理了防抖定时器,第二个处理搜索请求的useEffect中未处理未完成的异步请求逻辑:当组件已经卸载后,axios请求才返回,此时调用setResults更新已卸载组件的状态,就会触发该警告。

修复方案

推荐使用AbortController中断未完成的axios请求,既可以解决状态更新警告,还能节省无用的网络开销,修改第二个useEffect逻辑即可:

useEffect(() => {
    // 创建请求中断控制器
    const controller = new AbortController();

    const search = async () => {
        try {
            const {data} = await axios.get('https://en.wikipedia.org/w/api.php', {
                params: {
                    action: 'query',
                    list: 'search',
                    origin: '*',
                    format: 'json',
                    srsearch: debouncedTerm,
                },
                // 绑定中断信号到当前请求
                signal: controller.signal
            });
            setResults(data.query.search);
        } catch (err) {
            // 忽略主动中断请求产生的错误
            if (axios.isCancel(err)) return;
            // 其他业务错误可按需添加处理逻辑
            console.error('搜索请求异常', err);
        }
    };

    if(debouncedTerm){
        search();
    }

    // 清理逻辑:组件卸载或依赖更新时中断未完成的请求
    return () => controller.abort();
}, [debouncedTerm])
备用方案(不推荐)

如果不需要中断请求,也可以通过挂载状态标记判断是否需要更新状态,仅能解决警告,不会中断无用请求:

useEffect(() => {
    let isMounted = true;

    const search = async () => {
        const {data} = await axios.get('https://en.wikipedia.org/w/api.php', {
            params: {
                action: 'query',
                list: 'search',
                origin: '*',
                format: 'json',
                srsearch: debouncedTerm,
            },
        });
        // 仅组件挂载时更新状态
        if (isMounted) {
            setResults(data.query.search);
        }
    };

    if(debouncedTerm){
        search();
    }

    return () => {
        isMounted = false;
    }
}, [debouncedTerm])

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:45:01