A primeira coisa a notar é que os componentes funcionais sem estado não podem ter métodos, você não deve contar com a chamada updateou drawcom um renderizado Ballse for um componente funcional sem estado.
Na maioria dos casos, você deve declarar as funções fora da função do componente para declará-las apenas uma vez e sempre reutilizar a mesma referência. Quando você declara a função interna, toda vez que o componente for renderizado, a função será definida novamente.
Há casos em que você precisará definir uma função dentro do componente para, por exemplo, atribuí-lo como um manipulador de eventos que se comporta de maneira diferente com base nas propriedades do componente. Mesmo assim, você pode definir a função externamente Balle vinculá-la às propriedades, tornando o código muito mais limpo e tornando as funções updateou drawreutilizáveis.
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
Se estiver usando ganchos , você pode usar useCallbackpara garantir que a função só seja redefinida quando uma de suas dependências ( props.xneste caso) mudar:
const Ball = props => {
const onClick = useCallback((a, b) => {
}, [props.x]);
return (
<Something onClick={onClick} />
);
}
Este é o caminho errado :
const Ball = props => {
function update(a, b) {
}
return (
<Something onClick={update} />
);
}
Ao usar useCallback, definir a updatefunção no useCallbackpróprio gancho ou fora do componente torna-se uma decisão de design mais do que qualquer coisa, você deve levar em consideração se for reutilizar updatee / ou se precisar acessar o escopo do fechamento do componente para, por exemplo, ler / gravar no estado. Pessoalmente, eu escolho defini-lo dentro do componente por padrão e torná-lo reutilizável apenas se for necessário, para evitar o excesso de engenharia desde o início. Além disso, a reutilização da lógica do aplicativo é melhor realizada com ganchos mais específicos, deixando os componentes para fins de apresentação. Definir a função fora do componente durante o uso de ganchos realmente depende do grau de desacoplamento do React que você deseja para a lógica do aplicativo.