У вас правильная идея. Работайте с функционалом, если ваш компонент не делает намного больше, чем принимает некоторые реквизиты и рендер. Вы можете думать о них как о чистых функциях, потому что они всегда будут отображаться и вести себя одинаково, учитывая одинаковый реквизит. Кроме того, они не заботятся о методах жизненного цикла или имеют свое собственное внутреннее состояние.
Поскольку они легкие, написание этих простых компонентов в качестве функциональных компонентов является довольно стандартным.
Если ваши компоненты нуждаются в большем количестве функций, таких как сохранение состояния, используйте вместо этого классы.
Дополнительная информация: https://facebook.github.io/react/docs/reusable-components.html#es6-classes
РЕДАКТИРОВАТЬ : Многое из вышесказанного было правдой, до введения React Hooks.
componentDidUpdate
может быть скопирован с useEffect(fn)
, где fn
это функция для запуска при рендеринге.
componentDidMount
Методы можно реплицировать с помощью useEffect(fn, [])
: где fn
- функция, запускаемая при повторном рендеринге, и []
массив объектов, для которых компонент будет перерисован, если и только если хотя бы один из них изменил значение с момента предыдущего рендеринга. Поскольку их нет, useEffect()
запускается один раз, на первом монтировании.
state
может быть реплицировано с useState()
, чье возвращаемое значение может быть преобразовано в ссылку на состояние и функцию, которая может установить состояние (т. е. const [state, setState] = useState(initState)
). Пример может объяснить это более четко:
const Counter = () => {
const [count, setCount] = useState(0)
const increment = () => {
setCount(count + 1);
}
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>+</button>
</div>
)
}
default export Counter
Что касается рекомендации о том, когда использовать класс над функциональными компонентами, Facebook официально рекомендует использовать функциональные компоненты везде, где это возможно . В качестве небольшого отступления я слышал, как многие люди обсуждали не использование функциональных компонентов по причинам производительности, а именно
«Функции обработки событий переопределяются для каждого рендера в функциональных компонентах»
Хотя это правда, пожалуйста, подумайте, действительно ли ваши компоненты рендерится с такой скоростью или громкостью, что это стоило бы беспокоиться.
Если они есть, вы можете предотвратить переопределение функций с помощью useCallback
и useMemo
хуков. Однако имейте в виду, что это может ухудшить производительность вашего микроскопического кода .
Но, честно говоря, я никогда не слышал, чтобы переопределение функций было узким местом в приложениях React. Преждевременная оптимизация - корень всего зла - беспокойтесь об этом, когда это проблема