Pular para o conteúdo principal

3 postagens marcadas com "React"

Ver todas os Marcadores

· Leitura de 7 minutos
Anderson Marlon

Neste artigo abordaremos um assunto bastante interessante no React chamado context, que disponibiliza uma maneira de passar os dados entre a árvore de componentes sem precisar passar props manualmente em cada nível.

Imagine o seguinte cenário, você tem o nome de um usuário em um componente, só pra gente ter uma noção entre camadas, vamos chamá-los de A, B, C e D. Imagine que esse componente fez uma chamada de API no C, certo? Nós temos apenas o nome do usuário lá e não queremos ter que ficar repetindo essa chamada nos outros componentes, certo?

Ah, mas por que não? Ou por que não criamos no topo e vamos chamando até embaixo?

Vamos ao primeiro cenário. Imagine que ao invés de você fazer uma requisição pela página, você faz quatro para apenas uma página, certo? Isso é tranquilo quando se trata de um usuário, mas já pensou se a nossa aplicação tem mil acessos diários? Isso seria basicamente quatro mil requisições diária e isso é muita coisa para o banco de dados, isso sem contar as atualizações de página.

E por que não criamos a aplicação no topo e vamos chamando nas demais? Por um motivo quase que semelhante. Não tem necessidade de você chamar nas camadas A, B e D, se o usuário sequer passou por lá, imagine que você só entrou na primeira página e saiu, certo? E quando você vai ver, sem querer, você fez uma requisição na sub página que se quer o usuário entrou, é bem desgastante isso, não concorda? Ainda mais para quem vive de internet móveis.

Voltando ao Foco

Para facilitar essa comunicação, seja de A para D e D para B, por exemplo, existe o Context API do React e aí que entramos no assunto. useContext, como funciona, de onde ele vem e como ele se alimenta. Em resumo, com o Context API podemos transitar esses dados através de componentes sem que ele sejam filhos diretos desse componente.

E vamos com calma entendendo passo a passo dessa situação, porque até para mim foi muito complexo entender no começo.

Primeiro Passo

Primeiro, vamos importar e executar o método createContext

import { createContext } from 'react'

const MyContext = createContext(null)

Inicialmente definimos ele como null, já que queremos ele vazio e não queremos definir um tipo para ele ainda.

DICA: O retorno do createContext é um componente, por isso é legal salvar numa variável em PascalCase, as famosas { }

Segundo Passo

Já que criamos ele vazio, como iremos adicionar dados a esse novo contexto que criamos?

Dentro do Provider definimos que esse contexto fornecerá pros componentes descendentes, deixando isso na propriedade value.

const MyContext = createContext(null)

export default function Parent() {
const nameUser = {
name: 'Yagasaki',
}

// Outro exemplo
const nameUser = ['Yagasaki']

// Mais um exemplo
const nameUser = 'Yagasaki'

return (
<MyContext.Provider value={nameUser}>
<ComponentA />
<MyContext.Provider>
)
}

Está permitido colocar qualquer tipo de dado dentro contexto, já que ele aceita qualquer tipo, isso inclui até mesmo funções.

Terceiro Passo

Agora que sabemos como criar um contexto, como adicionar dados a ele, como faremos para usar esse contexto como a gente bem entender?

Infelizmente não iremos usar esses dados fora do famoso pai-filho, ou seja, não adianta um componente "dinossauro" tentar acessar informações do componente "peixe" já que eles não possuem nenhum parentes, é diferente do famoso "dinossauro" para "galinha", deu para entender a analogia? Componentes que estão fora da árvore deles não possuem acesso, simples.

Mas como vamos acessar esses dados?

Primeiramente precisamos importa uma ou duas coisas, sendo: O Hook useContext do React e o Hook que a gente criou em outro arquivo. Abaixo está um exemplo de como iremos usar o useContext a nosso favor.

import { useContext } from 'react'

import MyContext from './MyContext.js'

export default function ComponentC() {
const userContext = useContext(MyContext)

return (
<div>
<p>{userContext.name}</p>
</div>
)
}

O seu retorno será exatamente a mesma informação que inserimos ali em cima na propriedade value. Assim podemos obter o dado diretamente do provider sem NENHUM componente intermediário! Economizando um esforço que seria praticamente enorme para transitar esse dado abaixo por todos os componentes intermédios! Simplesmente DEMAIS!

DICA: Note que obtemos o valor do nome como uma propriedade de userContext, isso porque no exemplo, criamos como um objeto na propriedade value, e esse mesmo objeto foi retornado da execução do useContext. Se for outro tipo de dado, o retorno será correspondente!

Modificando o valor

Beleza, já criamos o provider, que vem do inglês de provedor, aquele que provê algo, providencia. Conseguimos inserir algo nele e acessamos ele através de um componente distante, e agora? Agora vamos aprender a modificar esse valor, manipular essa informação. Lembra que eu mencionei acima que ele aceita QUALQUER tipo de dado, inclusive funções? Então, e se por exemplo a gente usasse um useState nele?

Você deve se perguntar porque iriamos querer fazer isso, certo? Imagine que você está numa página de edição de usuário e quer que os dados desse usuário já estejam preenchidos quando o usuário entrar na página, como que a gente faz?

A ideia é o seguinte, vamos isolar a variável que a gente está passando para a propriedade value para facilitar a leitura e deixar um pouco mais organizado, okay? Nada de muito novo que fizemos aqui, é claro que estamos levando em consideração que ele é um objeto. Iremos apenas adicionar o valor do state e seu dispatch na variável providerValue e assim, inserimos no provider.

const MyContext = createContext(null)

export default function Parent() {
const [name, setName] = useState('Yagasaki')
const providerValue = {
name,
setName,
}

return (
<MyContext.Provider value={providerValue}>
<ComponentA />
</MyContext.Provider>
)
}

Ficou confuso? O que fizemos a mais foi apenas adicionar o nome das duas variáveis que usamos no useState para assim que chamarmos de volta podermos manipular ele também dentro do componente, caso ao contrário, só precisariamos enviar o name e ele ficaria somente leitura, tendo que ser alterado apenas na página Parent

Dessa forma podemos alterar o valor da variável name a partir de qualquer componente que quisermos, como eu mencionei anteriormente, isso acaba sendo bem útil quando precisamos atualizar o valor de uma variável em ambos os lados, bacana né?

Olha como ficou o componente filho quando utilizamos o useState para passar a informação:

import { useContext } from 'react'
import MyContext from './MyContext.js'

const ComponentA = () => {
const userContext = useContext(MyContext)

function handleChange(event) {
const { newName } = event.target.value;

if (true) {
// Alguma verificação, se necessário
}

userContext.setName(newName)
}

return (
<div>
<label>
Usuário: {userContext.name}
<input type="text" value={userContext.name} onChange={handleChange}/>
</label>
</div>
)
}

export default ComponentA

Só tome cuidado com loops infinitos, em casos de formulário, use o form onSubmit={(e) => e.preventDefault()}, assim, evitará de atualizar a página quando o usuário clicar em enviar, por exemplo, e claro, caso esteja usando um form.

Fico muito agradecido que você tenha chegado até aqui, levou um pouco de tempo para construir esse artigo, já que tentei deixar o mais direto e bem explicado possível para você entender de fato como funciona o Contexto, já que eu levei muito tempo para realmente entender como ele funciona.

Feedback no meu Twitter/X (@Yagasaki7K) são sempre bem vindos e espero que você que se dedicou a ler e entender esse artigo tenha aprendido algo novo.

Muito obrigado!

· Leitura de 3 minutos
Anderson Marlon

"Se você é um desenvolvedor React, provavelmente já deve ter ouvido falar sobre o Create-React-App (CRA). Por anos, ele tem sido a escolha padrão para inicializar e configurar projetos React. No entanto, recentemente, o time do React anunciou que não recomenda mais o uso do CRA."

O padrão da indústria já não era mais o CRA por algum tempo, que foi substituído pela performance imbatível do Vite aliado ao seu suporte nativo ao TypeScript, isso até mesmo para mim, passei a utilizar o Vite pelo bundle ser bem menor e mais rápido de criar.

O CRA é uma ferramenta de linha de comando que ajuda a criar um novo projeto React com uma configuração padrão. Ele vem com todas as dependências necessárias e um ambiente de desenvolvimento configurado prontos para serem utilizados. Por outro lado, o Vite é um construtor de projetos que se concentra na eficiência de desenvolvimento em ambientes de desenvolvimento modernos. Ele é projetado para ser mais rápido e mais leve do que o CRA.

Mas por que o Vite está se tornando a nova escolha padrão para projetos React? Vamos dar uma olhada em algumas das principais diferenças entre essas duas ferramentas.

  • Mais rápido e mais leve do que o Create-React-App
  • Usa o esbuild para compilação, que é significativamente mais rápido do que o webpack
  • Permite que os desenvolvedores construam e recarreguem projetos mais rapidamente
  • Projetado para trabalhar com outras tecnologias modernas, como o TypeScript e o Vue.js (Vite e Vue.js têm o mesmo criador, Evan You)
  • Possui um ambiente de desenvolvimento mais moderno e atualizado
  • Suporta HMR (Hot Module Replacement) para atualizações de módulo mais rápidas durante o desenvolvimento
  • Permite importações dinâmicas com melhor suporte a tipos para otimização de carregamento de módulos
  • Oferece uma experiência de desenvolvimento mais suave e produtiva em geral.

Outra diferença importante é a forma como eles lidam com a inicialização do projeto. O CRA cria uma configuração padrão para o projeto, o que significa que você tem menos controle sobre a estrutura do projeto, tendo que ejetá-lo para fazer qualquer configuração personalizada. O Vite permite que você escolha como deseja configurar seu projeto, dando aos desenvolvedores mais flexibilidade e controle.

Em resumo, o Vite se tornou a escolha padrão para projetos React. Ele é mais rápido, mais leve e mais flexível do que o CRA, e é projetado para trabalhar com outras tecnologias modernas. Se você ainda não experimentou o Vite, agora é a hora de dar uma chance e ver como ele pode ajudar a melhorar sua eficiência de desenvolvimento.

· Leitura de 2 minutos
Anderson Marlon

"Zeno Rocha imaginou aquilo que todo desenvolvedor front-end estava cansado de tentar desenvolver."

Zeno Rocha imaginou aquilo que todo desenvolvedor front-end estava cansado de tentar desenvolver. Ou até mesmo sair das antigas semânticas do HTML que já estão para lá de ultrapassados.

Quando o assunto é email marketing, já sabemos a dificuldade que isso é para muita gente, isso inclui principalmente o CSS já que não temos o CSS-grid ao nosso lado e dependemos de tables para todos os lados.

Zeno foi a frente e já deu seu primeiro pontapé em desenvolver layouts de email marketing usando React e Typescript, dessa forma, produzimos emails mais profissionais e com cara de big techs.

A imagem acima é um exemplo de layout produzido como um convite para ingressar em um projeto da Vercel, mas usando a estilização e o modelo direto do React Email.

Interessante o profissionalismo que ele propaga e como isso torna tudo muito bem produzido e mais bonito, não é mesmo?

Em breve ~ com base na data da produção desse artigo ~ Zeno estará produzindo a versão live preview, dessa forma você poderá fazer testes diretamente no browser ao invés de enviar centenas de e-mail testes para avaliar e conferir os debugs.

Mais informações você poderá estar acompanhando a documentação do projeto original através desse link.