Como Fazer Função Async useEffect

Uma das coisas mais comuns enquanto desenvolvemos em React com Hooks é a utilização do useEffect.
Basicamente, com ele podemos executar alguma função no momento em que estamos carregando a página ou quando ocorre alteração de alguma variável que estamos assistindo.

Mas por padrão, o React não aceita que essa função useEffect seja do tipo async.
Como podemos fazer então para realizar um fetch dentro do useEffect e aguardar o resultado?

IIFE

Uma das maneiras que você pode fazer é usar uma IIFE (Immediately Invoked Function Expression):

1
2
3
4
5
6
useEffect(() => {
(async () => {
const users = await getUsers();
setUsers(users);
})();
}, []);

Função externa

Você pode criar uma função por fora do escopo da classe ou função do seu componente React:

1
2
3
4
5
6
7
8
9
10
11
12

const fetchUsers = () => {
// Código para buscar usuários
}
function Users() {
const [users, setUsers] = useState([]);

useEffect(()=> {
await fetchUsers();
setUsers(users);
}, []);
}

Seguindo uma dessas formas, você evita alguns problemas de looping e o ESLint também não reclama!