Вот пример из ReactConf2018 * Дана Абрамова , объясняющего разницу:
Вот несколько выводов из приведенного ниже примера:
- Вы будете писать меньше стандартного кода, используя хуки
- Доступ к обновлениям жизненных циклов и обновления состояний с помощью
useEffect()
- Относительно исполнения один аспект:
В отличие от componentDidMount и componentDidUpdate, функция, переданная useEffect, запускается после разметки и рисования во время отложенного события
- Совместное использование кода будет слишком простым, и функция useEffect () может быть реализована несколько раз для разных целей в одном и том же компоненте.
- Вы можете более эффективно контролировать рендеринг компонента, передав массив в качестве второго аргумента хуку
useEffect()
, что очень эффективно, когда вы просто передаете пустой массив [] для рендеринга компонента только при монтировании и размонтировании.
- Используйте несколько
useEffect()
крючков для разделения проблем и отреагируйте следующим образом:
Хуки позволяют разделить код на основе того, что он делает, а не на имя метода жизненного цикла. React будет применять каждый эффект, используемый компонентом, в указанном порядке
Использование классов:
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
componentDidMount() {
document.title = `You clicked ${this.state.count} times`;
}
componentDidUpdate() {
document.title = `You clicked ${this.state.count} times`;
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
Использование крючков:
import { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// Similar to componentDidMount and componentDidUpdate:
useEffect(() => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}