Редагувати: Завдяки впровадженню 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
:
Напр .: компонентWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
Щоб умовити useEffect
конкретні події, ви можете надати йому масив значень для перевірки змін:
Напр., КомпонентDidUpdate
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>
)
}
}
Компоненти функцій корисні лише тоді, коли ви хочете зробити свій компонент лише без зайвої логіки.