La prima cosa da notare è che i componenti funzionali senza stato non possono avere metodi, non dovresti contare sulla chiamata update
o draw
su un rendering Ball
se è un componente funzionale senza stato.
Nella maggior parte dei casi dovresti dichiarare le funzioni al di fuori della funzione del componente in modo da dichiararle solo una volta e riutilizzare sempre lo stesso riferimento. Quando si dichiara la funzione all'interno, ogni volta che viene eseguito il rendering del componente la funzione verrà definita di nuovo.
Ci sono casi in cui sarà necessario definire una funzione all'interno del componente, ad esempio, per assegnarlo come gestore di eventi che si comporta in modo diverso in base alle proprietà del componente. Tuttavia è ancora possibile definire la funzione all'esterno Ball
e associarla alle proprietà, rendendo il codice molto più pulito e le funzioni update
o draw
riutilizzabili.
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
Se stai usando gli hook , puoi usare useCallback
per assicurarti che la funzione venga ridefinita solo quando una delle sue dipendenze ( props.x
in questo caso) cambia:
const Ball = props => {
const onClick = useCallback((a, b) => {
}, [props.x]);
return (
<Something onClick={onClick} />
);
}
Questo è il modo sbagliato :
const Ball = props => {
function update(a, b) {
}
return (
<Something onClick={update} />
);
}
Quando si utilizza useCallback
, definire la update
funzione useCallback
nell'hook stesso al di fuori del componente diventa più che altro una decisione di progettazione, da tenere in considerazione se si intende riutilizzare update
e / o se è necessario accedere all'ambito della chiusura del componente a, ad esempio, leggere / scrivere nello stato. Personalmente scelgo di definirlo di default all'interno del componente e di renderlo riutilizzabile solo in caso di necessità, per evitare over-engineering sin dall'inizio. Inoltre, il riutilizzo della logica dell'applicazione è fatto meglio con hook più specifici, lasciando i componenti per scopi di presentazione. La definizione della funzione all'esterno del componente durante l'utilizzo degli hook dipende in realtà dal grado di disaccoppiamento da React che si desidera per la logica dell'applicazione.