gpt4 book ai didi

javascript - react 警告 : Can't call setState (or forceUpdate) on an unmounted component

转载 作者:行者123 更新时间:2023-11-30 07:00:08 25 4
gpt4 key购买 nike

我有两个组件:
订单 - 获取一些数据并显示它。
ErrorHandler - 如果服务器发生错误,模式将显示并显示一条消息。
ErrorHandler 组件正在扭曲订单组件

我使用 axios 包加载订单组件中的数据,我使用 axios 拦截器来设置有关错误的状态,并在组件卸载后弹出。

当我来回导航到订单组件时,我有时会在控制台中收到错误消息:

Warning: Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
in Orders (at ErrorHandler.jsx:40)
in Auxiliary (at ErrorHandler.jsx:34)
in _class2 (created by Route)

我试图通过我以前的案例解决它React Warning: Can only update a mounted or mounting component但在这里我不能让检查员制作 axios token 。以前有人解决过这个问题吗?

这是我的组件:

订单:

import React, { Component } from 'react';
import api from '../../api/api';
import Order from '../../components/Order/Order/Order';
import ErrorHandler from '../../hoc/ErrorHandler/ErrorHandler';

class Orders extends Component {
state = {
orders: [],
loading: true
}

componentDidMount() {
api.get('/orders.json')
.then(response => {
const fetchedOrders = [];
if (response && response.data) {
for (let key in response.data) {
fetchedOrders.push({
id: key,
...response.data[key]
});
}
}
this.setState({ loading: false, orders: fetchedOrders });
})
.catch(error => {
this.setState({ loading: false });
});
}

render() {
return (
<div>
{this.state.orders.map(order => {
return (<Order
key={order.id}
ingrediencies={order.ingrediencies}
price={order.price} />);
})}
</div>
);
}
}

export default ErrorHandler(Orders, api);

错误处理程序:

import React, { Component } from 'react';
import Auxiliary from '../Auxiliary/Auxiliary';
import Modal from '../../components/UI/Modal/Modal';

const ErrorHandler = (WrappedComponent, api) => {
return class extends Component {
requestInterceptors = null;
responseInterceptors = null;
state = {
error: null
};

componentWillMount() {
this.requestInterceptors = api.interceptors.request.use(request => {
this.setState({ error: null });
return request;
});
this.responseInterceptors = api.interceptors.response.use(response => response, error => {
this.setState({ error: error });
});
}

componentWillUnmount() {
api.interceptors.request.eject(this.requestInterceptors);
api.interceptors.response.eject(this.responseInterceptors);
}

errorConfirmedHandler = () => {
this.setState({ error: null });
}

render() {
return (
<Auxiliary>
<Modal
show={this.state.error}
modalClosed={this.errorConfirmedHandler}>
{this.state.error ? this.state.error.message : null}
</Modal>
<WrappedComponent {...this.props} />
</Auxiliary>
);
}
};
};

export default ErrorHandler;

最佳答案

我认为这是由于触发 setState 的异步调用所致,即使组件未安装也可能发生。为防止这种情况发生,您可以使用某种标志:

  state = {
isMounted: false
}
componentDidMount() {
this.setState({isMounted: true})
}
componentWillUnmount(){
this.state.isMounted = false
}

然后用 if 包装你的 setState 调用:

if (this.state.isMounted) {
this.setState({ loading: false, orders: fetchedOrders });
}

编辑 - 添加功能组件示例:

function Component() {
const [isMounted, setIsMounted] = React.useState(false);

useEffect(() => {
setIsMounted(true);
return () => {
setIsMounted(false);
}
}, []);

return <div></div>;
}

export default Component;

关于javascript - react 警告 : Can't call setState (or forceUpdate) on an unmounted component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51609276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com