La prima cosa da notare è che i componenti funzionali senza stato non possono avere metodi, non dovresti contare sulla chiamata updateo drawsu un rendering Ballse è 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 Balle associarla alle proprietà, rendendo il codice molto più pulito e le funzioni updateo drawriutilizzabili.
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
Se stai usando gli hook , puoi usare useCallbackper assicurarti che la funzione venga ridefinita solo quando una delle sue dipendenze ( props.xin 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 updatefunzione useCallbacknell'hook stesso al di fuori del componente diventa più che altro una decisione di progettazione, da tenere in considerazione se si intende riutilizzare updatee / 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.