O número de bibliotecas para o React não para de crescer, e vez ou outra, algumas delas se destacam. Um bom exemplo disso é o Recoil, uma biblioteca experimental desenvolvida e utilizada pelo Facebook.
Vamos, através desse post, entender se essa comoção em torno da lib faz sentido e quais suas vantagens - e desvantagens - em relação a outras opções mais consolidadas, com o Redux e a Context API.
Assim como o Redux, Recoil é uma biblioteca de gerenciamento de estado que fornece recursos que seriam díficeis de implementar usando apenas o React.
Como muitas outras libs mais recentes, ela foi construída com TypeScript e sua última versão já suporta a linguagem.
Como eu disse na introdução, ela é um produto dos engenheiros do Facebook, que já utilizam a lib internamente antes dela ser liberada para a comunidade.
As vantagens são:
Desvatangem:
O atom é unidade do estado, ele possui uma chave única e um valor default que pode armazenar todos os tipos disponíveis no JavaScript. Podemos usar o atom no lugar dos componentes locais.
Exemplificando, podemos criar um atom com:
const usernameState = atom({
key: 'usernameState',
default: ''
});
Isso é equivalente ao usar o hook useState:
const [ username, setUsername ] = useState('')
Usamos essa função para acessar e manipular o atom.
function inputUserName() {
const [username, setUsername] = useRecoilState(usernameState);
return (
Username: <input placeholder="Digite o username" value={username} onChange={(e) => setUsername(e.target.value)} />
);
}
Usamos essa função quando desejamos acessar o atom.
function showUsername() {
const username = useRecoilValue(usernameState);
return (
Username: <span>{username}</span>
);
}
Funções que permitem modificar o estado sem ter que recriá-lo:
const userNameInUpperCaseState = selector({
key: 'userNameInUpperCaseState',
get: ({get}) => {
const username = get(usernameState);
const usernameUpperCase = username.toUpperCase();
return usernameUpperCase;
},
});
No exemplo acima pegamos o estado de usernameState
e usamos uma função para deixar o texto com letras maísculas.
Com o get
temos acesso ao atom, então podemos utilizá-lo e retornar um novo valor.
A proposta do Recoil é possuir um único RecoilRoot
na raiz, que fica sobre todos os atoms da sua aplicação. O não pertence ao componentes, mas é atualizado por ele. Isso facilita que outros utilizem e modifiquem esse estado, tornando o Recoil bem escalável.
import React from 'react';
import { RecoilRoot } from 'recoil';
function App() {
return (
<RecoilRoot>
<Home />
</RecoilRoot>
);
}
Eu particularmente fiquei muito animado com essa lib, principalmente devido a sua sintaxe super simples. Em alguns momentos ela até se assemelha ao useState!
Por estar em experimentação eu não recomendaria o seu uso em um projeto de grande escala, mas vale a pena ficarmos ligados nas próximas notícias sobre o Recoil, então fique de olho aqui no Coday.
Minhas referências para esse post foram a documentação do Recoil e esse post incrível do Thiago Marinho. Se surgirem dúvidas ou sugestões, não deixem de mandar aí nos comentários!