Ответ 1
Второй код является функциональным компонентом без состояния и представляет собой новый синтаксис/шаблон для определения компонентов как функции props
. Он был введен в Реакт v0.14.
Вы можете узнать больше об этом в официальном блоге React, здесь, в официальной документации по React, здесь.
Эти компоненты ведут себя так же, как класс React, только с рендерингом метод. Поскольку экземпляр компонента не создается для функциональный компонент, любой ref, добавленный в один, будет оцениваться как null. Функциональные компоненты не имеют методов жизненного цикла, но вы можете установить
.propTypes
и.defaultProps
в качестве свойств функции.Этот шаблон предназначен для поощрения создания этих простых компоненты, которые должны содержать большие части ваших приложений. в будущее, а также иметь возможность сделать оптимизацию производительности конкретным к этим компонентам, избегая ненужных проверок и памяти распределение.
-
Какая разница?
Этот шаблон похож на "традиционный", за исключением того факта, что вы используете простые функции вместо методов, определенных в классе. Это может быть полезно, когда вы хотите извлечь функции из класса (например, для удобства чтения и чистоты).
Важно отметить, что функциональный компонент - это просто функция. Это не класс. Таким образом, нет глобального объекта
this
. Это означает, что когда вы делаетеrender
, вы в основном создаете новый экземплярReactComponent
, тем самым оставляя возможность для этих объектов javascript взаимодействовать друг с другом через какой-либо глобальныйthis
. Это также делает невозможным использованиеstate
и любых методов жизненного цикла.
-
Как мое приложение получает от этого преимущества?
Производительность
Когда вы используете функциональные компоненты без состояния, React достаточно умен, чтобы исключить все "традиционные" методы жизненного цикла, которые, как оказалось, обеспечивают достаточное количество оптимизаций. Команда React заявила, что планирует в будущем планировать дальнейшую оптимизацию для распределения памяти и уменьшения количества проверок.Адаптивность
Поскольку мы говорим только о функции (а не о классе), нам не нужно беспокоиться оstate
, методах жизненного цикла или других зависимостях. Учитывая параметры, функция всегда будет давать одинаковый результат. Таким образом, очень легко адаптировать такие компоненты везде, где мы хотим, что также облегчает тестирование.С реакциями безстоящих функциональных компонентов каждый компонент может быть легко протестирован изолированно. Никаких издевательств, манипуляций с состоянием, специальных библиотек или сложных тестовых жгутов не требуется.
Поощряет лучшие практики
Реакция часто сравнивается с V шаблона MVC, поскольку она предназначена для создания представлений. "Традиционные" способы создания компонентов упрощают "взламывание" бизнес-логики (например, с помощьюstate
илиref
) в компоненты, которые действительно должны обрабатывать только визуализацию. Они поощряют ленивость и пишут вонючий код. Тем не менее, функциональные компоненты без гражданства делают почти невозможным использование таких ярлыков и обеспечивают лучший подход.
-
Когда следует использовать один над другим?
Как правило, рекомендуется использовать новый шаблон по возможности! Если вам нужен только метод
render
, но нет методов жизненного цикла илиstate
, используйте этот шаблон. Конечно, иногда вам нужно использоватьstate
, и в этом случае вы отлично используете традиционный шаблон.Facebook рекомендует использовать компоненты без состояния при рендеринге статических презентационных компонентов. Затем, если требуется какое-то состояние, просто оберните их в компоненте с состоянием, чтобы управлять ими, используя его
state
и отправивprops
в компоненты без состояния.