O hook useActionState
permite rastrear o estado pendente e o valor de retorno de uma função (chamada de “ação”). A função passada pode ser uma função de cliente JavaScript simples ou uma ação de servidor vinculada a uma referência no servidor. Ele aceita um initialState
valor opcional usado para a renderização inicial.
function useActionState<State>(
action: (state: Awaited<State>) => State | Promise<State>,
initialState: Awaited<State>,
permalink?: string,
): [state: Awaited<State>, dispatch: () => void, boolean];
O Hook vai retornar uma tupla com:
state
: o último estado que a ação retornoudispatch
: o método a ser chamado para despachar a ação encapsuladapending
: o estado pendente da ação e quaisquer atualizações de estado contidas
Exemplo de uso:
import { useActionState } from "react";
function Form() {
function formAction(prevState, formData){
// Ação que desejo realizar...
}
const [state, action, isPending] = useActionState(formAction, null);
return (
<form action={action}>
<input type="email" name="email" disabled={isPending} />
<button type="submit" disabled={isPending}>
Submit
</button>
{state.errorMessage && <p>{state.errorMessage}</p>}
</form>
);
}
Mas não precisa ser usado com a <form/>
import { useActionState, useRef } from "react";
function Form({ someAction }) {
const ref = useRef(null);
const [state, action, isPending] = useActionState(someAction);
async function handleSubmit() {
await action({ email: ref.current.value });
}
return (
<div>
<input ref={ref} type="email" name="email" disabled={isPending} />
<button onClick={handleSubmit} disabled={isPending}>
Submit
</button>
{state.errorMessage && <p>{state.errorMessage}</p>}
</div>
);
}