React: компоненты класса против функциональных компонентов
В этой статье я объясню разницу между компонентами класса и функциональными компонентами после React 16.8 и объясню, почему вам, вероятно, следует чаще использовать функциональные компоненты.
Наиболее заметное различие между компонентами класса и функциональными компонентами в реакции заключается в их синтаксисе. Компоненты класса расширяются от React.Component, а функциональные компоненты — нет.
Компонент класса:
class Hamburger extends React.Component { render() { return <h1>{this.props.cheeseType}</h1> } }
Функциональный компонент:
function Hamburger(props){ return <h1>{props.cheeseType}</h1> } or const Hamburger = (props) => { return <h1>{props.cheeseType}</h1> }
Функциональный компонент, очевидно, представляет собой гораздо более упрощенный способ достижения того же результата, но эта простота предлагает некоторую разницу в том, как работает функциональный компонент.
Штат
Функциональные компоненты и компоненты класса обрабатывают состояние по-разному. Функциональные компоненты на самом деле раньше назывались «компонентами без состояния», потому что они вообще не предлагали возможность устанавливать состояние. Но с появлением в React 16.8 «хуков» все изменилось.
Хуки позволяют разработчикам использовать состояние и другие функции React в функциональных компонентах.
Вот как состояние обрабатывается в компоненте класса:
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
В этом примере мы используем setState для обновления значения нашего счетчика.
Вот как состояние обрабатывается в функциональном компоненте:
import React, { useState } from 'react';
function Example() {
// Declare a new state variable, which we'll call "count" const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
В этом примере мы используем «useState», новый хук, предоставленный React. Единственный аргумент useState в этом примере — это начальное состояние, которое вы хотите иметь для «count», то есть (0).
В функциональном компоненте вы можете вызывать состояние непосредственно по его имени, но в компоненте класса вы должны вызывать состояние, используя «this.state». Итак, даже с новыми обновлениями функциональные компоненты известны своей простотой!
Крючки жизненного цикла
В React 16.8 функциональные компоненты также могут реагировать на события жизненного цикла с помощью хука useEffect. Подробнее здесь.
Вывод: вам, вероятно, следует использовать функциональные компоненты
До React 16.8 варианты использования между функциональными компонентами и классовыми компонентами были очень четкими — классовые компоненты имели состояние, а функциональные компоненты были презентационными. Но с появлением хуков предпочтение отдается функциональным компонентам.
Это обычный JavaScript, они просты, требуют меньше кода и потенциально могут быть даже быстрее, чем функциональные компоненты. В более крупных приложениях React количество сохраненных строк потенциально может исчисляться тысячами с использованием функциональных компонентов, что, несомненно, ускорит ваше приложение и уменьшит размер его файла. Наряду с меньшим количеством строк кода повышается читабельность, что отлично подходит для будущего любого приложения и является главной особенностью хорошего кода. Из-за этих особенностей я определенно буду отдавать предпочтение функциональным компонентам в своих будущих проектах React!