#reactjs #react-hooks #use-effect
#reactjs #реагирующие хуки #использование-эффект
Вопрос:
Я получаю эту ошибку и не понимаю, что это значит или как от нее избавиться:
Предупреждение: не удается выполнить обновление состояния реакции для размонтированного компонента. Это не операция, но это указывает на утечку памяти в вашем приложении. Чтобы исправить, отмените все подписки и асинхронные задачи в функции очистки useEffect. при входе в систему (в App.js: 93)
Нужна ли мне функция монтирования??
это мой app.js файл:
import React, { useState, useEffect } from 'react';
import {BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import {authenticationService} from '../services/authentication.service';
import Home from '../Pages/Desktop/Desktop';
import Login from '../Pages/Login_Register/Login';
import Register from '../Pages/Login_Register/Register';
import history from '../history';
const App = (props) => {
const [currentUser, setCurrentUser] = useState(null);
const [isAdmin, setIsAdmin] = useState(null);
const [isVIP1, setIsVIP1] = useState(false);
const [name, setName] = useState(null);
const [id, setId] = useState('');
useEffect(() => {
authenticationService.currentUser.subscribe(z => {
setCurrentUser(z)
});
}, [])
return (
<div history={history}>
<Router>
<Nav>
<div>
</div>
<div>
<div>
<div>
<Switch>
<Route path="/register">
<Register />
</Route>
<Route path="/login">
<Login />
</Route>
<Route path="/home">
<Home />
</Route>
</Switch>
</div>
</div>
</div>
</Router>
</div>
);
}
export default App;
поскольку в нем указано, что он находится в Login, вот мой login.js
import React, { useState } from 'react';
import {authenticationService} from '../../services/authentication.service';
import { Redirect } from 'react-router'
import { useForm } from 'react-hook-form';
import './login_register.css';
export default function Login({props}) {
const [currentUser, setCurrentUser] = useState(null);
const [isAdmin, setIsAdmin] = useState(null);
const [isVIP1, setIsVIP1] = useState(false);
const [name, setName] = useState(null);
const [id, setId] = useState('')
const [submitted, setSubmitted] = useState(false);
const { register, handleSubmit, errors } = useForm();
if (submitted) {
return <Redirect push to={{
pathname: '/home'
}}
/>
}
const onSubmit=(data) => {
authenticationService.login(data)
.then(
user => {
const userdata = JSON.stringify(user)
setSubmitted(true)
setName(userdata.fornavn)
},
error => {
console.log(error);
}
);
}
return (
<div>
<h2>log ind</h2>
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<div>
<input name="email" type="text" ref={register({required: true})} />
</div>
<div>
<input name="password" type="password" ref={register({required: true})}/>
</div>
<div >
<button type="submit">logind</button>
</div>
</div>
</form>
</div>
)
}
теперь, поскольку я не использую асинхронные задачи в своем коде, это не может быть так, но каковы подписки?? и как мне очистить то, чего у меня нет?
Ответ №1:
Ваш виновник почти наверняка в вашем useEffect()
. Это должно выглядеть примерно так:
useEffect(() => {
authenticationService.currentUser.subscribe(z => {
setCurrentUser(z)
});
return () => {
// some function call that cancels the subscription like...
// authenticationService.currentUser.unsubscribe()
}
}, [])
То, как выглядит эта функция отмены подписки, полностью зависит от вашей настройки и того, как вы хотите с ней справиться.
Суть этого сообщения об ошибке на самом деле просто говорит о том, что за пределами этой страницы была вызвана функция, и эта страница ожидает ответ, но страница сейчас размонтируется, поэтому обратный вызов к ней никогда не попадет.