#reactjs #react-lifecycle
#reactjs #реагировать-жизненный цикл
Вопрос:
Я создал простые цифровые часы в React. Кажется, это работает. Однако я хотел определить функцию обратного вызова внутри setState() отдельно. Но я получил сообщение об ошибке. Знаете ли вы, как я могу определить такую функцию с именем tick() вне componenDidMount ? Ниже приведен мой код
import "./Clock.css";
class Clock extends React.Component {
state = { date: new Date() };
componentDidMount() {
setInterval(() => {
this.setState({ date: new Date() });
}, 1000);
console.log("componentdidmount");
}
render() {
return (
<div className="clock-container">
<h1 className="clock">{this.state.date.toLocaleTimeString()}</h1>
</div>
);
}
}
export default Clock;
Ответ №1:
Это то, на что вы хотите, чтобы это было похоже?
tick(){
this.interval = setInterval(() => {
this.setState({ date: new Date() });
}, 1000);
}
componentDidMount() {
this.tick();
console.log('componentdidmount');
}
componentWillUnmount(){
clearInterval(this.interval);
}
Комментарии:
1. Да, это работает! Я определяю случайную функцию без содержимого, но она не работает: foo(){}, я получил следующую ошибку: index.js:1 Предупреждение: невозможно выполнить обновление состояния реакции для размонтированного компонента. Это ошибка, но она указывает на утечку памяти в вашем приложении. Чтобы исправить, отмените все подписки и асинхронные задачи в методе componentWillUnmount
2. Это связано с тем, что setInterval все равно будет выполняться, даже если компонент отключен. В этом случае. вам нужно добавить componenWillUnmount, где вы очищаете интервал. Я отредактирую код и покажу его там.