Объяснение в ответных документах о том, когда вызывается функция очистки useEffect, сбивает с толку и, если честно, является общим. Они даже больше сбивают вас с толку, сравнивая ментальную модель класса с крючками. Компоненты на основе классов работают иначе, чем компоненты на основе функций с перехватчиками. React запоминает функцию эффекта, которую вы предоставили для useEffect, и запускает ее после сброса изменений в DOM, что понятно. Теперь, как и когда вызывается возвращаемая функция («функция очистки»)?
Пример кода ниже:
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// Specify how to clean up after this effect:
return function cleanup() {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}