Edit: Com a introdução do Hooks
, é possível implementar um tipo de comportamento de ciclo de vida, bem como o estado nos componentes funcionais. Atualmente
Os ganchos são uma nova proposta de recurso que permite usar o estado e outros recursos do React sem escrever uma classe. Eles foram lançados no React como parte da v16.8.0
useEffect
O gancho pode ser usado para replicar o comportamento do ciclo de vida e useState
pode ser usado para armazenar o estado em um componente de função.
Sintaxe básica:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
Você pode implementar seu caso de uso em ganchos como
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
também pode retornar uma função que será executada quando o componente for desmontado. Isso pode ser usado para cancelar a assinatura de ouvintes, replicando o comportamento de componentWillUnmount
:
Ex .: componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
Para tornar useEffect
condicional a eventos específicos, você pode fornecer uma matriz de valores para verificar as alterações:
Ex: componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
Equivalente a ganchos
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
Se você incluir esta matriz, certifique-se de incluir todos os valores do escopo do componente que mudam com o tempo (props, estado), ou você pode acabar fazendo referência a valores de renderizações anteriores.
Existem algumas sutilezas para usar useEffect
; verifique a API Here
.
Antes da v16.7.0
A propriedade dos componentes de função é que eles não têm acesso às funções do ciclo de vida do Reacts ou à this
palavra - chave. Você precisa estender a React.Component
classe se quiser usar a função de ciclo de vida.
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>
)
}
}
Os componentes de função são úteis quando você deseja apenas renderizar seu componente sem a necessidade de lógica extra.