Repository: he4rt/react4noobs Branch: master Commit: 34bfa70e8613 Files: 56 Total size: 282.2 KB Directory structure: gitextract_q5zlpq2x/ ├── README.md └── docs/ ├── Bibliotecas de utilidade/ │ ├── 1-Lodash.md │ └── 2-Storybook.md ├── Cliente GraphQL/ │ ├── 1-Conceito.md │ └── 1.1-Desmistificando-200.md ├── Cliente REST/ │ ├── 1-Fetch.md │ └── 2-Axios.md ├── Controle de estado/ │ ├── 1-API-de-Contexto copy.md │ ├── 2-Redux.md │ └── 3-Zustand.md ├── Design Patterns/ │ └── 1-Compound Components.md ├── Estilizacao/ │ ├── 2.0.Tailwindcss.md │ ├── 3.0.CSS-in-JS.md │ └── 3.1-styled-components.md ├── Ferramentas de build/ │ ├── 1-npm-yarn.md │ ├── 1.1-O-que-são-dependências.md │ ├── 2-Webpack.md │ └── 3-Vite.md ├── Iniciando com React/ │ ├── 1-Introducao.md │ ├── 2-O que e React.md │ ├── 2.1-iniciando um projeto react.md │ ├── 3-JSX e Babel.md │ ├── 4-Componentizacao.md │ ├── 4.1-FormasDeDeclarar.md │ ├── 4.2-Propriedades.md │ ├── 5-Estados.md │ ├── 6-Ciclo-de-vida.md │ ├── 7-Manipulando Eventos.md │ ├── 8-React Hooks.md │ ├── 8.1-useState.md │ ├── 8.2-useEffect.md │ ├── 8.3-useContext.md │ ├── 8.4-useRef.md │ ├── 8.5-useReducer.md │ ├── 8.6-useMemo.md │ ├── 8.7-useCallback.md │ ├── 9-React Error Boundaries.md │ ├── Controlled-vs-uncontrolled-components.md │ ├── Listas-no-react.md │ ├── Refs.md │ └── Renderizacao-condicional.md ├── Performance/ │ └── Lazy Loading em React e Nextjs.md ├── README.md ├── Renderizacao no Servidor/ │ └── 1-Nextjs.md ├── Roteamento/ │ ├── README.md │ ├── React-Router/ │ │ ├── 1-Introducao.md │ │ └── 2-Rotas-customizadas.md │ └── TanStack-Router/ │ ├── 1-Introducao.md │ ├── 1.1-Type-Safety.md │ ├── 2-Rotas-customizadas.md │ ├── 3-Layouts.md │ ├── 4-Caching.md │ └── 5-DevTools.md ├── Testes/ │ ├── 1-testes-unitarios.md │ └── 2-testes-de-integracao.md └── Verificadores de Tipo/ └── Typescript.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================
Explore a documentação »
Reporte um erro
·
Solicite um conteúdo
·
Contribua com o repositório
Made with 💜
================================================ FILE: docs/Bibliotecas de utilidade/1-Lodash.md ================================================ [](https://github.com/he4rt/4noobs) # _Lodash ## O que é o Lodash Por mais que seja divertido implementar do zero aquela função cheia de malabarismos que demonstram todo seu conhecimento em ciência da computação, às vezes a gente precisa de rapidez, eficiência, performance e modularidade o mais rápido possível. Para resolver este problema, eu lhes apresento: [Lodash](https://lodash.com). Lodash é uma biblioteca Javascript que possui várias funções que são frequentemente utilizadas por quem desenvolve software com JS. ## Instalando o Lodash A melhor forma instalar o Lodash é usando um gerenciador de pacotes. Na pasta do seu projeto, utilize um dos dois comandos (conforme o gerenciador de pacotes que você está utilizando): ```bash npm install --save lodash # ou yarn add lodash ``` No seu código, dentro do arquivo desejado, você pode importar o lodash: ```js import _ from "lodash" ``` **Nota**: usar `_` para nomear o pacote é apenas uma convenção da comunidade que utiliza o lodash. Você pode utilizar o nome que preferir. ## Categorias O Lodash tem 13 categorias de funções: - Array - Collection - Date - Function - Lang - Math; - Number; - Object; - Seq; - String; - Util; - Properties; - Methods. ## Algumas funções Utilizar o lodash é super simples, pois funciona como qualquer outro objeto em javascript. Nesse artigo, utilizaremos as funções mais conhecidas, mas você pode checar a [documentação](https://lodash.com/docs/4.17.15) para mais exemplos. --- ### Contexto Vamos supor que você acaba de ser contratado e ainda está conhecendo o sistema no qual vai trabalhar. As pessoas estão te passando algumas pequenas tasks. Existe uma tabela na interface da aplicação que está sendo desenvolvida, e enviado para esta tabela, nós temos o seguinte [array de objetos](https://www.freecodecamp.org/portuguese/news/tutorial-de-arrays-de-objetos-em-javascript-como-criar-atualizar-e-percorrer-objetos-em-lacos-usando-metodos-de-array-do-js/): ```js const devDepartment = [ { id: 1, firstName: "kendrick", lastName: "lamar", salary: 4500, age: 22, level: "jr" }, { id: 2, firstName: "ada", lastName: "lovelace", salary: 12000, age: 59, level: "sr" }, { id: 3, firstName: "childish", lastName: "gambino", salary: 4800, age: 49, level: "jr" }, { id: 4, firstName: "cardi", lastName: "b", salary: 9700, age: 32, level: "pl" }, { id: 5, firstName: "david", lastName: "glover", salary: 10000, age: 31, level: "pl" }, { id: 7, firstName: "leonardo", lastName: "daVinci", salary: 1200, age: 31, level: "jr" }, { id: 4, firstName: "cardi", lastName: "b", salary: 5700, age: 32, level: "jr" }, { id: 6, firstName: "chico", lastName: "science", salary: 15000, age: 46, level: "sr" }, ]; ``` Te passaram algumas tasks para manipular apenas o array enquanto fazem seu onboarding. Agora chega de papinho e vamos botar a mão na massa! ### capitalize Como você pode notar, todos os nomes estão com a primeira letra minúscula. É legal fazer isso para fins de normalização da informação, mas não queremos mostrar assim para o usuário. Então sua primeira task é deixar a primeira letra de todos os nomes em maiúsculo. Felizmente, com o lodash, isso ficar mais simples do que já é: ```js const capitalizedDevDepartment = devDepartment.map((worker) => ({ ...worker, firstName: _.capitalize(worker.firstName), lastName: _.capitalize(worker.lastName) })); ``` No trecho de código acima nós usamos o map para gerar uma nova lista! Aqui [iteramos](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Loops_and_iteration) sobre os elementos da lista `devDepartment`, e para cada elemento, nós adicionamos a informação já existente do funcionário usando o [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax) e sobrescrevemos o primeiro e segundo nome pelo retorno da função `capitalize()` aplicada aos valores antigos. Pareceu complicado na explicação, mas se você não entendeu, olhe o código novamente e pense em cada operação que ele está executando. Pronto! Resolvido. Temos todos os nomes começando com letra maiúscula. Nosso lista está assim: ```js [ { id: 2, firstName: "Ada", lastName: "Lovelace", salary: 12000, age: 59, level: "sr" }, { id: 5, firstName: "David", lastName: "Glover", salary: 10000, age: 31, level: "pl" }, { id: 4, firstName: "Cardi", lastName: "B", salary: 9700, age: 32, level: "pl" }, { id: 4, firstName: "Cardi", lastName: "B", salary: 9700, age: 32, level: "pl" }, { id: 3, firstName: "Childish", lastName: "Gambino", salary: 4800, age: 49, level: "jr" }, { id: 7, firstName: "Leonardo", lastName: "DaVinci", salary: 1200, age: 31, level: "jr" }, { id: 1, firstName: "Kendrick", lastName: "Lamar", salary: 4500, age: 22, level: "jr" }, { id: 6, firstName: "Chico", lastName: "Science", salary: 15000, age: 46, level: "sr" }, ]; ``` Pode mover o card dessa task e enviar o pull request. Vamos para a próxima! --- ### orderBy Agora você precisa implementar um filtro de ordenação na lista de funcionários. O usuário deve ser capaz de **ordenar os funcionários pelo salário.** A lodash nos oferece o `orderBy` para resolver esse problema: ```js const workersOrderedBySalary = _.orderBy(capitalizedDevDepartment, 'salary', 'desc') ``` No snippet acima, nós estamos ordenando a lista `capitalizedDevDepartment` de forma decrescente, utilizando a chave `salary` como parêmetro de ordenação. Então nós armazenamos o [retorno da função](https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Building_blocks/Return_values) na constante workersOrderedBySalary. E dessa forma você consegue a lista anterior ordenada do maior salário para o menor: ```js [ { id: 6, firstName: "Chico", lastName: "Science", salary: 15000, age: 46, level: "sr" }, { id: 2, firstName: "Ada", lastName: "Lovelace", salary: 12000, age: 59, level: "sr" }, { id: 5, firstName: "David", lastName: "Glover", salary: 10000, age: 31, level: "pl" }, { id: 4, firstName: "Cardi", lastName: "B", salary: 9700, age: 32, level: "pl" }, { id: 4, firstName: "Cardi", lastName: "B", salary: 9700, age: 32, level: "pl" }, { id: 3, firstName: "Childish", lastName: "Gambino", salary: 4800, age: 49, level: "jr" }, { id: 1, firstName: "Kendrick", lastName: "Lamar", salary: 4500, age: 22, level: "jr" }, { id: 7, firstName: "Leonardo", lastName: "DaVinci", salary: 1200, age: 31, level: "jr" }, ]; ``` Já pode rodar a pipeline de produção, galera. Essa aqui foi fácil! --- ### uniqWith & isEqual Ao subir o código para produção, o cliente nota um problema: ele só tem 7 funcionários nesse departamento, mas estão aparecento 8. Você já deve ter notado o problema, certo? O funcionário de ID 4 e firstName "Cardi", está duplicado! Esse é um problema simples de resolver, mas com o lodash fica ainda mais fácil. **Você vai combinar duas funções do lodash: `uniqWith` e `isEqual`**. ```js const normalizedWorkersList = _.uniqWith(workersOrderedBySalary, _.isEqual) ``` Nessa curtia linha de código o Lodash está trabalhando bastante. Em resumo, a função `uniqWith` faz a comparação entre dois elementos de cada vez, utilizando um **comparador**, que no nosso caso é a função `isEqual()`. A função `isEqual` será invocada com dois itens como argumento, o elemento da vez (othVal), e os outros elementos que serão comparados(arrVal). Assim, todos os valores são comparados com todos os outros valores, livrando a lista de toda duplicação. Tá vendo como o Lodash abstrai bastante a complexidade dessas operações? Foi tão fácil que nem parece que a gente tá trabalhando. Agora nosso array de objetos está assim: ```js [ { id: 6, firstName: "Chico", lastName: "Science", salary: 15000, age: 46, level: "sr" }, { id: 2, firstName: "Ada", lastName: "Lovelace", salary: 12000, age: 59, level: "sr" }, { id: 5, firstName: "David", lastName: "Glover", salary: 10000, age: 31, level: "pl" }, { id: 4, firstName: "Cardi", lastName: "B", salary: 9700, age: 32, level: "pl" }, { id: 3, firstName: "Childish", lastName: "Gambino", salary: 4800, age: 49, level: "jr" }, { id: 1, firstName: "Kendrick", lastName: "Lamar", salary: 4500, age: 22, level: "jr" }, { id: 7, firstName: "Leonardo", lastName: "DaVinci", salary: 1200, age: 31, level: "jr" }, ]; ``` Existem formas até mais fáceis de resolver esse problema, como, por exemplo, utilizando a função `uniqBy` do lodash. Mas eu quis mostrar esse exemplo para demonstrar que você pode compor funções do lodash à vontade. Que tal tentar resolver esse mesmo problema utilizando o uniqBy? Cheque a [documentação](https://lodash.com/docs/4.17.15#uniqBy). --- ### groupBy Outra feature que o cliente te pediu, é que o usuário possa agrupar os funcionários pelo seu nível. Como sempre, a Lodash deixa essa tarefa mamão com açúcar. Vamos ao exemplo: ```js const workersGroupedByLevel = _.groupBy(normalizedWorkersList, 'level') ``` Aqui nós indicamos que queremos gerar um objeto a partir da lista `normalizedWorkersList` e agrupar os elementos a partir da key `level`. Com apenas uma linha, nós temos todos os funcionários agrupados pelo nível de senioridade. Nosso array de funcionários agora é um objeto, e está assim: ```js { sr: [ { id: 6, firstName: "Chico", lastName: "Science", salary: 15000, age: 46, level: "sr" }, { id: 2, firstName: "Ada", lastName: "Lovelace", salary: 12000, age: 59, level: "sr" }, ], pl: [ { id: 5, firstName: "David", lastName: "Glover", salary: 10000, age: 31, level: "pl" }, { id: 4, firstName: "Cardi", lastName: "B", salary: 9700, age: 32, level: "pl" }, ], jr: [ { id: 3, firstName: "Childish", lastName: "Gambino", salary: 4800, age: 49, level: "jr" }, { id: 1, firstName: "Kendrick", lastName: "Lamar", salary: 4500, age: 22, level: "jr" }, { id: 7, firstName: "Leonardo", lastName: "DaVinci", salary: 1200, age: 31, level: "jr" }, ], } ``` Agora pode pedir um aumento! --- ## Conclusão Se você chegou até aqui, você já tem ótimos exemplos e uma boa justificativa para utilizar o Lodash. Muitas vezes as abstrações criadas pelo Lodash não serão o bastante para o caso que você precisa tratar, mas certamente esses momentos serão raros. É uma biblioteca que casa muito bem com o jeito funcional de pensar que o React trás enquanto framework. Um exercício muito interessante de fazer é **tentar implementar todas essas funções do zero**. Isso vai te dar uma boa ideia da complexidade que o lodash resolve. Além disso, tentar ler o código que eles produzem é uma ótima forma de aprender também, este é o link para o repositório open source deles: [Lodash](https://github.com/lodash/lodash). Bons estudos! [](https://github.com/he4rt/4noobs) ================================================ FILE: docs/Bibliotecas de utilidade/2-Storybook.md ================================================ [](https://github.com/he4rt/4noobs) # Storybook ## O que é o Storybook [**Storybook**](https://storybook.js.org/) é uma ferramenta de desenvolvimento que permite criar e testar componentes de interface de usuário (UI) de forma isolada. É amplamente utilizada em projetos de desenvolvimento front-end para criar bibliotecas de componentes reutilizáveis e garantir a consistência visual e funcionalidade dos componentes antes de integrá-los em um projeto maior. ### Design System Quando alinhado a um Design System, o Storybook potencializa a criação de interfaces consistentes e reutilizáveis. Essa adição destaca os principais benefícios e a sinergia entre o Storybook e um Design System, proporcionando uma visão clara de como eles trabalham juntos para melhorar o desenvolvimento de interfaces de usuário. Aqui vai um exemplo: - [Atomium](https://github.com/juntossomosmais/atomium) - [Atomium StoryBook](https://juntossomosmais.github.io/atomium/?path=/docs/introduction--docs) ## Instalando o Storybook ```bash npx storybook@latest init # ou yarn dlx storybook@latest init ``` O comando acima fará as seguintes alterações em seu ambiente local: 📦 Instalará as dependências necessárias.Made with 💜
[1]: https://www.howtographql.com/ [2]: https://docs.github.com/en/graphql/overview/explorer [3]: https://graphql.org/ [4]: https://www.redhat.com/pt-br/topics/api/what-is-graphql [5]: https://developer.mozilla.org/pt-BR/docs/Glossary/REST [6]: https://developer.mozilla.org/pt-BR/docs/Glossary/API [7]: https://github.com [8]: https://graphql.org/foundation/members/ [9]: https://github.com/orgs/graphql/people [10]: https://lindnercenterofhope.org/blog/feeling-blue-vs-being-depressed-what-is-the-difference/ [11]: https://diariodovale.com.br/colunas/qual-a-cor-da-felicidade/ ================================================ FILE: docs/Cliente GraphQL/1.1-Desmistificando-200.md ================================================ # Desmistificando o retorno 200 do Graphql Precisamos fazer uma viagem pela história do HTML, antes de desmistificar o retorno do Graphql. O década é de 1990, e o http (Hypertext Transfer Protocol) começa a ser difundido mundialmente. E endereços como www.ig.com.br começam a surgir e com eles uma série de recursos podem ser acessados e interpretados por browsers. ## O procotolo HTTP ### Protocolo Primeiro precisamos enteder o que é um protocolo. Protocolo é uma camada de abstração que define um mecanismo de comunicação entre dois pontos. Imagina que você acaba de conhecer uma pessoa na rua, você olha para ela e diz: "Olá!" Você acabou de usar um protocolo para comunicar com a pessoa. Se ela estiver ciente do protocolo ela provavelmente vai reconhecer a mensagem e responder. Da mesma forma funcionam os computadores, existem vários protocolos para executar diferentes tarefas. ### HTTP O protocolo utilizado para buscar recursos na web é o http (Hypertext Transfer Protocol). Vamos pegar um recurso como exemplo: http://api.sotops.com.br/images/nudedodaniel.jpg E quebrá-lo em partes: http://: Protocolo api: Maquina no servidor sotops: Servidor com: nameServer comercial br: nameServer brasileiro images: Pasta no servidor nudedodaniel.jpg: arquivo no servidor Quando você acessa essa página, o browser irá buscar o recurso e enviará uma requisição para o servidor. Primeiro procura por um servidor que seja responsável por recursos no br e lá pergunta sobre onde está o responsável por recursos comerciais. Ao encontrar os recursos comerciais, pergunta onde está o servidor sotops. Ao encontrar o servidor sotops, pergunta qual maquina no servidor é responsável pela api. Ao encontrar a máquina api, requisita o arquivo nudedodaniel.jpg na pasta images. Dentro do pacote de requisição não existe nada, apenas cabeçalhos com a informação dela em si, como o endereço de quem requisitou o recurso. Agora imagina que algums erros podem ocorrer nessa requisição, como por exemplo: - Ao chegar no servidor ele diz que o endereço no cabeçalho não tem autorização para acessar o recurso, então o protocolo retorna um código de resposta `HTTP 403`. - Vamos supor que a pasta images existe, mas o arquivo não existe, então o protocolo retorna um código de resposta `HTTP 404`. - Vamos supor que ocorre um erro no servidor, entao o protocolo retorna um código de resposta `HTTP 500`. - Vamos supor que tudo ocorre bem e você consegue acessar o recurso. Então o protocolo retorna um código de resposta `HTTP 200`. Por uns bons anos o protocolo http foi utilizado dessa forma, mas com o passar do tempo e a modernização do desenvolvimento web e com o advento do REST, a forma como o protocolo http foi entendi mudou. E ele se tornou reponsável não só pelo que está em seu nome "TRANSFER", mas colocaram dentro do protocolo também tudo aquilo que podia ou não acontecer "dentro" do servidor. E com isso o protocolo http ficou responsável não só para ser utilizado para transferir arquivos, mas também pode ser utilizado para fazer requisições ao servidor e responsável por analisar tudo aquilo que acontece internamente no servidor. Quando por exemplo você faz um `put` em um usuario com email inválido, o servidor altera o protocolo e faz com que ele responda `HTTP 400`, ou seja, o servidor não conseguiu fazer o `put` do usuario com email inválido. Se você analisar pela perspectiva de um protocolo de transferência, o mais "correto" é que ele respondesse um 200, uma vez que o protocolo não é responsável pelo conteúdo da requisição mas pela TRANSFERENCIA dela. Quando você recebe uma pizza de calabresa na sua casa com peperoni, a responsabilidade é do entregador ou do restaurante? O que você pode fazer é pedir que o entregador devolva a pizza para o restaurante com a `mensagem` de que o sabor da pizza estava incorreto. Quando perguntado se ocorreu tudo bem ao transferir a pizza para a casa do cliente o motorista vai dizer que sim, mas que ele tem uma mensagem de que a pizza não tinha o sabor correto. E por que isso é importante para o graphql? ## Requisições graphql Vamos usar como exemplo a requisição de usuário que temos no capítulo de conceito. Mas dessa vez vamos utilizar requisições multiplas, ou seja, ao inves de fazer apenas uma requisição para o backend eu vou fazer duas, ao mesmo tempo. ```graphql query{ q1:user(id: 1){ id name post { id title } } q2: user(id: 2){ id name post { id title } } ``` Agora imagina que o usuário de id:1 existe, mas o usuário de id:2 não. Portanto eu teria um http 200 para o primeiro e um 404 para o segundo. E ai vem a pergunta de um milhão, qual reponse eu dou para meu cliente? Por isso o graphql fez com que o protocolo http voltasse as suas origens e ficasse responsável apenas pela transferência de dados, não pelo conteúdo dos dados. Pelo conteúdo dos dados a responsabilidade fica no mensagem da resposta, que normalmente feita em json. Um exemplo de resposta: ```json { "error": { "q1": {}, "q2": {} }, "data": { "q1": {}, "q2": {} } } ``` Uma resposta típica graphql sempre contem um objeto com dois objetos dentro. Um deles o `error` responsável por dizer o que houve de errado com a requisição. E o outro `data` responsável pelos dados da requisição. Dentro de cada um desses objetos poderemos ter separadamente cada uma das queries e suas respectivas respostas.Made with 💜
[1]: https://www.howtographql.com/ [2]: https://docs.github.com/en/graphql/overview/explorer ================================================ FILE: docs/Cliente REST/1-Fetch.md ================================================ ## O que é o Fetch? [Fetch][1] é uma biblioteca nativa dos *browsers* para executar requisições HTTP. Usamos *Fetch* para requerer dados de um servidor na Web, que pode servir desde páginas HTML, arquivos CSS, JS, PDF, entre outros, até informações por meio de uma [*API*][2]. Quando a requisição é atendida, a aplicação decide o que faz com o que recebeu, sendo erro ou não. O Fetch é o sucessor do [*XMLHTTPRequest*][3], que também é nativo nos navegadores e, assim como o *Fetch*, provê ao código da aplicação uma forma de transferir dados entre o *browser* (cliente) e um servidor. *XMLHttpRequest* era usado constantemente na programação de [*AJAX*][4]. Como estamos falando do *ReactJS*, que é executado nos navegadores, *Fetch* não precisa ser instalada, por ser nativa. É importante dizer que, no ambiente [*nodejs*][5], isso não é verdade, e para poder usar a mesma ideia do *Fetch*, é necessário importar a biblioteca [*node-fetch*][6]. ## Requisições HTTP ### Recurso Uma requisição HTTP possui regras bem definidas para que possamos executá-las, e assim usar os dados da resposta à essa requisição. Para poder fazer uma requisição com a biblioteca *Fetch*, devemos informar pelo menos o **recurso** que queremos acessar e coletar dados. Esse recurso é, normalmente, a URL de algum serviço exposto na Web. Se a sua requisição tiver apenas a URL, *Fetch* subentende que o **método** `GET` deve ser usado para a requisição, assim como toda chamada que fazemos de um navegador. Ou seja, quando você faz uma pesquisa no Google, você está fazendo uma requisição HTTP com método `GET`. :wink: ## Método Como dissemos, precisamos informar o método na requisição para coletar dados desse recurso. Existem vários métodos e [aqui][7] vai a lista completa deles. Vamos nos concentrar nos mais usados e suas respectivas funções: - `GET`: solicitar dados de um determinado recurso, por exemplo a página do Google; - `POST`: assim com o `GET`, mas podemos passar dados no corpo na requisição; - `DELETE`: apagar dados ou arquivos do serviço. - `PUT`: alterar recursos já existentes ou criar um recurso inexistente no serviço Web; - `PATCH`: parecido com o `PUT`, mas altera dados específicos. Normalmente os serviços Web executam verificações (autorização, permissão, etc.) nas requisições que recebem, ou seja, elas são tratadas quando chegam. Portanto, é necessário que o serviço implemente o método, para que seja possível usá-lo. Por exemplo, o Google retorna erro quando tentamos executar uma requisição o método `DELETE`. ```shell foo@bar:~$ curl -X DELETE google.com405. That’s an error.
The request method DELETE is inappropriate for the URL /.
That’s all we know.
foo@bar:~$
```
### Status Codes
Quando fazemos uma requisição, recebemos a resposta da mesma, que também contém muita informação, e uma delas é o *status code*, que serve para informar para a aplicação o que aconteceu com sua requisição. Alguns [exemplos][12]:
- `200`: "Tudo certo com o seu pedido";
- `201`: "Seu pedido foi aceito e foi criado na API";
- `400`: "Não deu para entender seu pedido, pode ser que há uma falha na ;estrutura nele";
- `404`: Muito famoso por dizer que não encontrou o que você pediu.
A lista completa dos *status codes* HTTP você vê [aqui][8]. Recomendamos tornar a experiência mais divertida e, para isso o site [*http cats*][9] pode ajudar. Lá você pode ver o título de cada status com gatos.

## Como usar o Fetch
Como dissemos, a requisição HTTP a ser executada pelo navegador precisa de algumas informações para sua execução. A estrutura básica de uma requisição usando *Fetch* é a seguinte:
```js
const fetchResponsePromise = fetch(resource [, init])
```
- `resource`: a url que a requisição vai chamar. Por exemplo: http://www.example.com
- `init`: um objeto **opcional**, no qual configuramos de forma mais detalhada a requisição. Todos os detalhes sobre esse objeto [aqui][10].
Como o *Fetch* já é carregado por padrão no browser, usar o *Fetch* fica fácil. Você pode executar as chamadas diretamente no seu código:
````js
...
fetch("https://swapi.dev/api/people/1/")
.then(res => res.json())
.then(
(result) => {
console.log(result);
},
(error) => {
console.error(error);
}
)
...
````
O *Fetch* também pode estar em algum dos métodos do seu componente React:
````js
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
error: null,
isLoaded: false,
items: []
};
}
componentDidMount() {
fetch("https://api.example.com/items")
.then(res => res.json())
.then(
(result) => {
this.setState({
isLoaded: true,
items: result.items
});
},
(error) => {
this.setState({
isLoaded: true,
error
});
}
)
}
render() {
const { error, isLoaded, items } = this.state;
if (error) {
return
Made with :purple_heart:
[1]: https://developer.mozilla.org/pt-BR/docs/Web/API/Fetch_API/Using_Fetch [2]: https://pt.wikipedia.org/wiki/Interface_de_programa%C3%A7%C3%A3o_de_aplica%C3%A7%C3%B5es [3]: https://developer.mozilla.org/pt-BR/docs/Web/API/XMLHttpRequest [4]: https://developer.mozilla.org/pt-BR/docs/Web/Guide/AJAX [5]: https://nodejs.org [6]: https://github.com/node-fetch/node-fetch [7]: https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Methods [8]: https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Status [9]: https://http.cat/ [10]: https://developer.mozilla.org/pt-BR/docs/Web/API/WindowOrWorkerGlobalScope/fetch [11]: https://pt-br.reactjs.org/docs/faq-ajax.html [12]: https://external-preview.redd.it/VIIvCoTbkXb32niAD-rxG8Yt4UEi1Hx9RXhdHHIagYo.jpg?width=960&crop=smart&auto=webp&s=5d890e52d9f9a0ed647b3ff217cf226536a1f651 ================================================ FILE: docs/Cliente REST/2-Axios.md ================================================ ## O que é o Axios? Axios é uma biblioteca criada com o intuito de realizar conexões HTTP de maneira dinâmica. ## Como instalar o Axios Para instalar, digite um dos comandos abaixo: > npm install axios > yarn add axios ## O conceito de API para o Axios Primeiramente, devemos compreender que o termo API é muito amplo e tem inúmeras funções. O axios faz uma ponte entre a sua aplicação e uma API. Você pode pensar nele como um garçom entre você e a cozinha, levando o seu pedido e trazendo o seu prato de comida. ## Regras de uma API HTTP Antes de colocamos a mão no código devemos saber que uma API HTTP tem regras. Dependendo da situação será necessário usar um método **X** e em outro momento **Y**. Então, que tal conhecer esses métodos? `GET`: Com o método GET solicitamos dados de um recurso específico `POST`: Com o método POST podemos realizar interações na API `DELETE`: Com esse método podemos apagar dados via API `PUT`: Com esse método podemos alterar dados da API. Ele atualiza recursos já existentes ou pode criar um recurso inexistente `PATCH`: Esse método é parecido com o `PUT`. No entanto, ele altera dados específicos Exemplos: `GET`: Listar todos os usuários registrados `POST`: Registrar um novo usuário `DELETE`: Apagar um ou mais usuários `PUT`: Alterar os dados de um usuário, caso não encontre o usuario ele é criado. `PATCH`: Alterar um dado do usuário, como por exemplo a senha Tambem existem outros métodos que não são usados tanto em uma API. Caso queira dar uma conferida numa lista completa, [clique aqui](https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Methods). Alem dos métodos apresentados, temos os status da API. Eles servem para informar para o desenvolvedor o que aconteceu com sua requisição. Por exemplo: `201`: Seu pedido foi aceito e foi criado na API `200`: Tudo certo com o seu pedido `400`: Não deu para entender seu pedido, pode ser que há uma falha na estrutura nele `404`: Muito famoso por dizer que não encontrou o que você pediu Como são vários, recomendamos o site **http cats**. Lá você pode ver o título de cada status de um jeito divertido e com muitos gatos. [Clique aqui](https://http.cat/) ### Como usar o Axios Então chega de teoria, e vamos praticar o uso do axios?. Para esse exemplo criaremos um novo arquivo com o nome de `api.js` ````js import axios from 'axios'; const API = axios.create({ baseURL: 'link da API' }) export default API; ```` Nesse arquivo iremos criar nosso componente que ficará responsável por interagir com a API. Feito isso, podemos ir para o arquivo que queremos que tenha uma interação entre o front-end e o back-end. ```js import React, { useState } from 'react'; import api from 'api'; export default function Register() { const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); async function handleRegister(e){ e.preventDefault(); const data = { name, email, password, }; try { const response = await API.post('users', data) console.log('Registrado com sucesso '); } catch (error) { alert(`Erro ao Registrar`); console.log(error); } }; return (Made with :purple_heart:
================================================ FILE: docs/Controle de estado/1-API-de-Contexto copy.md ================================================ # API de Contexto Quando estamos trabalhando em um projeto React, aprendemos que os dados trafegam sempre de pai para filho (via props). Em algumas situações, replicar essa passagem de props em vários níveis acaba se tornando repetitivo e extremamente verboso. A API de Contexto (Context API) serve exatamente nesse caso. Ela fornece uma forma de compartilhamento de dados entre todos os componentes dentro de sua árvore, sem que o desenvolvedor precise escrever a passagem de props entre os níveis. ## Quando usar? Você gostaria de personalizar as cores do seu sistema baseado em uma escolha do usuário. Para isso, você escreve um componente para o usuário escolher a cor e o coloca na sua aplicação. ```jsx function App() { const [userColor, setUserColor] = React.useState('#3DB7F4'); returnOlá mundo colorido
Made with :purple_heart:
================================================ FILE: docs/Controle de estado/2-Redux.md ================================================ # Redux "Redux é um "container" de estado previsível para aplicativos JavaScript. Ele ajuda a escrever aplicativos que se comportam de forma consistente, pode ser executado em ambientes diferentes (cliente, servidor e nativo) e fáceis de testar. Além disso, ele fornece uma ótima experiência para o desenvolvedor, como edição de código em tempo real combinado com um depurador em tempo de execução. Você pode usar o Redux junto com o React ou com qualquer outra biblioteca/Framework Front-end. É compacto (2kB, incluindo dependências), mas tem um grande ecossistema de "add-ons" (componente de software que adiciona novas funcionalidades ou características) disponíveis." - definição traduzida do site https://redux.js.org/introduction/getting-started ## O que é o Flux? Primeiramente precisamos entender como funciona a arquitetura do Redux, no caso entender primero o que é a arquitetura Flux. Flux é uma arquitetura criada pelo Facebook como solução alternativa ao padrões de arquitetura usuais como por exemplo MVC, para solucionar problemas de controle de estados, na época um problema constante do Facebook era as notificações que não atualizavam o seu estado de forma correta. Essa arquitetura tem como conceito o princípio do fluxo unidirecional tendo 4 (quatro) estados Action, Dispatcher, Store e View, dessa forma o usuário provoca algum evento que gera uma "Action" especifica, essa "Action" vai acionar um "Dispatcher" que comunica ao "Store" a necessecidade de mudar algum dado e por fim envia um evento para que seja mostrado na "View" a alteração realizada. veja abaixo no diagrama uma vizualização da arquitetura:
- créditos: https://facebook.github.io/flux/docs/in-depth-overview/
Perceba também que nessa estrutura a View também podem gerar novas "Actions" para os "Dispatchers" e retornar o fluxo do ínicio, veja abaixo no diagrama essa interação:
- créditos: https://facebook.github.io/flux/docs/in-depth-overview/
Apenas vou fazer algumas observações sobre características do Flux, os estados da aplicação são mutáveis, possuí apenas um único "Dispatcher" e possuí multiplos "Store".
## Como Funciona o Redux
Agora que entendemos a arquitetura do Flux, vamos entender como funciona o Redux, que é baseado no Flux, mas não é completamente igual a ele. Primeiro de tudo temos a "Action", "Reducers", "Store" e "React", essa é a estrutura do Redux, nela já observamos que temos de igual algumas coisa e outras não.
No geral tudo funciona bem parecido mas existem diferenças importantes, os "Reducers" são equivalente ao "Dispatcher" com uma diferença não existe um único "Reducers" e sim pode haver 1 (um) ou mais deles, a "Store" é igual com a diferença que só existe uma em vez de várias "Stores", o "React" é igual a "View" mas como estamos aplicando em React ela tem esse nome, e as "Actions" possuem a mesma função e da mesma forma que no Flux. Abaixo temos um diagrama comparando o funcionamento do Flux com o Redux:
Made with :purple_heart:
================================================ FILE: docs/Controle de estado/3-Zustand.md ================================================ # Zustand O Zustand é um dos menores gerenciadores de estado para React encontrado atualmente. Ele possui um tamanho de 1.17kB, sendo assim menor do que o Redux (2kB) e o Jotai (2.73kB) por exemplo. É de fácil utilização por se prover de conceitos da arquitetura flux, utilizada pelo Redux, de maneira mais simplificada. # Instalação Você pode instalar o zustand através do npm ou yarn: ```bash # NPM npm install zustand # Yarn yarn add zustand ``` # Como ele funciona Assim como no Redux, o Zustand funciona com uma única "store" onde serão armazenados os estados necessários a sua aplicação. Primeiramente criamos a nossa `store`: ```js import { create } from 'zustand' const useStore = create((set) => ({ bears: 0, increasePopulation: () => set((state) => ({ bears: state.bears + 1 })), removeAllBears: () => set({ bears: 0 }), })) ``` Como podemos ver no código acima, a nossa `store` é um `hook` onde temos: 1. O estado e o seu valor inicial -> `bears: 0` 2. Função para acrescentar 1 ao valor do estado atual -> `increasePopulation` 3. Função onde é zerado o valor do estado -> `removeAllBears` Agora com a "store" criada e suas "actions" podemos utilizá-la nos respectivos componentes: ```jsx function BearCounter() { const bears = useStore((state) => state.bears) returnMade with :purple_heart:
================================================ FILE: docs/Design Patterns/1-Compound Components.md ================================================ # O Que é Compound Components? O Compound Components é um padrão avançado em React. Tem como objetivo criar um design mais flexível, permitindo o compartilhamento de estado e lógica entre um grupo de componentes. Onde a comunicação entre o componente pai e os componentes filhos devem ser feitas de maneira flexível. Os componentes devem trabalhar juntos para realizarem algum comportamento sem criar árvores de props embaraçosas ou uma lógica complexa demais para ser refatorado ou compreendido futuramente. Esse padrão nos ajuda a eliminar inflamações de props, onde temos que passar uma árvore de props entre os componentes. Essa injeção de props é um problema, pois pode causar vários re-renders desnecessários a cada estado que for atualizado, já que cada estado irá atualizar todos os componentes filho. Temos um exemplo de Compound Components na estrutura do `select` e `option` das tags em HTML: ```jsx ```  O `select` funciona como um gerenciador de estados da inferface, enquanto o `option` são configurados em como o `select` deve funcionar. # Exemplo utilizando Compound Components Neste exemplo, vamos criar um `Modal`, que é dividida em dois componentes compostos: `Toggle` e `Content`. Onde vão compartilhar o estado de abrir e fechar o modal entre eles. Vamos ver como seria criar esse componente passo a passo: 1. Podemos começar criando a context responsável por gerênciar o state de abrir e fechar o modal ```jsx import { createContext, useState } from 'react' export const ModalContext = createContext() export const ModalStorage = ({ children }) => { const [isOpen, setIsOpen] = useState(false) return (conteúdo do modal
Compound Components é dahora! /o/
Made with 💜
================================================ FILE: docs/Estilizacao/2.0.Tailwindcss.md ================================================ # Tailwind > Sumário: > > - [Iniciando com Tailwind](#iniciando-com-tailwind) > - [Pros e Contra](#pros-e-contra) > - [Extensões de Auxílio](#extensões-de-auxílio) > - [Conclusão](#conclusão) # Iniciando com Tailwind O Tailwind é um framework CSS que traz a possibilidade de usarmos classes utilitárias prontas em nossas estilizações. Mas o que são essas classes utilitárias, afinal? Elas são classes que têm como escopo uma única propriedade do CSS, como `color` ou `width`, por exemplo. Por isso, você pode ver o Tailwind sendo descrito por aí como **utility-first**; isso o faz diferente de outros frameworks, como o Bootstrap, que são **component-first**. Por quê? Bem, com o Tailwind, você define o estilo de seus componentes do zero a partir das classes utilitárias, enquanto com o Bootstrap, você parte de um estilo pré-definido que já possui configurações para diversas propriedades CSS em uma única classe. Eu sei, pode parecer estranho e bagunçado, mas fica calmo que vou te mostrar como as coisas são mais simples do que você pensa. Vamos dar uma olhada em um exemplo: ```jsx export default function Home() { return (
Made with 💜
================================================ FILE: docs/Estilizacao/3.0.CSS-in-JS.md ================================================ # CSS-in-JS > 🔥 **Tá com pressa?** pega o resumo: > 1. [O que é](#o-que-é-css-in-js) > 2. [Vantagens](#quais-vantagens-as-bibliotecas-de-css-in-js-fornecem) > 3. [Bibliotecas](#quais-as-principais-bibliotecas) > 3.1 💅 [Styled Components](#-styled-components) > 3.2 📦 [CSS Modules](#-css-modules) > 3.3 👩🎤 [Emotion](#-emotion) > 4. [Na prática com Styled Components](#na-prática-com-styled-components) > 5. [Conclusão](#conclusão) > 9. [Referências](#referências) ## O que é CSS-in-JS? É um conceito, uma coleção de ideias para resolver problemas complexos com CSS. Não é uma biblioteca em particular, então cada implementação pode focar em um subconjunto diferente de problemas usando abordagens diferentes. Todas elas têm em comum o fato de resolver os problemas usando APIs ao invés de convenções (normalmente a solução adotada em padrões CSS) e alavancam o JS como linguagem de escrita de estilos. O objetivo do CSS-in-JS, no geral, é abstrair a complexidade de lidar com uma implementação de mais baixo nível, e evitar a troca de contexto. > ⚠️ **Mas atenção!** Usar uma biblioteca em JavaScript para estilizar seu app não vai te livrar de entender o fundamental de CSS, beleza? #### CSS-in-JS te permite... - Escrever CSS usando sintaxe de JavaScript - Aproveitar as vantagens do JS (funções, condicionais, variáveis, estados, ...) - Aproveitar as vantagens de qualquer coisa do ecossistema JS #### CSS-in-JS *não* vai te livrar de entender... - Como estilos são aplicados no DOM - Como funciona herança - Como funcionam as propriedades de CSS - Como funcionam os layouts em CSS #### E onde entra o JS? Para tirar um bom proveito desse paradigma, é importante conhecer os [tipos de dados em JS](https://github.com/ThiagoDellaNoce/javascript4noobs/blob/master/4_Basico/3_Tipos-de-dados.md). Também, para ir além, é bom conhecer os operadores [matemáticos](https://github.com/ThiagoDellaNoce/javascript4noobs/blob/master/4_Basico/5_Operadores-Aritmeticos.md), [lógicos](https://github.com/ThiagoDellaNoce/javascript4noobs/blob/master/4_Basico/6_Operadores-Logicos.md), [condicionais](https://github.com/ThiagoDellaNoce/javascript4noobs/blob/master/4_Basico/7_Condicionais.md), [spread](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_syntax), [destructuring](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Atribuicao_via_desestruturacao), [módulos](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/M%C3%B3dulos) e [etc](https://github.com/ThiagoDellaNoce/javascript4noobs/tree/master/4_Basico) > ⚠️ **Mas não te assusta!** Essas coisas vêm com a prática. Elas são do JavaScript, então, é natural que *possam* ser utilizadas em uma biblioteca CSS-in-JS, mas não quer dizer que é *obrigatório* usá-las. --- ## Quais vantagens as bibliotecas de CSS-in-JS fornecem? As bibliotecas te permitem escrever CSS sem se preocupar com o efeito cascata (**C** do CSS). Também resolvem os problemas de especificidade, de dar nomes aos seletores, de seguir uma convenção de nomenclatura (*BEM CSS, estou olhando para você*), e todos os demais perrengues vindos de usar uma outra linguagem (*linting*, garantir consistência na estrutura de pastas, ferramentas de build). Além disso, outras abstrações comumente implementadas em bibliotecas CSS-in-JS são: - Eliminação de código morto (sem uso) - O código vai dar erros (incluindo sintaxe, tipagem, *undefined*) - Suporte a temas - Estilos dinâmicos (com base em `props`, por exemplo) - Estilos são "escopados" a um componente específico - Otimizações de performance como gerar o _CSS crítico_ sem necessidade de configuração adicional --- ## Quais as principais bibliotecas? A última edição da pesquisa [State of CSS](https://2019.stateofcss.com/) constatou que a biblioteca mais popular é a [Styled Components](https://github.com/styled-components/styled-components), seguida por [CSS Modules](https://github.com/css-modules/css-modules) e [Styled JSX](). Já as mais apreciadas são [Emotion](https://github.com/emotion-js/emotion), [CSS Modules](https://github.com/css-modules/css-modules) e [Styled Components](https://github.com/styled-components/styled-components). Vamos entender melhor como essas três funcionam? | Critério | Cálculo | | ---------- | ------------------------------------------------------------- | | Awareness | Total de Respostas - Nunca ouviu falar / (Total de Respostas) | | Interest | Interessado / (Interessado + Não interessado) | | Satisfação | Usaria novamente / (Usaria novamente + Não usaria novamente) | ## 💅 [Styled Components](https://github.com/styled-components/styled-components) Utilizando [tagged template literals](https://www.styled-components.com/docs/advanced#tagged-template-literals) e [o poder do CSS](https://www.styled-components.com/docs/api#supported-css), `styled-components` permite escrever código CSS para estilizar os componentes. Também remove o mapeamento entre estilos e componentes, permitindo que se use componentes como construção de estilos de baixo nível de forma fácil. `styled-components` é pensado para aprimorar CSS para estilizar sistemas de componentes React. Ao nos levar em conta um único caso de uso, foi possível otimizar a experiência para devs e também a saída para os usuários finais. Além da experiência aprimorada para devs, os componentes estilizados fornecem: - **CSS crítico automático:** `styled components` controla quais componentes são renderizados em uma página e injeta seus estilos e nada mais, de forma totalmente automática. Combinado com a divisão de código, isso significa que seus usuários carregam a menor quantidade de código necessária. - **Nenhum erro de nome de classe:** os componentes com estilo geram nomes de classe exclusivos para seus estilos. Você nunca precisa se preocupar com duplicação, sobreposição ou erros ortográficos. - **Exclusão mais fácil de CSS:** pode ser difícil saber se um nome de classe é usado em algum lugar em sua base de código. `styled components` torna isso óbvio, já que cada detalhe do estilo está vinculado a um componente específico. Se o componente não for usado (que as ferramentas podem detectar) e for excluído, todos os seus estilos serão excluídos com ele. - **Estilo dinâmico simples:** adaptar o estilo de um componente com base em seus adereços ou um tema global é simples e intuitivo sem ter que gerenciar manualmente dezenas de classes. - **Manutenção fácil:** você nunca precisa procurar em arquivos diferentes para encontrar o estilo que afeta seu componente, portanto, a manutenção é muito fácil, não importa o tamanho de sua base de código. - **Prefixo automático:** escreva seu CSS de acordo com o padrão atual e deixe que `styled components` cuide do resto. Você obtém todos esses benefícios enquanto escreve o CSS que conhece e adora, apenas vinculado a componentes individuais. > 🔥 **Na prática:** [mais adiante](#na-prática-com-styled-components) você verá a biblioteca em mais detalhes, como instalar, como usar, e suas capacidades ```jsx const Button = styled.button` color: grey; `; ``` Também podem ser usados [objetos de estilo](https://styled-components.com/docs/advanced#style-objects), o que permite migrar gradualmente layouts existentes em *CSS inline*, já fornecendo o suporte aos recursos mais avançados. ```jsx const Button = styled.button({ color: 'grey', }); ``` Os dois estilos acima são equivalentes. Styled Components é também compatível com React Native. ### 📦 [CSS Modules](https://github.com/css-modules/css-modules) Um **Módulo CSS** é um arquivo CSS no qual todas as classes e animações são escopadas localmente por padrão. Todas as `url(...)` e os `@import`s são feitos da mesma forma que se requisita um módulo em JS. CSS Modules compila para um formato intermediário chamado [ICSS](https://github.com/css-modules/icss), mas são escritos na forma padrão. ```css /* style.css */ .error { background-color: red; } ``` Ao importar um Módulo CSS em um módulo JS (um componente, por exemplo), é exportado um objeto com mapeamentos de nomes locais (que você escreveu) para nomes globais (que o módulo gerou). ```jsx import styles from "./style.css"; // import { className } from "./style.css"; const btn = ; ``` ## 👩🎤 [Emotion](https://github.com/emotion-js/emotion) Emotion fornece uma composição de estilo poderosa e previsível, além de uma ótima experiência de desenvolvedor com recursos como _source maps_, _labels_ e utilitários de teste. Ambos os estilos de string e objeto são suportados. O Emotion possui duas formas de uso, uma agnóstica de framework e outra específica para trabalho com React. ### Forma agnóstica de framework: ```jsx import { css, cx } from 'emotion' const color = 'white' render(Made with :purple_heart:
================================================ FILE: docs/Estilizacao/3.1-styled-components.md ================================================ # Na prática com Styled Components Esse exemplo [está na documentação](https://styled-components.com/docs/basics#installation) 😄 ## Instalação ```bash npm install styled-components -- ou -- yarn add styled-components ``` > ⚠️ **Observação:** é altamente recomendado, mas não obrigatório, utilizar o [plugin do Babel](https://styled-components.com/docs/tooling#babel-plugin). Algumas vantagens são nomes de classes mais legíveis, SSR, bundle menor, e outros. ### Iniciando `styled-components` usa [tagged template literals](https://www.styled-components.com/docs/advanced#tagged-template-literals) para estilizar os componentes. Essa abordagem elimina completamente o mapeamento entre estilo e componente. Ou seja, quando você define um estilo, você está criando um componente normal do React. O exemplo abaixo cria dois componentes e usa eles. ```jsx // Cria um componente Title, um h1 com estilos const Title = styled.h1` font-size: 1.5em; text-align: center; color: palevioletred; `; // Cria um componente Wrapper, uma section estilizada const Wrapper = styled.section` padding: 4em; background: papayawhip; `; // Use-os como você usaria qualquer outro componente render(Made with :purple_heart:
================================================ FILE: docs/Ferramentas de build/1-npm-yarn.md ================================================ # NPM e Yarn O npm e o yarn são um gerenciador de pacotes, com ele é possível criar bibliotecas js e disponibilizá-las para a comunidade, além de poder incluir outras bibliotecas externas na sua aplicação. Não iremos nos aprofundar muito no npm nesta seção, apenas explicar o básico sobre como instalar o React com a utilização do mesmo. Se quiser um estudo mais profundo sobre npm, cheque a seção npm no [node4noobs](https://github.com/anabastos/node4noobs/blob/master/contents/1-primeiros-passos/npm.md). # Create-react-app O Create React App é uma ferramenta para criar projetos em React com o intuito de facilitar a configuração da aplicação. ## Instalação Com o npx do npm iremos executar o seguinte comando para criar a aplicação. Ou podemos utilizar o Yarn para fazermos o mesmo processo. ```cmd npx create-react-app react4noobs -- ou -- yarn create react-app react4noobs ``` Aguarde alguns minutos para que o npm baixe as dependências. O create react app irá gerar todo o projeto em modo padrão, não é necessário configurar **ferramentas** como Babel ou Webpack, eles estarão pré-configurados por debaixo dos panos. Ao abrir seu package.json você encontrará três scripts, são eles: | Comando | Rodando com NPM | Rodando com Yarn | | ------- | --------------- | ---------------- | | start | npm start | yarn start | | build | npm run build | yarn build | | eject | npm run eject | yarn eject | O **start** iniciará a aplicação de acordo com os componentes desenvolvidos no */src*. E uma tela no navegador irá se abrir:
Quando você alterar qualquer arquivo e salvar, eles serão recompilados e a janela do navegador será atualizada. Caso algum erro ocorra, ele aparecerá em vermelho no console.
O **build** é utilizado para enviar a aplicação para "produção".
Como isso acontece? Ao executá-lo o babel transpila a aplicação automaticamente e todo o app será mandado para uma pasta */build* fora da */src* em arquivos estáticos, e então seu arquivo estará pronto para ser colocado em produção.
O **eject** é interessante, inicialmente o create-react-app empacota e esconde os módulos do npm que ele está usando por debaixo dos panos, para que o *package.json* seja mais limpo e simples. Porém se você quiser começar a adicionar configurações mais complexas e instalar outros módulos, seus módulos atuais precisam saber quais são os módulos existentes. Então ao executar o **eject** ele não esconderá mais esses módulos, e eles estarão disponíveis no seu *package.json*.
Por fim, não é sempre necessário utilizar o create-react-app para criar o seu projeto, você também pode criar o seu projeto na mão, do zero. Porém como o curso tem o foco para inciantes, isso seria um assunto para conversarmos no futuro.
---
Vamos olhar agora um pouco sobre [dependências](./1.1-O-que-são-dependências.md).
Made with :purple_heart:
================================================ FILE: docs/Ferramentas de build/1.1-O-que-são-dependências.md ================================================ # O que são dependências Dependências são todos os pacotes que seu projeto necessita ter instalado para que possa ser executado de maneira correta. Em outras palavras, todos os módulos (pacotes) de terceiros que utilizamos em nosso projeto, se tornam dependências, já que sem eles, a corretude e funcionamento da nossa aplicação estaria comprometida. Por padrão o react já vem com várias dependências se iniciarmos o projeto com *create-react-app*, com por exemplo o [Webpack](./../Ferramentas%20de%20build/2-Webpack.md). Mas sempre podemos adicionar outras dependências. ## Como instalamos dependências Isso vai depender de qual gerenciador de pacotes você está utilizando (npm, yarn ou outros). No NPM ou Yarn pode utilizar: ```bash npm install react-router-dom --ou-- yarn add react-router-dom ``` O método acima instala esses pacontes como dependências de produção, mas nem sempre precisamos de pacotes na produção e sim apenas no espaço de desenvolvimento, como por exemplo o *prettier* que não é utilizado em produção e sim apenas no ambiente de desenvolvimento para formatar os códigos. Para definir um pacote como apenas dependência de desenvolvimento precisamos para uma flag na hora vamos instalar o pacote. ```bash npm install prettier --save-dev --ou-- yarn add prettier --dev ``` ## Como removemos dependências As veze instalamos algumas depências e não vamos precisar ou fizemos a troca por outra solução equivalente, devemos limpar das dependências do nosso projeto esse pacote não utilizado para isso usamos ```bash npm uninstall prettier --save-dev npm uninstall react-router-dom --ou-- yarn remove prettier --save-dev yarn remove react-router-dom ``` --- Com esses comandos podemos instalar ou remover qualquer pacote que vamos adicionar ao projeto. Vamos olhar agora um pouco do [Webpack](./2-Webpack.md).Made with :purple_heart:
================================================ FILE: docs/Ferramentas de build/2-Webpack.md ================================================
Made with :purple_heart:
================================================ FILE: docs/Ferramentas de build/3-Vite.md ================================================
Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/1-Introducao.md ================================================ # Introdução Seja bem-vindo! :purple_heart: O principal objetivo é introduzir todo o conteúdo básico de React para iniciantes. Antes de começar é necessário conhecer os conceitos básicos de HTML, CSS e **principalmente** Javascript. Você pode consultar esses outros repositórios do 4noobs para aprender esses conteúdos: - [HTML](https://github.com/sorenhe4rt/HTML4Noobs) - [CSS](https://github.com/mathh95/css4noobs) - [Javascript](https://github.com/ThiagoDellaNoce/javascript4noobs) Após a pequena jornada percorrida pelo roadmap, não iremos nos aprofundar tanto sobre as tecnologias, o foco é você saber o básico de react para se aprofundar no futuro. [Ir para Próxima Seção](./2-O%20que%20e%20React.md)Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/2-O que e React.md ================================================ # React ## O que é React? O **React** é uma biblioteca Javascript utilizada para construir interfaces de usuário (UI) de uma forma reaproveitável, com a ajuda de funcionalidades específicas da mesma. Por ser uma biblioteca, a manipulação e configuração de ambientes tendem a ser mais flexíveis, além de ser 100% Javascript. Uma das principais características do React é o conceito de **componentes** que irá ser discutido ao longo do curso, porém, já te dando um pequeno _spoiler_, os componentes são uma das principais bases do React, eles existem para separar o código em pequenos arquivos que porventura serão reaproveitados em outras ocasiões da aplicação. Para escrever componentes é utilizado JSX, uma extensão de sintaxe para Javascript. Você pode consultar a documentação em PORTUGUÊS, traduzida pela comunidade, [aqui](https://pt-br.react.dev/) Parece complicado, né? Mas não se assuste! Iremos entrar em detalhes em breve. [Ir para Próxima Seção](./3-JSX%20e%20Babel.md)Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/2.1-iniciando um projeto react.md ================================================ # React ## Iniciando um projeto Como já sabemos o `React` é uma biblioteca! E para podermos utiliza-la precisamos instalar os pacotes necessários em nosso projeto. Até o ano passado, utilizavamos uma ferramenta muito conhecida chamada `create-react-app` que era fornecido pela propria biblioteca para iniciarmos nosso projeto. Ela criava uma estrutura de pastas e instalava todos os pacotes necessários para que pudessemos utilizar o React. Era algo como: ```js npx create-react-appMade with :purple_heart:
================================================ FILE: docs/Iniciando com React/3-JSX e Babel.md ================================================ # JSX O JSX é uma extensão de sintaxe para Javascript, basicamente é uma sintaxe semelhante ao XML, onde você consegue compreender de uma melhor forma como será montado o seu componente UI. O React não obriga o uso do JSX, mas geralmente utilizamos por achar prático e por ele ajudar bastante na parte visual. ## Exemplo ```js const elemento =
[Ir para Próxima Seção](./4-Componentizacao.md)
Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/4-Componentizacao.md ================================================ # Componentização ## O que é a componentização? A componentização dentro do React é um conceito bastante utilizado. Um dos seus principais objetivos é maximizar o reuso em uma aplicação. O **conceito de componentização** é uma das principais diferenças do React e de outras bibliotecas baseadas em componentes diante de bibliotecas como jQuery e Angular 1. > Componentes são conjuntos isolados de lógica (javascript), visualização (JSX/HTML) e estilização (CSS). A componentização funciona da seguinte forma, dividimos nossa interface/aplicação em pequenas partes (componentes) que sozinhas conseguem ter funcionalidades específicas. Na imagem abaixo cada área separada com uma cor diferente é um componente, podemos ter componentes dentro de outros componentes. Aliás, nossa aplicação em si é um componente.  _Fonte: [QCode](https://www.qcode.in/learn-react-by-creating-a-comment-app/)_ ## Exemplos ### Exemplo 1 - Simples Para que não fiquemos só na parte teórica, podemos exemplificar um componente simples em React. Um componente chamado `Button` que pode ser reutilizado na sua aplicação. ```js import React from "react"; export default function Button() { return ; } ``` Você deve ter percebido que o componente pode ser simplesmente uma função. O componente acima é um botão que mostra um _alert_ para o usuário quando é clicado. ### Exemplo 2 - Avançado Podemos ter diversos tipos de componentes e cada componente com sua complexidade. Na [imagem](#Dividindo-interface-em-componentes) que mostramos como podemos dividir uma aplicação em componentes, podemos mostrar de como ficaria o componente `Comment`, bora lá? ```js import React from "react"; export default function Comment() { return (
Yew, it gives you total control over how you structure your app and date flow.
Yew, it gives you total control over how you structure your app and date flow.
Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/4.1-FormasDeDeclarar.md ================================================ # Formas de declarar um componente Atualmente no React temos duas formas de declarar componentes: 1. Componentes de classe 2. Componentes de função(_Você viu este no ultimo capítulo_) ## Componentes de classe Como o próprio nome já diz, declaramos um componenente criando uma classe javascript. Para declarar precisamos: - Criar uma classe - Extender essa classe com o **React.Component**. - Adicionar o método **render()** e seu retorno. Essa função chamada **render()** é responsavel por renderizar nosso componente em tela, ela sempre deve retornar um código html. ```js import React from "react"; class Welcome extends React.Component { render() { return (Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/4.2-Propriedades.md ================================================ # Propriedades Nesse capitulo você irá aprender o que são **Propriedades** nos componentes React.Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/5-Estados.md ================================================ # Estados Neste capítulo você entenderá o que são **Estados** no React. ## O que é? Estados são dados que podem variar, sendo que essa variação pode ser causada pela ação do usuário em sua aplicação. Normalmente já trabalhamos com isso, sabe quando você faz um contador em javascript e o valor fica toda hora alterando de 0, 1, 2, 3 , 4, etc... Isso são estados. No caso do React os estados também são uma forma de verificação para a renderização, então quando esse valor (estado) é alterado causa uma nova renderização.Esse também é um dos motivos do React ser one way databinding (Significa que ele observa as mudanças por apenas um caminho para então atualizar a arvore de elementos(DOM)).
Vamos pra mais um exemplo:Suponha que tu faça uma aplicação de contador, quando tu apertar start ele sairá do 0 e ficará mudando. Vemos aqui que o estado inicial da aplicação é 0 e conforme ele vai sendo alterado o valor em tela também é.
## Como fazer no React? Bom no React temos algumas formas de lidar com isso, seja pelos hooks ou pelos componentes de classe. Como não falamos sobre hooks ainda, trabalharemos apenas com componentes de classe. Nesse exemplo vamos trabalhar apenas com um estado, porém é possivel colocar quantos quiser no objeto. ```js import React from 'react'; class Counter extends React.Component { // No contrutor de classe, criamos nossos estados através do this.state constructor(props){ super(props); this.state = { counter: 0, } } // É possivel acessar o estado com this.state.nome-do-estado render(){ return (Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/6-Ciclo-de-vida.md ================================================ # Ciclo de vida Neste capítulo você entenderá o que é **Ciclo de vida** no React. ## Introdução Quando estamos utilizando o React que tem por base a componentização, **é preciso entender como que tudo funciona para que possamos saber o que fazer e quando fazer algo.** Todos os componentes possuem um ciclo de vida que vai desde o momento em que ele aparece na tela até ele desaparecer da tela. O objetivo desse ciclo é gerenciar os recursos da aplicação, ou seja, tudo que não está em tela é "destruido" ou apagado pra poder garantir recursos para os que estão em tela. Ainda não entendeu? Vamos para um exemplo: Você tem dois componentes em tela, porém após alguma ação do usuário um dos componentes desaparece da tela. Nesse momento o React "destroi"/apaga ele da DOM para guardar recursos e garantindo que todo o resto continue funcionando. Enfim, vamos ao que interessa! O React permite que manipulemos o ciclo de vida e podemos dividir o mesmo em 3 momentos: - Montagem (Quando aparece em tela) - Atualização (Quando altera um dado em tela) - Desmontagem (Quando desaparece da tela)  ## Montagem Nesta etapa ocorre quando **nosso componente aparece em tela da primeira vez**, quando ele é colocado na DOM. Então nosso componente é renderizado em tela com todas as props que passamos para ele, todas as requisições de dados e etc. Temos três funções nesta etapa: - **componentWillMount** → Essa etapa é executada antes mesmo da montagem do componente, aqui colocamos ações das quais queremos que execute no inicio do nosso componente. Como por exemplo chamadas na API, tratamento de dados recebidos e por ai vai. > No React Hooks é ouseLayoutEffect. > Exemplo: > Para todos os exemplos utilizaremos uma biblioteca chamada Axios para lidar com asrequisições, ela possui algumas vantagens em relação a fetch api nativa do JS mas você pode utilizar o que você bem entender. ```jsx import React from "react"; import axios from "axios"; class CardPerson extends React.Component { constructor() { super(); this.state = { name: "", birthday: "", }; } // Funcão para pegar os dados async loadData() { try { // Fazemos uma requisição para algumaapi const response = await axios.get("URLDE ALGUMA API"); // Após pegar os dados setamos ele noestado this.setState({ name: response.data.name, birthday: response.data.birthday, }); } catch (error) { console.log("error"); } } componentWillMount() { loadData(); } render() { return (Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/7-Manipulando Eventos.md ================================================ # Manipulando Eventos ## Qual a diferença dos eventos do HTML para o React? Bom, de certa forma a manipulação de eventos no React é bem parecida com o padrão do HTML porém existem algumas diferenças. - Eventos são nomeados utilizando camelCase, ou seja ao invez de um espaço, barra ou traço entre as palavras, simplesmente usa letra maiuscula. (Ex: manipulandoEventos). - Graças ao JSX você passa uma função na propriedade do evento e não um texto. - No HTML podemos evitar o comportamento padrão de alguns elementos enviando false porém no React precisamos fazer isso o **preventDefault**. Exemplo 1: ```html ``` Exemplo 2: ```html ``` ```jsx // React function Form() { function handleSubmit(event) { event.preventDefault(); console.log("funfo"); } return ( ); // ou return ( ); } ``` Vale lembrar que toda função alocada a um evento recebe como parametro o evento, portando é possivel manipular da forma que deseja seu comportamento. Por exemplo: As vezes você nem quer pegar o objeto **event** inteiro, apenas o valor pra realizar sua função... A depender do componente, tudo que precisa é uma arrow function _(event) => function(event.target.value)_ ou algo do tipo. ## Consigo passar mais de um parâmetro A resposta é sim! Como disse no tópico anterior, podemos utilizar arrow functions para passar como argumento, portando tudo que precisamos fazer é utiliza-las de forma correta! Ex: ```jsx function Form() { function handleSubmit(event) { event.preventDefault(); console.log("funfo"); } return ( ); } ``` Lembra de como é feito para lidar com eventos no JS puro? Um comportamento padrão é que esses eventos ficam disponibilizados para as funções, ela passa o evento. Por exemplo, tu cria a função `handleChange()` e coloca em um `onchange` que no `React` é `onChange`. Essa função irá receber como parametro `SEMPRE` o `event`, ou seja os dados do evento. Esse comportamento é melhor de explicar com Javascript puro da seguinte forma. ```js // Pegamos o botão cont btnSave = document.querySelect('#saving'); // Adicionamos um evento para ele através do addEventListner // 1º Parametro: nome do evento // 2º Parametro: Função de callback, lembrando que sempre irá receber um event como parametro. btnSave.addEventListener('click', (event) => { }) // Tu também pode fazer o seguinte function handleClick(event){ //algo aqui dentro } btnSave.addEventListener('click', handleClick) // Outra forma é ir direto pra uma propriedade do componente. btnSave.click = handleClick; ``` Enfim, por que isso foi explicado? Lembra que o React não permite que utilizemos os mesmos nomes do HTML padrão? Apenas por camel case(ex: onchange = onChange). Porém o comportamento é o mesmo, todo onChange irá passar como `primeiro parametro` das funções o `event`. ```js import { useState } from "react"; function inputChangeComponent() { const [text, setText] = useState(""); // Recebemos o evento // Vale lembrar que após o primeiro parametro, podemos simplesmente por qualquer parametro que quisermos. function handleChange(event) { setText(event.target.value); } return ( <> > ); } ``` Outro ponto importante de destacar é: se apenas colocarmos nossa função no onchange/onChange, assim como no javascript puro irá passar o `event` como primeiro parametro. Porém também é possivel passar como segundo ou terceiro a depender da sua escolha. Vamos utilizar o exemplo do form que fizemos lá em cima. ```jsx function Form() { const id = 847875211221; function handleSubmit(event, id) { event.preventDefault(); console.log("funfo", id); } return ( // Com uso das arrow functions, fazemos uma função anônima tendo como parametro o event e em sequida chamamos nosso handleSubmit passando tanto o event quanto o id. // Lembre-se que a ordem nesse caso fica a sua escolha, se eu definisse na função que iria receber primeiro o id e o segundo seria o event daria o mesmo resultado. ); } ``` Nesse tópico você aprendeu sobre manipulação de eventos no React. Agora é praticar e estudar para poder melhorar cada vez mais. Deixo também o link da [documentação do React](https://pt-br.reactjs.org/docs/handling-events.html), para poderem ver direto da fonte. --- [Ir para Próxima Seção](../Ferramentas%20de%20build/1-npm-yarn.md)Made with :purple_heart:
================================================ FILE: docs/Iniciando com React/8-React Hooks.md ================================================ # React Hooks ## O que são Hooks Hooks são funções utilizadas para ter acesso recursos de **estado** e **ciclo de vida**, em **componentes funcionais**. Eles não podem ser utilizados em componentes de classe. Os Hooks no React são nomeados com o prefixo 'use'. Por padrão o React já fornece alguns Hooks integrados, como por exemplo o useState. Você também pode criar seus próprios Hooks para reusa-lo em outros componentes, contanto que siga as regras dos hooks. ### Observações sobre os hooks: > Não use Hooks dentro de loops, regras condicionais ou funções aninhadas (funções dentro de funções). Em vez disso, sempre use Hooks no nível superior de sua função React. Seguindo essas regras, você **garante que os Hooks serão chamados na mesma ordem** a cada vez que o componente renderizar. Agora que você tem entendimento sobre o que são os Hooks, separamos para você conteúdos falando sobre os principais e mais utilizados hooks dentro do ecossistema do React. [Ir para a próxima seção](./8.1-useState.md) ================================================ FILE: docs/Iniciando com React/8.1-useState.md ================================================ # React Hooks ## useState O _useState_ é um dos Hooks utilizados para criar estado dentro de um componente em React. O estado criado pelo _useState_ nada mais é que uma variável que o componente consegue reagir quando seu valor é atualizado. O _useState_ recebe como parâmetro o valor inicial do estado. E retorna um _array_ onde o primeiro valor é o estado atual, e o segundo valor é uma função usada para alterar o valor do estado. Esta função para alterar o estado pode receber apenas o novo estado, ou uma função que recebe o estado anterior e retorna o novo estado. Este segundo jeito é particularmente útil quando é feita mais de uma alteração de estado de uma vez, pois, como o componente é renderizado novamente assim que a primeira alteração de estado acontece, as outras alterações acabam não acontecendo corretamente. Outra utilidade é que o novo estado pode ser derivado do estado original. ### Exemplos: ```jsx import React, { useState } from "react"; function Counter() { // Cria estado 'clicks' com valor inicial 0 // Um jeito fácil de separar o retorno do useState é fazendo desestruturação de array const [clicks, setClicks] = useState(0); return ({inputState.error}
Desculpe, algo deu errado.
} // Se não houve erro, renderiza normalmente os componentes filhos return this.props.children } } // Exemplo de componente que pode gerar um erro class ComponenteComErro extends Component { render() { // Simulando um erro (isso seria geralmente uma operação que pode falhar) throw new Error('Erro simulado!') returnAlgo deu errado. Estamos trabalhando para resolver o problema!
Algo deu errado:
{error.message}
# Como utilizar uma ref para armazenar valores
Bem, como já vimos anteriormente, podemos atribuir uma `ref` a um elemento HTML. Além disso, podemos atribuir valores, sejam números, textos ou até mesmo objetos! A maior vantagem é que essas alterações não geram uma re-renderização em nossa aplicação.
### Exemplo - Contador que não mostra em tela.
```jsx
import { useRef } from 'react';
function Componente() {
const counter = useRef(0);
const updateCounter = () => {
counter.current += 1;
console.log(counter.current);
};
return (
Basicamente, não ocorre novas renderizações em tela, apenas os logs do valor sendo atualizado.
### Exemplo - Contador que pode mostrar o valor em tela.
```jsx
import { useRef, useState } from 'react';
function Componente() {
const [value, setValue] = useState(null);
const [showValue, setShowValue] = useState(false);
const counter = useRef(0);
const updateCounter = () => {
counter.current += 1;
console.log(counter.current);
};
const toggleShowValue = () => setShowValue((prevState) => !prevState);
return (
Certo, mas qual a diferença em relação ao exemplo anterior? Basicamente, como as `refs` não disparam novas renderizações, não podemos obter atualizações em tempo real na tela. Por isso, torna-se necessário utilizar estados para lidar com o mesmo.
A partir desse ponto, a imaginação é o limite! É possível fazer muitas coisas. Inclusive, na própria documentação do React (link no final do artigo), existe um exemplo de um cronômetro que utiliza o `ref.current` como um `setInterval`.
# Como passar uma ref para componentes customizados
Normalmente, quando vamos usar em nossa aplicação algum componente, como o input ou qualquer outro, criamos um componente customizado para garantir que, em todos os locais de nossa aplicação, tenhamos o mesmo design e comportamento. No caso do input, talvez em algum momento você queira usá-lo sem nenhum controle, ou seja, como um `uncontrolled component`, e para isso usaríamos as `refs` que aprendemos anteriormente. No entanto, tenho uma má notícia: não conseguiríamos usá-lo da mesma forma que antes.
```jsx
const CustomInput = ({value, label, onChange, ...rest}) => {
return {
}
}
const App = () => {
return (
Loading...
) : (Loading...
}Loading...
) : (Loading...
}Loading...
` # Conclusão Neste tópico você aprendeu sobre `Renderização condicional` no React, tenha certeza que irá utiliza-la com frequencia em seu dia a dia. Caso queira saber mais, segue o link da documentação do [React](https://react.dev/learn/conditional-rendering#conditionally-assigning-jsx-to-a-variable) Espero que tenham gostado do conteúdo, aso surja alguma duvida, sinta-se livre para entrar em contato! Então é isso, até a proxima! Seeyaaaa. [Ir para a próxima seção](./8-React%20Hooks.md) ``` ================================================ FILE: docs/Performance/Lazy Loading em React e Nextjs.md ================================================ # Introdução > Caso prefira, também escrevi esse artigo no meu [Blog](https://gabrielduete.com/pt-br/blog/art-of-lazy-loading) e no [DEV](https://dev.to/gabrielduete/the-art-of-lazy-loading-how-to-improve-your-frontend-app-performance-nextjsreact-4h5l). Lazy Loading é uma estratégia de otimização de desempenho. Com essa estratégia, garantimos que alguns recursos sejam carregados **somente quando realmente necessários**, ou seja, quando estão prestes a entrar na **área visível da página (viewport)**. ## Visão geral Por padrão, podemos usar Lazy Loading em JavaScript, CSS, fontes, imagens e iframes. Podemos definir o atributo `loading` em elementos `img` ou `iframe`, assim:  Com isso, conseguimos instruir o navegador a **adiar o carregamento** desse elemento até que ele esteja prestes a ser exibido na tela. # Lazy Loading no Next.js No Next.js, as coisas funcionam de forma um pouco diferente. Temos **duas estratégias nativas principais** para criar componentes com lazy loading, e vou adicionar mais uma que pode facilitar ainda mais nossa vida: - [Dynamic Imports (Next.js)](https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#nextdynamic) - [React Lazy (React)](https://react.dev/reference/react/lazy) - [react-lazyload (biblioteca externa)](https://www.npmjs.com/package/react-lazyload) # 1. Dynamic Imports Com os **Dynamic Imports** do Next.js, podemos importar componentes dinamicamente, algo muito útil para componentes que **não são necessários no carregamento inicial da página**. Um bom exemplo de uso é com componentes de feedback, como modais ou alertas, que só são exibidos após alguma ação do usuário. Então, por que carregá-los logo no início? Podemos importar apenas quando for realmente necessário! Veja um exemplo onde temos um botão e um componente `Snackbar` do Material UI. Após o clique, o Snackbar deve ser exibido com um aviso:  Resultado:  Podemos ver que o `Snackbar` e o `Alert` são carregados inicialmente, mas só são utilizados **se** o usuário clicar no botão. E se ele **não** clicar? O carregamento desses dois componentes se torna inútil. Vamos olhar para o tamanho do Build, especialmente o "First Load JS":  Agora, o mesmo exemplo usando **Dynamic Imports** para `Snackbar` e `Alert`:  Resultado idêntico:  Build:  Podemos ver que o tamanho do **First Load JS** caiu significativamente! - De `43 KB` para `35.6 KB` - E de `148 KB` para `141 KB` Você pode pensar: “Mas foi pouco!”. Estamos falando de **apenas uma página**, com uma funcionalidade simples. Agora imagine isso em **todo o seu site**? ### Vamos calcular o ganho total para 10 páginas: 1. **Antes da otimização:** - Tamanho por página: **43 KB** - Total: **43 KB × 10 = 430 KB** 2. **Depois da otimização:** - Tamanho por página: **35.6 KB** - Total: **35.6 KB × 10 = 356 KB** ### **Economia total** - Redução: **430 KB - 356 KB = 74 KB** - Porcentagem: **(74 ÷ 430) × 100 ≈ 17,2%** Isso mostra que, em um site com muitas páginas, pequenas otimizações podem gerar uma **grande diferença** no consumo de recursos e no tempo de carregamento. # 2. React Lazy Também podemos usar o `React.lazy`, que é uma funcionalidade nativa do React para importar componentes dinamicamente — bem parecido com os dynamic imports do Next.js. A diferença é que aqui, **precisamos usar o `Suspense`** para envolver o componente, e passar um componente no `fallback`, que será exibido **enquanto o componente está sendo carregado**. Esse carregamento ocorre **apenas na primeira vez** que o componente é usado. Se o usuário recarregar a página, será carregado novamente — mas se ele continuar navegando, não haverá novo carregamento. Exemplo:  Resultado:  Note que no primeiro clique no botão, apareceu "loading...", que é o componente definido no fallback. Build:  Houve uma **redução ainda maior** do que com os Dynamic Imports do Next.js. Porém, há um **componente de loading adicional**, o que pode impactar na experiência do usuário (UX). Por isso, **essa abordagem deve ser alinhada com o time de design e produto** — pois exibir um loading pode não ser uma boa ideia em alguns casos. É recomendável usar apenas quando o componente for **realmente pesado** ou a página estiver **muito lenta**. # 3. React-Lazyload O `react-lazyload` funciona de forma um pouco diferente. Ele **não afeta diretamente o carregamento inicial** da página, mas sim monitora **a posição dos elementos** em relação ao viewport. Quando um elemento estiver **próximo da tela**, ele será renderizado. Ou seja, podemos usá-lo para renderizar **componentes pesados à medida que o usuário rola a página**. Exemplo:  Esse código gera 15 imagens. Imagine como seria pesado carregar todas de uma vez só? Com o Lazyload, as imagens são carregadas **aos poucos**, conforme o usuário rola a página. Resultado:  Na aba “Network” do navegador, vemos que as imagens são carregadas **à medida que são exibidas** na tela. Isso traz um **grande ganho de performance**, garantindo que a internet do usuário não fique sobrecarregada. # Conclusão Vimos práticas valiosas para melhorar a performance da sua aplicação usando Lazy Loading com Next.js e React. Aprendemos que é possível **carregar componentes, imagens e iframes apenas quando necessário**, reduzindo consumo de recursos e acelerando o carregamento das páginas. Espero que as explicações tenham sido claras. Qualquer dúvida, é só me chamar para conversar. **Fique com Deus e bons estudos!** [Caso queira, explore também a seção de Design Patterns.](../Design%20Patterns/1-Compound%20Components.md) ================================================ FILE: docs/README.md ================================================ ## **Pré-requisitos** --- - Conhecimentos em construção de páginas utilizando HTML, CSS e JavaScript - Instalação do [NodeJS](https://nodejs.org/pt-br/download/) e um gerenciador de pacotes à sua preferência ([npm](https://www.npmjs.com/), [yarn](https://classic.yarnpkg.com/pt-BR/docs/install) ou [pnpm](https://pnpm.io/)) ## **Conteúdos** ### Iniciando com React - [Introdução](./Iniciando%20com%20React/1-Introducao.md) - [O que é React?](./Iniciando%20com%20React/2-O%20que%20e%20React.md) - [Iniciando um projeto React](./Iniciando%20com%20React/2.1-iniciando%20um%20projeto%20react.md) - [JSX e Babel](./Iniciando%20com%20React/3-JSX%20e%20Babel.md) - [Componentização](./Iniciando%20com%20React/4-Componentizacao.md) - [Formas de declarar](./Iniciando%20com%20React/4.1-FormasDeDeclarar.md) - [Propriedades](./Iniciando%20com%20React/4.2-Propriedades.md) - [Estados](./Iniciando%20com%20React/5-Estados.md) - [Ciclo de Vida](./Iniciando%20com%20React/6-Ciclo-de-vida.md) - [Listas](./Iniciando%20com%20React/Listas-no-react.md) - [Manipulando Eventos](./Iniciando%20com%20React/7-Manipulando%20Eventos.md) - [Refs](./Iniciando%20com%20React/Refs.md) - [Renderização Condicional](./Iniciando%20com%20React/Renderizacao-condicional.md) - [React Hooks](<./Iniciando%20com%20React/()-React%20Hooks.md>) - [useState](<./Iniciando%20com%20React/().1-useState.md>) - [useEffect](<./Iniciando%20com%20React/().2-useEffect.md>) - [useContext](<./Iniciando%20com%20React/().3-useContext.md>) - [useRef](<./Iniciando%20com%20React/().4-useRef.md>) - [useReducer](<./Iniciando%20com%20React/().5-useReducer.md>) - [useMemo](<./Iniciando%20com%20React/().6-useMemo.md>) - [useCallback](<./Iniciando%20com%20React/().7-useCallback.md>) - [Controlled vs Uncontrolled components](./Iniciando%20com%20React/Controlled-vs-uncontrolled-components.md) ### Ferramentas de build - [NPM e Yarn](./Ferramentas%20de%20build/1-npm-yarn.md) - [Dependências](./Ferramentas%20de%20build/1.1-O-que-são-dependências.md) - [Webpack](./Ferramentas%20de%20build/2-Webpack.md) - [ViteJS](./Ferramentas%20de%20build/3-Vite.md) ### Estilização - [CSS in JS](./Estilizacao/CSS-in-JS.md) - [styled-components](./Estilizacao/3.1-styled-components.md) - [Stitches]()Made with 💜
================================================ FILE: docs/Renderizacao no Servidor/1-Nextjs.md ================================================ # O que é Usando do Next.js podemos renderizar (de modo simplificado, o processo de transformar os componentes React escritos em JSX para HTML) o conteúdo da página de diferentes formas, no lado do cliente, padrão do React, chamado de _Client-Side Rendering_ (CSR), e no lado do servidor com múltiplas abordagens que serão tratadas abaixo. Por padrão o Next.js irá renderizar o máximo das páginas do projeto no lado do servidor. # Por que devemos preferir renderizar no servidor? As vantagens da renderização no servidor se dão de duas formas, (1) performance e (2) SEO. A performance se beneficia porque podemos "guardar" o HTML da página já pronto em servidores espalhados pelo mundo (CDN), isso também pode ocorrer com arquivos JavaScript porém além de serem maiores suas contrapartes em HTML, eles teriam de ser pegos pelo navegador do usuário e transformados em HTML, assim ganhamos velocidade no carregamento da página, lembrando que **quanto menos JavaScript for enviado para o cliente melhor**. Já para o SEO (Search Engine Optimization) a melhora vem do fato dos mecanismos de busca terem dificuldade em categorizar corretamente páginas que o conteúdo é gerado dinamicamente via JavaScript, então ao enviarmos HTML "preenchido" para o cliente facilitamos a indexação do nosso site em serviços como Google. Outra vantagem é por exemplo no caso do usuário ter uma conexão ruim, assim carregar pelo servidor é mais rápido que no cliente. # No lado do servidor (Server-Side Rendering - SSR) Podemos carregar dados dinamicamente, a cada request, com a função `getServerSideProps`, que deve ser exportada de uma página, dentro de um arquivo na pasta `pages`, o retorno da função é usado na população das props da página. Por exemplo, em uma rede social podemos carregar os 10 primeiros posts do feed de um usuário no lado do servidor e deixar apenas as postagens subsequentes para o navegador buscar. O SSR é, na maior parte dos casos, preferível comparado ao CSR mas ainda apresenta problemas, visto que caso alguma chamada realizada na função `getServerSideProps` leve muito tempo, o navegador irá ficar "pendurado" no request, aguardando sua resposta para mostrar o conteúdo da página ```ts // /pages/feed/index.tsx export default function Posts ({posts}) { ... // Logica da página } // Essa função será executada a cada request pela página /feed export const getServerSideProps: GetServerSideProps = async (context) => { const firstPosts = await fetchPosts() return { props: { posts: firstPosts }, }; ``` # Geração estática (Static Site Generation - SSG) Caso os dados apresentados na página não mudem, podemos carregá-los apenas uma vez, no build do projeto, e deixar o HTML completamente pronto, para isso usamos a função `getStaticProps`. Essa funcionalidade pode ser útil quando construindo, por exemplo, um blog, já que os dados não serão mudados constantemente. Essa abordagem é a mais performática, sempre que possível tente usá-la. ```ts // /pages/articles/index.tsx export default function ArticlesList ({ articles }) { ... // Logica da página } // Essa função será executada apenas uma vez, no build do projeto export const getStaticProps: GetStaticProps = async (context) => { const articles = await getArticles() return { props: { // Como a propriedade e a variável tem o mesmo nome, não precisamos // explicitar qual propriedade deve ser assimilada, equivalente a // fazermos `articles: articles` articles }, } ``` # Geração estática incremental (Incremental Static Regeneration - ISR) Caso sua página possa ser gerada em _build time_ porém o conteúdo se altera com alguma frequência podemos usar da abordagem de site estático porém que se "recarrega" em um certo intervalo de tempo, para isso passamos a propriedade `revalidate` no retorno da função `getStaticProps`, com o intervalo em segundos que a página será buildada novamente. Isso pode ser útil no caso de um e-commerce em que a página inicial tem uma sessão de itens "quentes" que mostram os itens mais vendidos nas últimas 24 horas, uma informação assim, pode facilmente ser atualizada a cada 10 minutos. Para maioria dos casos o ISR apresenta o melhor dos dois mundos, conteúdo gerado dinamicamente e alta performance, se possível seu uso é recomendado junto ao SSG. ```ts // /pages/index.tsx export default function Home ({ hotItems }) { ... // Logica da página } // Essa função será executada no build do projeto e também a cada 10 minutos export const getStaticProps: GetStaticProps = async (context) => { const trendingItems = await getTrending() return { props: { hotItems: trendingItems }, revalidate: 600 // 10 (minutos) * 60 (segundos) } ``` ================================================ FILE: docs/Roteamento/README.md ================================================ # Roteamento O roteamento é entrega de dados com base em algo, no nosso caso a nossa url. Quando você visita o **youtube.com** você está acessando a rota padrão do youtube, mas quando acessamos por exemplo **youtube.com/feed/explore** estamos acessando a rota "*feed/explore*", o explorar do youtube. Quando construimos um site podemos ter uma página home (representada normalmente pelo "/") que por padrão seria o nosso endereço, exemplo o **www.meusite.com** mas podemos ter também a rota "*/posts* "que teriam todos os posts do nosso site. ## Roteamento com react O react em si não possui um gerenciamento próprio de rotas, mas podemos utilizar bibliotecas como o React Router ou ferramentas como Next.js ou Gatsby que veremos em breve para criarmos a nossas rotas. Nesse módulo é apresentado a utilização das bibliotecas React Router e TanStack Router. 1. React Router 1. [Introdução](./React-Router/1-Introducao.md) 2. [Rotas Customizadas](./React-Router/2-Rotas-customizadas.md) 2. TanStack Router 1. [Introdução](./TanStack-Router/1-Introducao.md) 1. [Type-Safety](./TanStack-Router/1.1-Type-Safety.md) 2. [Rotas Customizadas](./TanStack-Router/2-Rotas-customizadas.md) 3. [Layouts](./TanStack-Router/3-Layouts.md) 4. [Caching](./TanStack-Router/4-Caching.md) 5. [DevTools](./TanStack-Router/5-DevTools.md)Made with 💜
================================================ FILE: docs/Roteamento/React-Router/1-Introducao.md ================================================ # React Router - Introdução > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [O que é](#o-que-é-o-react-router) > 2. [Vantagens](#algumas-vantagens-da-utilização-do-react-router) > 3. [Instalação](#como-instalar-o-react-router) > 4. [Mão no código](#iniciando-com-o-react-router) > 4.1 [Estrutura das páginas](#construindo-a-estrutura-das-páginas) > 4.2 [Estruturando as rotas](#estruturando-rotas-com-o-react-router) > 4.3 [Utilizando na aplicação](#utilizando-o-react-router-na-aplicação) ## O que é o React Router? Atualmente mantido pelo mesmo grupo de criadores do famoso framework web [Remix](https://remix.run/), o **React Router** é uma biblioteca para criação de rotas em aplicações React. Ele permite que você defina rotas para diferentes URLs em seu aplicativo e gerencie como os componentes são exibidos de acordo com essas rotas. Isso é essencial em diferentes tipos de aplicações devido à capacidade de criar e gerenciar as rotas da aplicação de maneira marcante e simples. Ele foi um dos principais pioneiros do ramo de roteamento de aplicativos de página única (SPAs) e é amplamente utilizado na comunidade do React devido a sua facilidade de uso e flexibilidade. Ele permite que você defina rotas aninhadas, gerencie parâmetros de URL e proteja rotas com autenticação e autorização. Além disso também fornece recursos como navegação programática, gerenciamento de histórico e geração de rotas dinâmicas. Ele também possui uma grande compatibilidade com bibliotecas e ferramentas externas, como [Redux](../../Controle%20de%20estado/2-Redux.md), para ajudar a gerenciar o estado global do aplicativo. Em resumo, o React Router é uma ferramenta poderosa para gerenciar a navegação em aplicativos React. ## Algumas vantagens da utilização do React Router - [x] Possui uma impecável [documentação](https://reactrouter.com/) - [x] É vastamente utilizado, entretanto obter ajuda/informações é muito fácil - [x] Possui inúmeros hooks para carregamento e gerenciamento de dados internos e externos, navegação entre páginas, obtenção de parâmetros, dentre outros ## Como instalar o React Router Para instalar o **React Router** em sua aplicação, basta utilizar algum dos comandos abaixo de acordo com o seu gerenciador de pacotes: ```BASH # Utilizando npm npm install react-router-dom # Utilizando Yarn yarn add react-router-dom # Utilizando pnpm pnpm add react-router-dom ``` ## Iniciando com o React Router Partindo para prática, no exemplo a seguir será criado uma aplicação com duas rotas, uma "Página inicial" e a página de "Sobre nós". Lembrando que a estrutura de pastas e arquivos foram apenas para uma simples exemplificação, podendo ser alterada de acordo com a necessidade/desejo do desenvolvedor. ## Construindo a estrutura das páginas Abaixo foi criado uma estrutura de exemplo para essas páginas, onde cada uma possui um header com links para as outras páginas, e um conteúdo específico para cada uma delas. ```TSX import React from 'react'; // importação do componente de âncora do React Router import { Link } from 'react-router-dom'; // ARQUIVO: pages/Home.tsx export function Home() { return (O projeto 4Noobs nasceu com o objetivo de ser um espaço onde as pessoas pudessem encontrar conteúdo de fácil entendimento em um primeiro encontro com determinado tema, promovendo uma melhor capacitação profissional. A intenção desse Open Source é que as pessoas de diferentes níveis de entendimento pudessem contribuir.
Made with 💜
================================================ FILE: docs/Roteamento/React-Router/2-Rotas-customizadas.md ================================================ # React Router - Rotas Customizadas > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [Children Routes](#criando-children-routes-subrotas) > 2. [Rotas com parâmetros](#criando-rotas-com-parâmetros) > 3. [Consumindo parâmetros](#consumindo-parâmetros-de-uma-rota) > 4. [Navegando entre rotas](#navegando-entre-rotas) > 4.1 [Hook useNavigate](#utilizando-o-hook-usenavigate) > 4.2 [Componente Link](#utilizando-o-componente-link) > 5. [Navegando para rotas anteriores](#navegando-para-uma-rota-anterior) ## Criando Children Routes (subrotas) Children routes são rotas que são aninhadas dentro de outra rota. Elas são usadas para criar hierarquias de rotas, ou seja, criar uma estrutura de rotas para a sua aplicação. Por exemplo, imagine que você tem uma aplicação com uma página "Perfil Logado" e essa página possui as seguintes opções de navegação: "Editar perfil" e "Alterar senha". Em vez de ter duas rotas diferentes para cada opção, você pode criar uma rota "Perfil" e aninhar as três opções de navegação dentro dela como children routes. Dessa forma, a rota "Perfil" seria o parent route e as outras três seriam as children routes, e ao acessar a rota "perfil", a aplicação saberia que as opções de navegação estão contidas nela, e renderizaria os componentes da rota filho correspondente. Em resumo Children routes são uma forma de organizar suas rotas de maneira hierarquica, ou seja, criando um parent route para seus componentes filho. Para criar uma children route no **React Router** é necessário inserí-las no createBrowserRouter também, assim como qualquer outra rota, como no exemplo abaixo: ```TSX // ARQUIVO: routes.ts // Importando funções do React Router import { createBrowserRouter, RouteObject } from 'react-router-dom'; // ... Importação das páginas // Criando a Parent Route const profileRoute: RouteObject = { // Note que aqui o objeto está sendo tipado, apenas utilize tipagens caso seu projeto possuir TypeScript path: '/' // Caminho da rota element:Made with 💜
================================================ FILE: docs/Roteamento/TanStack-Router/1-Introducao.md ================================================ # TanStack Router > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [O que é](#o-que-é-o-tanstack-router) > 1.1. [TypeSafety](./1.1-Type-Safety.md) > 2. [Vantagens](#algumas-vantagens-da-utilização-do-tanstack-router) > 3. [Instalação](#como-instalar-o-tanstack-router) > 4. [Mão no código](#iniciando-com-o-tanstack-router) > 4.1 [Estrutura das páginas](#construindo-a-estrutura-das-páginas) > 4.2 [Estruturando as rotas](#estruturando-rotas-com-o-tanstack-router) > 4.3 [Utilizando na aplicação](#utilizando-o-tanstack-router-na-aplicação) ## O que é o TanStack Router? Criada pelos mesmos criadores do famoso [TanStack Query](https://tanstack.com/query/latest) (antigamente chamado de `React Query`), o **TanStack Router** é um novo framework agnóstico de bibliotecas para criação de rotas de forma simples e escalável em aplicações de diversos níveis com foco em revolucionar a maneira de como são gerenciadas as rotas nessas aplicações. Uma das principais vantagens ao se utilizar essa biblioteca é o fato de possuir um poderoso gerenciamento de cache embutido em seu núcleo, assim como o [TanStack Query](https://tanstack.com/query/latest), melhorando muito mais a experiência do usuário ao navegar em sua aplicação, que por sua vez se torna mais fluida. Além disso, ela também é baseada em grandes ferramentas já conhecidas, tais como [React Router](https://reactrouter.com/), [Next.js](https://nextjs.org/) e [Remix](https://remix.run/), porém com uma base de código 100% reformulada visando performance, segurança e utilização de boas práticas do [TypeScript](https://www.typescriptlang.org/) e seu [Type-Safety](./1.1-Type-Safety.md), melhorando assim também a experiência do desenvolvedor, principalmente em aplicações grandes com diversas pessoas trabalhando ao mesmo tempo. Vale ressaltar que no momento no qual este conteúdo foi produzido (jan/2023), o framework ainda está em fase beta, entretanto novas atualizações ainda serão implementadas até a versão final, que deve ser lançada em breve. ## Algumas vantagens da utilização do TanStack Router - [x] Suporte completo ao TypeScript seguindo boas práticas com Type-Safe - [x] Cacheamento automático (ou manual caso preferir) - [x] Agnóstico de Frameworks (Por enquanto disponível apenas para React, mas sinta-se a vontade para [contribuir com novas implementações para o projeto](https://github.com/tanstack/router)) - [x] Pré-carregamento automática de rotas - [x] DevTools própria para depuração - [x] Elementos de rotas assíncronos - [x] Validação, formatação, serialização e processamento de dados com a Search Param API ## Como instalar o TanStack Router Para instalar o **TanStack Router** em sua aplicação, basta utilizar algum dos comandos abaixo de acordo com o seu gerenciador de pacotes: ```BASH # Utilizando npm npm install @tanstack/react-router@beta --save # Utilizando Yarn yarn add @tanstack/react-router@beta # Utilizando pnpm pnpm add @tanstack/react-router@beta ``` ## Iniciando com o TanStack Router Partindo para prática, no exemplo a seguir será criado uma aplicação com duas rotas, uma "Página inicial" e a página de "Sobre nós". Lembrando que a estrutura de pastas e arquivos foram apenas para uma simples exemplificação, podendo ser alterada de acordo com a necessidade/desejo do desenvolvedor. ## Construindo a estrutura das páginas Abaixo foi criado uma estrutura de exemplo para essas páginas, onde cada uma possui um header com links para as outras páginas, e um conteúdo específico para cada uma delas. ```TSX import React from 'react'; // importação do componente de âncora do TanStack Router import { Link } from '@tanstack/react-router'; // ARQUIVO: pages/Home.tsx export function Home() { return (O projeto 4Noobs nasceu com o objetivo de ser um espaço onde as pessoas pudessem encontrar conteúdo de fácil entendimento em um primeiro encontro com determinado tema, promovendo uma melhor capacitação profissional. A intenção desse Open Source é que as pessoas de diferentes níveis de entendimento pudessem contribuir.
Made with 💜
================================================ FILE: docs/Roteamento/TanStack-Router/1.1-Type-Safety.md ================================================ ## Type-Safety Type-safety em TypeScript significa que o código é verificado em tempo de compilação para garantir que os tipos de dados sejam usados de maneira consistente e correta. Isso ajuda a evitar erros comuns, como tentar usar uma função com argumentos incorretos ou atribuir uma variável a um tipo de dado incorreto. TypeScript fornece uma série de tipos de dados básicos, como números, strings e booleanos, além de suporte para tipos personalizados, como classes e interfaces. Ao usar esses tipos, você pode garantir que seu código seja mais confiável e fácil de manter. Um exemplo muito claro dos problemas que gerenciadores de rota sem type-safety podem causar é o seguinte: ```TSX // Exemplo de rota ``` Note que os parametros dessa query são extensos e podem ser facilmente confundidos, enviados no formato incorreto ou até mesmo esquecidos, gerando problemas na aplicação. ```TSX // ^ O parametro "sortBy" foi enviado incorretamente e esqueceram do "filterBy" ``` Além disso, a qualquer momento o desenvolvedor pode alterar o caminho/nome da rota e esquecer de alterar em algum outro lugar da aplicação, gerando ainda mais problemas. ```TSX // ... Rota original alterada para `clients-by` // ^ No lugar de "/clients" deveria ser "/clients-by", porém o desenvolvedor se esqueceu disso :( ``` Para resolver esses problemas, o **TanStack Router** utiliza o sistema de Type-Safety para que o desenvolvedor possa definir os parametros da rota e o tipo de dado que cada um deve receber, além de poder definir o caminho/nome da rota de forma na qual a própria IDE já acusa erros em desenvolvimento. Isso será explanado melhor no tópico de [**Rotas customizadas**](./2-Rotas-Customizadas.md).Made with 💜
================================================ FILE: docs/Roteamento/TanStack-Router/2-Rotas-customizadas.md ================================================ # TanStack Router - Rotas Customizadas > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [Children Routes](#criando-children-routes-subrotas) > 2. [Rotas com parâmetros](#criando-rotas-com-parâmetros) > 3. [Consumindo parâmetros](#consumindo-parâmetros-de-uma-rota) > 4. [Navegando entre rotas](#navegando-entre-rotas) > 4.1 [Hook useNavigation](#utilizando-o-hook-usenavigation) > 4.2 [Componente Link](#utilizando-o-componente-link) > 5. [Navegando para rotas anteriores](#navegando-para-uma-rota-anterior) ## Criando Children Routes (subrotas) Children routes são rotas que são aninhadas dentro de outra rota. Elas são usadas para criar hierarquias de rotas, ou seja, criar uma estrutura de rotas para a sua aplicação. Por exemplo, imagine que você tem uma aplicação com uma página "Perfil Logado" e essa página possui as seguintes opções de navegação: "Editar perfil" e "Alterar senha". Em vez de ter duas rotas diferentes para cada opção, você pode criar uma rota "Perfil" e aninhar as três opções de navegação dentro dela como children routes. Dessa forma, a rota "Perfil" seria o parent route e as outras três seriam as children routes, e ao acessar a rota "perfil", a aplicação saberia que as opções de navegação estão contidas nela, e renderizaria os componentes da rota filho correspondente. Em resumo Children routes são uma forma de organizar suas rotas de maneira hierarquica, ou seja, criando um parent route para seus componentes filho. Para criar uma children route no **TanStack Router** basta utilizar o método `createRoute` do parent route, como no exemplo abaixo: ```TSX // ARQUIVO: routes.ts // Importando funções do TanStack Router import { ReactRouter, createRouteConfig } from '@tanstack/react-router'; // ... Importação das páginas let rootRoute = createRouteConfig(); // Criando a Parent Route const profileRoute = rootRoute.createRoute({ path: '/profile', // Caminho da rota }); // Criando as Children Routes const editProfileRoute = profileRoute.createRoute({ path: '/edit', // Caminho da rota component: EditProfile, // Componente que será renderizado }); const changePasswordRoute = profileRoute.createRoute({ path: '/change-password', // Caminho da rota component: ChangePassword, // Componente que será renderizado }); // Adicionando as Children Routes ao Parent const profileRoutes = [editProfileRoute, changePasswordRoute]; const profileRouteConfig = profileRoute.addChildren(profileRoutes); // Adicionando as rotas ao gerenciador const routes = [profileRouteConfig]; const routeConfig = rootRoute.addChildren(routes); // ... Criação do Router ``` ## Criando rotas com parâmetros As rotas com parâmetros são aquelas que permitem passar dados dinâmicos através de sua URL. Isso é muito útil quando se deseja passar informações específicas, tal como o ID do usuário afim de exibir seu perfil e suas informações relacionadas. Imagine que você é o desenvolvedor da funcionalidade de perfil público no website da He4rt e deseja exibir a página de perfil de um usuário específico quando o usuário clicar em um nome de usuário na lista de usuários. Em vez de criar uma rota para cada usuário manualmente, você pode criar uma rota única para a página de perfil e passar o ID do usuário como um parâmetro na URL. A sintaxe para criar uma rota com parâmetros é similar a criar uma rota normal, porém o nome do parâmetro é incluído um cifrão em seu início. Por exemplo: ```TSX // ARQUIVO: routes.ts // Importando funções do TanStack Router import { ReactRouter, createRouteConfig } from '@tanstack/react-router'; // ... Importação das páginas let rootRoute = createRouteConfig(); // Criando a rota com parâmetro const viewProfileRoute = rootRoute.createRoute({ path: '/profile/$id', component: ViewProfile, }); // Adicionando a rota ao gerenciador const routes = [viewProfileRoute]; const routeConfig = rootRoute.addChildren(routes); // ... Criação do Router ``` ## Consumindo parâmetros de uma rota Para consumir os parâmetros de uma rota, você pode utilizar a função `useMatch` do **TanStack Router**. Essa função retorna um objeto que inclui parâmetros da rota, e você pode desestruturar esse objeto para obter os parâmetros que deseja. Veja o exemplo abaixo: ```TSX // ARQUIVO: ViewProfile.tsx // Importando a função useMatch do TanStack Router import { useMatch } from '@tanstack/react-router'; export function ViewProfile() { // Obtendo os parâmetros da rota const { params } = useMatch({ from: "/profile/$id", // Caminho da rota, note que se você habilitou o Type-Safe, já irá se auto-completar }); // Desestruturando os parâmetros const { id } = params; return ( // Renderizando o ID do perfilMade with 💜
================================================ FILE: docs/Roteamento/TanStack-Router/3-Layouts.md ================================================ # TanStack Router - Layouts > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [Definição](#o-que-são-layouts-aplicado-no-contexto-de-rotas) > 2. [Estrutura das páginas](#construindo-a-estrutura-das-páginas) > 3. [Estrutura do Layout](#construindo-a-estrutura-do-layout) > 4. [Estruturando as rotas](#estruturando-rotas-com-o-tanstack-router) ## O que são Layouts aplicado no contexto de rotas? Os Layouts são elementos geralmente utilizados para definir a estrutura padrão numa aplicação, componentes nos quais são comuns em várias páginas do aplicativo, como por exemplo o cabeçalho e o rodapé, que são usados como um container para outros componentes que representam o conteúdo específico de cada página. No **TanStack Router** isso é feito utilizando um truque o componenteO projeto 4Noobs nasceu com o objetivo de ser um espaço onde as pessoas pudessem encontrar conteúdo de fácil entendimento em um primeiro encontro com determinado tema, promovendo uma melhor capacitação profissional. A intenção desse Open Source é que as pessoas de diferentes níveis de entendimento pudessem contribuir.
); } ``` ## Construindo a estrutura do Layout Abaixo foi criado uma estrutura de exemplo para um Layout, que representa o cabeçalho replicado nas páginas. ```TSX // ARQUIVO: layouts/RootLayout.tsx export function RootLayout() { return ( <> {/* Esse header será replicado para as sub rotas da Parent Route que você colocar o Layout */}Made with 💜
================================================ FILE: docs/Roteamento/TanStack-Router/4-Caching.md ================================================ # TanStack Router - Caching > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [Aplicação do cache na web](#como-o-caching-é-aplicado-em-aplicações-web) > 2. [Vantagens do caching](#vantagens-do-caching-no-tanstack-router) ## Como o caching é aplicado em aplicações web? Caching em aplicações web é uma técnica utilizada para armazenar dados em memória, a fim de aumentar a velocidade de acesso, diminuir a carga no servidor e melhorar a experiência do usuário com consistência na fluidez. Quando um usuário acessa uma rota específica em uma aplicação web, os dados e informações sobre a página podem ser armazenados em cache, permitindo que as solicitações subsequentes sejam carregadas mais rapidamente, sem a necessidade de recarregar todos os dados do servidor. Isso pode melhorar significativamente o desempenho e a experiência do usuário. ## Vantagens do Caching no **TanStack Router** - [x] Obsolência enquanto revalidado - [x] Utilização de Max-age - [x] Auto invalidação - [x] Garbage collection - [x] Auto-carregamento de páginas - [x] Amigável com cache externo [Ir para Próxima Seção](./5-DevTools.md)Made with 💜
================================================ FILE: docs/Roteamento/TanStack-Router/5-DevTools.md ================================================ # TanStack Router - DevTools > 🔥 **Tá com pressa?** Se liga no sumário: > 1. [O que é](#o-que-é-um-devtools) > 2. [Instalação](#como-instalar-o-tanstack-devtools) > 3. [Criando a instância do DevTools](#criando-a-instância-do-devtools) > 3. [Utilizando o DevTools na aplicação](#utilizando-o-devtools-na-aplicação) ## O que é um DevTools O DevTools é um conjunto de ferramentas de desenvolvimento, os de navegadores web são um ótimo exemplo e são um dos tipos de DevTools mais conhecidos, permitindo aos desenvolvedores inpecionar, depurar e modificar o código de uma página web em tempo real. O DevTools é uma ferramenta valiosa para desenvolvedores para testar e otimizar seus sites e aplicações. No contexto do **TanStack DevTools**, as ferramentas disponibilizadas são para auxiliar a visualização de todo o funcionamento interno do **TanStack Router** e evitar a perda de inúmeras horas tentando depurar uma aplicação com diversas rotas. ## Como instalar o TanStack DevTools Para instalar o **TanStack DevTools** em sua aplicação, basta utilizar algum dos comandos abaixo de acordo com o seu gerenciador de pacotes: ```BASH # Utilizando npm npm install @tanstack/react-router-devtools@beta --save # Utilizando Yarn yarn add @tanstack/react-router-devtools@beta # Utilizando pnpm pnpm add @tanstack/react-router-devtools@beta ``` ## Criando a instância do DevTools Para utilizar as ferramentas do DevTools apenas em ambiênte de desenvolvimento, basta importá-lo da forma a seguir: > ⚠️ Mas tome cuidado, é necessário que você defina a variável de ambiente `NODE_ENV` para identificar se a aplicação está sendo executada em produção. ```TSX // ARQUIVO: router.ts // Importação do lazy do react import { lazy } from 'react'; const isRunningInProduction = process.env.NODE_ENV === 'production'; export const TanStackRouterDevtools = isRunningInProduction ? () => null // Não renderiza nada em produção : lazy(() => // Lazy load em desenvolvimento import('@tanstack/react-router-devtools').then( (res) => ({ default: res.TanStackRouterDevtools }) ), ); ``` ## Utilizando o DevTools na aplicação Lembra de quando foi introduzido o conceito de Layouts? Pois bem, para utilização do DevTools é necessário que você importe a instância dentro de um Layout, para que assim ele obtenha o **TanStack Router** automáticamente. ```TSX // ARQUIVO: layouts/RootLayout.tsx // Importação do DevTools import { TanStackRouterDevtools } from '../router'; export function RootLayout() { return ( <>Made with 💜
================================================ FILE: docs/Testes/1-testes-unitarios.md ================================================ # Testes Unitários
Made with :purple_heart:
================================================ FILE: docs/Testes/2-testes-de-integracao.md ================================================ # Testes de integração
Made with :purple_heart:
================================================ FILE: docs/Verificadores de Tipo/Typescript.md ================================================ Aviso: Esta documentação tem como intenção ser o seu pontapé inicial para começar o desenvolvimento de um projeto React dentro de um ambiente preparado para o Typescript. Se você quiser se aprofundar ainda mais sobre cada um desses temas e sobre o funcionamento do Typescript em si através de vários exemplos sinta-se livre para visitar o [Typescript4noobs!](https://github.com/Carolis/typescript4noobs) # O que é o Typescript? Typescript é considerado um **superset** da linguagem Javascript, dito isso, se você já sabe Javascript é muito fácil de começar a usá-lo já sabendo um pouco. Ele tem como principal funcionalidade a capacidade de adicionar **tipagens estáticas** ao código. Um dos pontos positivos que vale a pena ser citado é a possibilidade de termos arquivos Typescript convivendo no mesmo projeto com arquivos Javascript já que no final das contas o Typescript é compilado para Javascript, ou seja, é uma ferramenta de **desenvolvimento**. Isso também permite que você adicione Typescript em qualquer momento do seu projeto, conforme necessidade e gosto pessoal. ### Por que usar Typescript? O uso de Typescript traz segurança principalmente na detecção de **erros inesperados**. Um exemplo clássico seria o problema do operador `+` do Javascript que, dada uma soma com tipagens erradas poderia retornar erroneamente uma **concatenação** ao invés da soma propriamente dita. ```ts function soma(x, y) { return x + y; } ``` Chamando a função `soma(2,2)` o retorno seria `4`; Chamando a função `soma('2','2')` o retorno seria `22`; Esse problema seria facilmente evitado ao tiparmos as variáveis corretamente como números. --- Outra grande vantagem de usar o Typescript é o aumento da inteligência dentro do seu editor ou IDE, o famoso **[IntelliSense](https://code.visualstudio.com/docs/editor/intellisense)** e a possibilidade de usar **parâmetros opcionais**. Além disso, as tipagens podem funcionar como uma mini documentação dentro do seu arquivo, facilitando futuras manutenções e fazendo com que todos esses fatores tragam uma camada a mais de segurança para o código. # Instalando o Typescript ao lado do React É possível inicializar um projeto react com um template para typescript de várias formas, uma delas se utilizando do create-react-app específico para o typescript, usando os seguintes comandos: PS: antes de seguir com a instalação do typescript é importante ter o **node** previamente instalado. `yarn create react-app my-app --template typescript` ou `npx create-react-app my-app --template typescript` Após isso, toda a estrutura de arquivos virá inicializada em torno de um ambiente preparado para o Typescript. Ainda vale lembrar que você não precisa necessariamente usar um template através do create-react-app, sendo possível inicializar toda sua estrutura de arquivos do zero conforme gosto e necessidade. # Tipos Tipar variáveis é bem simples, como demonstrado no exemplo abaixo. Basta que você adicione `:tipo` depois de declarar uma variável. Exemplos: ```ts let numero: number numero = 3 let isTrue: boolean isTrue = true ``` O Typescript desfruta de alguns tipos primitivos mais comuns, sendo eles: `:number` `:string` `:boolean` `:bigInt` `:symbol` `:null` `:undefined` Você pode conferir ainda mais tipos e conferir exemplos para cada um deles consultando o repositório [Typescript4noobs](https://github.com/Carolis/typescript4noobs). Abaixo seguem alguns exemplos de como ficaria a estrutura de um componente React num ambiente que faz uso de Typescript. Componente **funcional** com Typescript: ```ts import React, { FunctionComponent, useState } from 'react' interface Props { message: string } const App: FunctionComponent{hasMessage ? props.message : 'Default Message'}
} export default App ``` Componente de **classe** com o Typescript: ```ts import React, { Component } from 'react' interface AppProps { text: string } interface AppState { value: number } export default class App extends Component{this.props.text}
{this.state.value}
Made with :purple_heart: