- Iniciar um projeto react-app.
- Incluir ESLint, Prettier & EditorConfig.
- Criar routes, pages (index e styles).
- Utilizar Styled components para a estilização.
- Criação de componentes.
- state = {}, e render() {};
- funções handleInputChange, handleSubmit
- Utilizar a biblioteca axios para fazer requisições API e criar a baseURL.
- Utilizar localStorage do browser.
- componentDidMount e componentDidUpdate (Carregar e Salvar no LocalStorage, respectivamente).
- Utilizar o { Link } from 'react-router-dom'.
Um site para buscar repositórios no Github, retornando o nome, a descrição e issues atuais presentes no repositório. A pagina principal cria uma lista de repositórios procurados, e em cada item, traz um link.
O link "Detalhes" nos leva a uma página contendo o nome, a descrição e issues.
Cada issue tem um link para a página da respectiva issue no github. obs. O site tem 2 páginas.
yarn start
-
Criando o projeto do zero.
- Terminal:
yarn create react-app modulo05
- webpack, babel se encontram em "react-scripts"
- deletar eslintConfig: {}, pois vamos configurar do zero.
<div id="root">"
é onde vai todo o código React.- Delete: comments, manifest, manifest.json, App.css, App.test.js, index.css, logo, serviceWOrker.js
- Terminal:
-
ESLint, Prettier & EditorConfig.
- Criar modulo05/.editorconfig
- Add/Create Eslint (Popular Language: AirBNB)
yarn add eslint -D yarn eslint --init
- Excluir package-lock.json e yarn.
yarn add prettier eslint-config-prettier eslint-plugin-prettier babel-eslint -D
- modulo05/.eslintrc.js
extends: [ 'plugin:react/recommended', 'airbnb', 'prettier', 'prettier/react', ], parser: 'babel-eslint', plugins: [ 'react', 'prettier', ], rules: { 'prettier/prettier': 'error', 'react/jsx-filename-extension': [ 'warn', { extensions: ['.jsx', '.js']} ], import/prefer-default-export': 'off' },
- modulo05/.prettierrc
"singleQuote": true, "trailingComma": "es5"
-
Roteamento do React
- React Router impede de recarregar toda a pagina (no refresh). Estamos trabalhando em SPA (single page application).
yarn add react-router-dom
- Criar src/routes.js, src/pages/Main/index.js, src/pages/Repository/index.js
- Alterar App.js
-
Styled components
- Add (Vai mudar a forma como escrevemos .css em React e React Native):
yarn add styled-components
- Instalar no VS Code: vscode-styled-components.
- Criar Main/styles.js
- vide o formato de escrever css dentro de um arquivo .js via styled (obs. vide o ``).
- Alterar Main/index.js
-
Estilos globais
- Criar src/styles/global.js e importar ao App.js
-
Estilizando a página Main
- Pacote com varios icones uteis (fontawesome, material icons, wionicons).
yarn add react-icons
- import a Main/index.js, alterar Main/styles.js
-
Adicionando repositórios
- Main/index.js: Transformando a function Main() em componente Class.
- Add state = {}, e render() {};
- Adicionar as funções: handleInputChange, handleSubmit
- browser: procurar: github api
- https://developer.github.com/v3/
- repositories -> get
GET /repos/:owner/:repo
- biblioteca axios serve para fazer requisições API e criar a baseURL: 'http://api.github.com' no ReactJS e React Native.
yarn add axios
- Criar src/services/api.js
- Import axios
- Main/index.js
- Alterar handleSubmit (incluir setState) e state.
- Browser: Inspecionar -> React (ou Components).
- Vide o repositório em state (/rocketseat/unform).
- desabilitar o botão submit enquanto adiciona repo.
- Adicionar loading ao state, handleSubmit, setState,
<SubmitButton>
- Alterar SubmitButton no styles
&[disabled] { cursor: not-allowed; opacity: 0.6; } export const SubmitButton = styled.button.attrs(props => ({ type: 'submit', disabled: props.loading, }))`
- Adicionar loading ao state, handleSubmit, setState,
- Add SPINNER, Main/index.js
- Main/styles.js
- keyframes = animation.
- import styled, { keyframes, css } from 'styled-components';
- Main/styles.js
- Main/index.js: Transformando a function Main() em componente Class.
-
Listando repositórios
- Adicionar o componente List, adicionar const repositories no render().
- repositories.map()
- Adicionar styles. Vide browser: Lista de repositories c/ link: "Detalhes".
-
Utilizando LocalStorage
- Criar as funções componentDidMount e componentDidUpdate (Carregar e Salvar no LocalStorage, respectivamente).
- Vide browser, F5 e a lista permanece.
-
Navegação de rotas
- usando a href=..., o browser vai recarregar a pagina inteira. Não é essa função que queremos, portanto vamos usar um metodo do react-router.
- import { Link } from 'react-router-dom'; trocar o componente a por Link.
- Alterar routes.js (adicionar /:repository).
- Repository/index.js -> decodeURI.
-
Carregando dados da API
- Repository/index.js
- Transformar em class.
- componentDidMount():
- QUeremos puxar "Issues" do hub.
- chamada API simultaneo:
const [ repository, issues] = await Promise.all([ api.get(`/repos/${repoName}`), api.get(`/repos/${repoName}/issues`), ])
- Add state
- repository, issues, loading.
- {} quando tem 1 unico item. [ ] array para diversos itens.
- Add this.setState({}), and const {}.
- Repository/index.js
-
Definindo PropTypes
- Repository/index.js
yarn add prop-types
- Criar static propTypes = {}.
-
Exibindo repositório.
- Criar arquivo Repository/styles.js
- Repository/index.js
- If loading para não mostrar os dados de Repo enquanto estiver carregando.
- Criar src/components/Container/index.js
- Importar o componente Container para Main e Repository.
- Criar e estilizar o componente Owner.
- Criar e estilizar o componente Link para voltar a Main.
-
Exibindo issues
- Repository/index.js
- Criar e estilizar o componente IssueList.
- Criar e estilizar o issue.labels.
- Repository/index.js