Изменить: с введениемHooks
можно реализовать поведение жизненного цикла, а также состояние в функциональных компонентах. В настоящее время
Хуки - это новая функция, которая позволяет вам использовать состояние и другие функции React без написания класса. Они выпущены в React как часть v16.8.0.
useEffect
ловушка может использоваться для воспроизведения поведения жизненного цикла, и useState
может использоваться для хранения состояния в функциональном компоненте.
Базовый синтаксис:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
Вы можете реализовать свой вариант использования в таких хуках, как
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, []); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
также может возвращать функцию, которая будет запущена при размонтировании компонента. Это можно использовать для отказа от подписки на слушателей, копируя поведениеcomponentWillUnmount
:
Например: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
Чтобы useEffect
обусловить определенные события, вы можете предоставить ему массив значений для проверки изменений:
Например: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
Эквивалент крючков
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
Если вы включаете этот массив, обязательно включайте все значения из области компонента, которые меняются с течением времени (реквизиты, состояние), или вы можете в конечном итоге ссылаться на значения из предыдущих рендеров.
В использовании есть свои тонкости useEffect
; проверить API Here
.
До v16.7.0
Свойство функциональных компонентов состоит в том, что они не имеют доступа к функциям жизненного цикла Reacts или this
ключевому слову. Вам необходимо расширить React.Component
класс, если вы хотите использовать функцию жизненного цикла.
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
Функциональные компоненты полезны, когда вы хотите только визуализировать свой Компонент без необходимости в дополнительной логике.