Não é preciso instalar Babel ou Webpack pois o React possui um CLI que contém tudo que é necessário para rodar um projeto novo.
E já vem com todas as configurações prontas Para isso basta rodar o comando abaixo:
npx create-react-app <name>
npm i eslint --save-dev
Depois de instalar o eslint
npx eslint --init
Agora instalar as dependências do prettier
npm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev
Resolve os problemas com o state={} https://babeljs.io/docs/en/babel-plugin-proposal-class-properties
Se não estiver utilizando o react-create-app e quiser rodar o webpack direto.
yarn webpack-dev-server --mode development
npm i eslint-plugin-react-hooks --save-dev
Não esquecer de add dentro do eslintrc.js plugins e add as rules.
npm i react-router-dom
npm install --save styled-components
npm i react-icons
Biblioteca para controlar o tipo de envio de parâmetros
npm i prop-types
Biblioteca que lida com cores dentro do React
npm i polished
npm i redux react-redux
Instalação da lib que faz a persistencia dos dados para não perder caso o usuário dê refresh na tela
npm i redux-persist
npm i reactotron-react-js reactotron-redux
Biblioteca que ajuda a trabalhar com arrays imutáveis dentro do React
npm install immer
Biblioteca utilizada para simular uma api REST
npm install -g json-server
Rodando a api rest
json-server --watch db.json --port 3333
npm i redux-saga
Reactotron Redux Saga
npm i reactotron-redux-saga
npm i react-toastify
Controla as rotas do navegador
npm i history
Para fazer esta alteração precisa mudar a forma como o webpack funciona com o create-react-app e para isso é necessário instalar dois módulos para conseguir este tipo de customização.
npm i customize-cra react-app-rewired --save-dev
Após instalar os módulos e criar o arquivo de configuração do overrides precisa instalar o plugin que eu quero inserir no projeto create-react-app
npm i babel-plugin-root-import --save-dev
Com a instalação deste plugin é possível utilizar o ~ indicando que está na pasta src do projeto, e não precisa mais do ../
Para funcionar é necessário alterar a forma de inicialização do projeto para:
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
}
Para que o eslint entenda o ~ é necessário instalar um plugin:
npm i eslint-import-resolver-babel-plugin-root-import --save-dev
E configurar o eslintrc
plugins: ["babel-plugin-root-import"],
settings: {
"import/resolver": {
"babel-plugin-root-import": {
rootPathSuffix: "src"
},
},
},
Para voltar a funcionar o goto file ao segurar o ctrl + click é necessário criar um arquivo na raiz do projeto chamado jsconfig.json Depois de criar este arquivo, devemos reiniciar o vscode para funcionar.
Conteúdo do arquivo:
{
"compilerOptions": {
"baseUrl": "src",
"paths": {
"~/*": ["*"],
}
}
}
create-react-app nome-do-projeto --template=typescript
Pacote utilizado para o ESlint entender importações de arquivos typescript
yarn add eslint-import-resolver-typescript -D
yarn add prettier eslint-config-prettier eslint-plugin-prettier -D
const Dashboard: React.FC = () => {};
O tipo da função sempre é React.FC pois é o tipo de Componente de Função.
Os dois & comercial é para trabalhar com condicionar que signfica que, se for true (ou false) faça o que vem depois dos dois &.
Exemplo
{
inputError && <Error>{inputError}</Error>;
}
Se a variável inputError retornar alguma coisa, você deve escrever o que está depois dos dois &&
Estes dois pontos de exclamação testa a variável duas vezes e retorna o resultado, exemplo
inputError = true;
!!inputError; // vai retornar true
Ele vai retornar true pois o primeiro ! coloca a variável como negativo e o outro coloca a variável como true
Outro exemplo
inputError = false;
!!inputError; // vai retornar false
Para melhor entendimento, os dois pontos de exclamação na verdade retorna o que a variável realmente é naquele momento.
Se eu quiser receber como parâmetro uma barra / como parâmetro de uma rota eu preciso colocar o seguinte no arquivo de rotas:
<Route path="/repository/:repository+" component={Repository} />
Para pegar os parâmetros da rota é necessário utilizar o useRouteMatch
import React from "react";
import { useRouteMatch } from "react-router-dom";
const Repository: React.FC = () => {
const { params } = useRouteMatch();
return <h1>Repository {params.repository}</h1>;
};
export default Repository;
Quando você quiser extender alguma coisa do React basta colocar extends na interface. E quando você extende vem todos os atributos do jeito que eles são, isso é, se eles não são obrigatórios não serão na interface também, porém se você colocar o mesmo nome de atributo na interface sem o ponto de interrogação ele passará a ser obrigatório. No caso abaixo o name não é obrigatório no InputHTMLAtrributes, porém no nosso caso ele se tornou obrigatório pois foi reescrito pela interface.
import React, { InputHTMLAttributes } from "react";
import { Container } from "./input.style";
interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
name: string;
}
const Input: React.FC = () => (
<Container>
<input type="text" />
</Container>
);
export default Input;
É possível também criar tipagens de objetos que extende outra classe, neste caso não é uma interface, pois não podemos ter interface vazia
type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement>;
Quando estamos trabalhando com o componente de função e dentro dele tem outra função, toda vez que ele é criado ou recriado a função interna é criada novamente na memória, causando assim lentidão na nossa aplicação, para resolver este tipo de problema vamos utilizar um hook que se chama useCallBack, utilizando este hook a função de dentro não será recriada toda vez que o componente for renderizado novamente por conta de alterações de props etc.
A função para ser utilizada com o useCallBack tem que ser convertida para uma Arrow function e ao redor da função você coloca o useCallback. No segundo parâmetro você precisa dizer o que deve ser alterado para essa função ser disparada novamente, se deixar vazio ela nunca mais vai ser recriada.
const handleInputBlur = useCallback(() => {
setIsFocused(false);
}, []);
https://www.npmjs.com/package/react-loading-spin
Temos que cuidar em nunca mandar um boolean para um componente HTML pois gera um erro no console.
yarn add react-day-picker
Importar no componente a lib que contém os estilos.
import "react-day-picker/lib/style.css";
Quando eu faço qualquer alteração no estado do React ele de forma automática renderiza o componente como um todo, por este motivo eu tenho que usar os hooks para impedir que estas rederizações fiquem custosas para a memória da aplicação no final das contas.
Para fazer com que um cálculo ou qualquer tipo de alteração de variável não force a renderização completa do componente utilizamos o useMemo