Eu diria que nenhuma de suas idéias iniciais captura o quadro inteiro. A idéia 1 é apenas um retorno de chamada. Se você quiser usar uma chamada de retorno: useCallback
. A idéia 2 funcionará e é preferível se você não precisar usar o redux. Às vezes, é melhor usar o redux. Talvez você esteja configurando a validade do formulário verificando se nenhum dos campos de entrada possui erros ou algo semelhante. Como estamos no tópico redux, vamos assumir que é o caso.
Geralmente, a melhor abordagem para o tratamento de erros com redux é ter um campo de erro no estado que é passado para um componente de erro.
const ExampleErrorComponent= () => {
const error = useSelector(selectError);
if (!error) return null;
return <div className="error-message">{error}</div>;
}
O componente de erro não precisa apenas exibir um erro, ele também pode causar efeitos colaterais useEffect
.
Como o erro é definido / desabilitado depende do seu aplicativo. Vamos usar o seu exemplo de número de telefone.
1. Se a verificação de validade for uma função pura, isso pode ser feito no redutor.
Você definiria ou desabilitaria o campo de erro em resposta às ações de alteração do número de telefone. Em um redutor construído com uma instrução switch, poderia ser assim.
case 'PHONE_NUMBER_CHANGE':
return {
...state,
phoneNumber: action.phoneNumber,
error: isValidPhoneNumber(action.phoneNumber) ? undefined : 'Invalid phone number',
};
2. Se os erros forem relatados pelo back-end, despache as ações de erro.
Digamos que você esteja enviando o número de telefone para um back-end que faz a validação antes de fazer algo com o número. Você não pode saber se os dados são válidos no lado do cliente. Você apenas terá que aceitar a palavra do servidor.
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],
);
O redutor deve então aparecer com uma mensagem apropriada para o erro e configurá-lo.
Não se esqueça de cancelar o erro. Você pode desativar o erro em uma ação de alteração ou ao fazer outra solicitação, dependendo do aplicativo.
As duas abordagens que descrevi não são mutuamente exclusivas. Você pode usar o primeiro para exibir erros detectáveis localmente e também o segundo para exibir erros do servidor ou de rede.