Je dirais que ni l'une ni l'autre de vos idées initiales ne captent l'ensemble du tableau. L'idée 1 n'est qu'un rappel. Si vous souhaitez utiliser un rappel: useCallback
. L'idée 2 fonctionnera et est préférable si vous n'avez pas besoin d'utiliser redux. Parfois, il vaut mieux utiliser redux. Vous définissez peut-être la validité du formulaire en vérifiant qu'aucun des champs de saisie ne contient d'erreurs ou quelque chose de similaire. Puisque nous parlons de redux, supposons que c'est le cas.
Habituellement, la meilleure approche de la gestion des erreurs avec redux consiste à avoir un champ d'erreur dans l'état qui est ensuite transmis à un composant d'erreur.
const ExampleErrorComponent= () => {
const error = useSelector(selectError);
if (!error) return null;
return <div className="error-message">{error}</div>;
}
Le composant d'erreur ne doit pas simplement afficher une erreur, il peut également provoquer des effets secondaires useEffect
.
La façon dont l'erreur est définie / supprimée dépend de votre application. Prenons l'exemple de votre numéro de téléphone.
1. Si le contrôle de validité est une fonction pure, il peut être effectué dans le réducteur.
Vous devez ensuite définir ou désactiver le champ d'erreur en réponse aux actions de changement de numéro de téléphone. Dans un réducteur construit avec une instruction switch, cela pourrait ressembler à ceci.
case 'PHONE_NUMBER_CHANGE':
return {
...state,
phoneNumber: action.phoneNumber,
error: isValidPhoneNumber(action.phoneNumber) ? undefined : 'Invalid phone number',
};
2. Si des erreurs sont signalées par le backend, envoyez des actions d'erreur.
Supposons que vous envoyez le numéro de téléphone à un serveur principal qui effectue la validation avant de faire quelque chose avec le numéro. Vous ne pouvez pas savoir si les données sont valides côté client. Vous aurez juste à croire le mot du serveur.
const handleSubmit = useCallback(
() => sendPhoneNumber(phoneNumber)
.then(response => dispatch({
type: 'PHONE_NUMBER_SUBMISSION_SUCCESS',
response,
}))
.catch(error => dispatch({
type: 'PHONE_NUMBER_SUBMISSION_FAILURE',
error,
})),
[dispatch, phoneNumber],
);
Le réducteur devrait alors trouver un message approprié pour l'erreur et le régler.
N'oubliez pas de supprimer l'erreur. Vous pouvez annuler l'erreur lors d'une action de modification ou lors d'une autre demande en fonction de l'application.
Les deux approches que j'ai décrites ne s'excluent pas mutuellement. Vous pouvez utiliser le premier pour afficher les erreurs détectables localement et également utiliser le second pour afficher les erreurs côté serveur ou réseau.