React: когда использовать компоненты на основе класса ES6 против функциональных компонентов ES6?
потратив некоторое время на изучение React я понимаю разницу между двумя основными парадигмами создания компонентов
мой вопрос в том, когда я должен использовать какой и почему? Какие преимущества/недостатки одного перед другим?
ES6 / 7 классы:
import React, { Component } from 'react';
export class MyComponent extends Component {
render() {
return (
<div></div>
);
}
}
функционал:
const MyComponent = (props) => {
return (
<div></div>
);
}
Я думаю функционально, когда нет состояния, которым можно манипулировать этим компонентом...но так ли это?
Я предполагаю, что если я использую какие-либо методы жизненного цикла, лучше всего использовать компонент на основе класса.
3 ответа:
У вас есть правильная идея. Идите с функционалом, если ваш компонент не делает намного больше, чем принимает некоторые реквизиты и рендеринг. Вы можете думать о них как о чистых функциях, потому что они всегда будут отображаться и вести себя одинаково, учитывая одни и те же реквизиты. Кроме того, они не заботятся о методах жизненного цикла или имеют свое собственное внутреннее состояние.
потому что они легкие, написание этих простых компонентов в качестве функциональных компонентов довольно стандартно.
Если вашим компонентам нужно больше функциональные возможности, такие как сохранение состояния, вместо этого используют классы.
дополнительная информация:https://facebook.github.io/react/docs/reusable-components.html#es6-classes
всегда старайтесь использовать функции без сохранения состояния (функциональные компоненты), когда это возможно. Есть сценарии, где вам нужно будет использовать обычный класс React:
- компонент должен поддерживать состояние
- компонент рендеринга слишком много, и вы должны контролировать это через
shouldComponentUpdate
- вам понадобится контейнер компонент
обновление
теперь есть класс React под названием
PureComponent
что вы можете продлить (вместоComponent
) который реализует свой собственныйshouldComponentUpdate
Это заботится о мелком сравнении реквизита для вас. подробнее
функциональные компоненты не более легкие, чем компоненты на основе классов, "они работают точно так же, как классы."- https://github.com/facebook/react/issues/5677
приведенная выше ссылка немного устарела, но в документации React 16.3.1 говорится это функциональные и классовые компоненты:
" эквивалентны с точки зрения React."- https://reactjs.org/docs/components-and-props.html#stateless-functions
там по существу нет разницы между функциональным компонентом и компонентом класса, который просто реализует метод рендеринга, кроме синтаксиса.
на мой взгляд, последовательность-это путь. Я часто использую компоненты на основе классов для "дополнительных функций", таких как состояние, но также предпочитаю использовать их для своих "функциональных компонентов", просто чтобы сохранить согласованность.
в будущем (цитируя приведенную выше ссылку) "мы [реагируем] можем добавить такие оптимизации", но пока мой команда нашла согласованность лучший вариант (особенно для неизбежного нового разработчика, который приходит и путается о том, где
this.props
пошли или случайно именаprops
что-то еще в функциональный компонент).