javascript - React - 无法对已卸载的组件执行 React 状态更新

标签 javascript reactjs

问候,我现在正在尝试调试一些代码,不知道如何修复我在标题中检测屏幕尺寸 View 的 useEffect。这是我在 useEffect 中遇到的错误:

Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application.

我的代码:

const [state, setState] = useState({
    mobileView: false,
    drawerOpen: false,
});

const { mobileView, drawerOpen } = state;

useEffect(() =>
{
    const setResponsiveness = () =>
    {
        return window.innerWidth < 1000
            ? setState((prevState) => ({ ...prevState, mobileView: true }))
            : setState((prevState) => ({ ...prevState, mobileView: false }));
    };

    setResponsiveness();

    window.addEventListener("resize", () => setResponsiveness());
}, []);

依赖项数组已经为空,但我不确定还可以放入什么?

最佳答案

导致问题的不是 useEffect,而是每当窗口大小发生变化时都会执行的窗口调整大小事件。

当您的函数安装时,您将向窗口添加 resize 事件。但是当您卸载组件时,resize 事件仍在监听,每当窗口大小发生变化时,您的 setResponsiveness 函数就会被调用。 setResponsiveness 将尝试更新已卸载组件的状态值。所以基本上你的功能组件正在泄漏内存,因为即使它已卸载 setResponsiveness 仍然作为对 window resize 事件的回调附加。

您应该始终在 componentWillUnmountuseEffect 返回函数中删除组件特定的事件监听器,具体取决于组件类型。

const [state, setState] = useState({
    mobileView: false,
    drawerOpen: false,
});

const { mobileView, drawerOpen } = state;

function setResponsiveness() {
    return window.innerWidth < 1000
        ? setState((prevState) => ({ ...prevState, mobileView: true }))
        : setState((prevState) => ({ ...prevState, mobileView: false }));
}

useEffect(() => {
    setResponsiveness();
    window.addEventListener("resize", setResponsiveness);
    // return a cleanup function which will remove the event listener
    return () => {
        window.removeEventListener("resize", setResponsiveness);
    };
}, []);



关于javascript - React - 无法对已卸载的组件执行 React 状态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66948301/

相关文章:

javascript - Handlebars 中的{{^是什么意思

javascript - 使用ajax过滤结果时加载部分html页面

javascript - 部分镜头 : Group array of objects by property, 使用 Prop 值作为键

javascript - 用 react-native-chart-kit 图表填充父容器(React Native,Expo)

javascript - 如何通过 react 在 axios 中设置多部分?

javascript - 来自react-form-hook的自定义输入不起作用

javascript - Yii 客户端脚本在一行中注册脚本

javascript - Angularjs 过滤器始终返回 true

javascript - 在 React 表单中处理数字属性

javascript - react 应用程序可接受的渲染时间是多少?