La première chose à noter est que les composants fonctionnels sans état ne peuvent pas avoir de méthodes, il ne faut pas compter sur un appel update
ou draw
sur un rendu Ball
s'il s'agit d'un composant fonctionnel sans état.
Dans la plupart des cas, vous devez déclarer les fonctions en dehors de la fonction du composant afin de les déclarer une seule fois et de toujours réutiliser la même référence. Lorsque vous déclarez la fonction à l'intérieur, chaque fois que le composant est rendu, la fonction sera de nouveau définie.
Dans certains cas, vous devrez définir une fonction à l'intérieur du composant pour, par exemple, l'affecter en tant que gestionnaire d'événements qui se comporte différemment en fonction des propriétés du composant. Mais vous pouvez toujours définir la fonction à l'extérieur Ball
et la lier aux propriétés, ce qui rend le code beaucoup plus propre et rend les fonctions update
ou draw
réutilisables.
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
Si vous utilisez des hooks , vous pouvez utiliser useCallback
pour vous assurer que la fonction n'est redéfinie que lorsque l'une de ses dépendances ( props.x
dans ce cas) change:
const Ball = props => {
const onClick = useCallback((a, b) => {
}, [props.x]);
return (
<Something onClick={onClick} />
);
}
C'est la mauvaise façon :
const Ball = props => {
function update(a, b) {
}
return (
<Something onClick={update} />
);
}
Lors de l'utilisation useCallback
, la définition de la update
fonction dans le useCallback
hook lui-même notre extérieur du composant devient une décision de conception plus que tout, vous devez prendre en compte si vous allez réutiliser update
et / ou si vous devez accéder à la portée de la fermeture du composant à, par exemple, lecture / écriture de l'état. Personnellement je choisis de le définir à l'intérieur du composant par défaut et de le rendre réutilisable uniquement si le besoin s'en fait sentir, pour éviter une sur-ingénierie dès le départ. En plus de cela, il est préférable de réutiliser la logique de l'application avec des hooks plus spécifiques, laissant les composants à des fins de présentation. La définition de la fonction en dehors du composant lors de l'utilisation de hooks dépend vraiment du degré de découplage de React que vous souhaitez pour la logique de votre application.