Ваша проблема в том, что axios возвращает обещание, поэтому, когда компонент смонтирован, он выполняет axios.post(...)
при нажатии.Когда он ТОЛЬКО размонтируется (хотя обещание все еще может быть «незавершенным»), setState
его finally
будет выполняться ПОСЛЕ размонтированного компонента.
Вы можете использовать простую проверку, если компонент смонтирован:
import React, {useState, useContext, useEffect} from 'react';
import {withRouter} from 'react-router-dom';
import axios from 'axios';
import {AppContext} from "../context/AppContext";
const LoginPage = (props) => {
const [name, setName] = useContext(AppContext);
const [isLoading, setIsLoading] = useState(false);
const isMounted = useRef(null);
useEffect(() => {
// executed when component mounted
isMounted.current = true;
return () => {
// executed when unmount
isMounted.current = false;
}
}, []);
const onClick = () => {
setIsLoading(true);
axios.post('/get-name')
.then(resp => {
setName(resp);
setIsLoading(false);
props.history.push('/');
})
.catch(err => console.log(err))
.finally(() => {
if (isMounted.current) {
setIsLoading(false)
}
});
};
return (
<div>
<button onClick={onClick}></button>
</div>
);
};
export default withRouter(LoginPage);