Суть в том, что useEffect можно использовать по разному, если не передавать зависимости, то useEffect сработает до и будет работать на каждый рендер, даже можно использовать несколько useEffect в разных целях.
useEffect(() => {
// какой-то код
}); // без указания второго аргумента работает на каждый "чих"
useEffect(() => {
// с пустым массивом зависимостей сработает аналогично componentDidMount, тут лучше фетчить
}, []);
useEffect(() => {
console.log(props)
// с зависимостями аналогично componentDidUpdate
}, [props])
useEffect(() => {
// можно вернуть функцию, это будет аналогично componentWillUnmount
return () => {
// тут можно удалять всякие листнеры и слать события в стор, этот код сработает при размонтировании
}
}, []);
P.S: удачи в собесах))