DEV Community

Cover image for React - API, por que te adoro?
Bruno Felipe
Bruno Felipe

Posted on

React - API, por que te adoro?

👋 Introdução

Nos últimos posts vimos pra que serve React, como criar um projeto e como estilizá-lo. Porém agora temos que consumir os dados de um back-end.

Para testarmos, utilizaremos uma API fake e para isso uma pacote chamado json-server.

🏭 Iniciando nossa API

Primeiro vamos instalar essa pacote globalmente:

npm install -g json-server
Enter fullscreen mode Exit fullscreen mode

Após isso vamos criar um arquivo db.json na raiz do nosso projeto:

{
  "transactions": [
    {
      "id": "1",
      "category": { "title": "Venda" },
      "title": "Desenvolvimento de site",
      "type": "income",
      "value": 12000,
      "created_at": "2020-04-13T00:00:00"
    },
    {
      "id": "2",
      "category": { "title": "Alimentação" },
      "title": "Hamburger",
      "type": "outcome",
      "value": 59,
      "created_at": "2020-04-10T00:00:00"
    },
    {
      "id": "3",
      "category": { "title": "Casa" },
      "title": "Aluguel do apartamento",
      "type": "outcome",
      "value": 1200,
      "created_at": "2020-03-27T00:00:00"
    },
    {
      "id": "4",
      "category": { "title": "Venda" },
      "title": "Computador",
      "type": "income",
      "value": 5400,
      "created_at": "2020-03-15T00:00:00"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

E agora para rodar a API, abra um novo terminal e rode:

json-server --watch db.json --port 3333
Enter fullscreen mode Exit fullscreen mode

http://localhost:3333/transactions para acessar os itens do JSON. Deixe esse terminal aberto e rodando para que a API não caia.

O que temos que fazer agora é consumir essa API no nosso front-end.

📡 Consumindo API

Existem várias bibliotecas para isso, porém utilizaremos o axios. E para instalar:

npm install axios
Enter fullscreen mode Exit fullscreen mode

Já que vamos sempre consumir de uma mesma API nossas informações vamos criar primeiro uma base no arquivo src/services/api.ts:

// services/api.ts

import axios from 'axios';

const api = axios.create({
  baseURL: 'http://localhost:3333',
});

export default api;
Enter fullscreen mode Exit fullscreen mode

Assim, sempre que precisarmos consumir nossa API, vamos importar essa service e utilizá-la.

Vamos no arquivo pages/Home/index.tsx e limpar os useState para eles ficarem em branco.

// pages/Home/index.tsx

const [balance, setBalance] = useState<Balance>({
    income: 0,
    outcome: 0,
    total: 0,
  });

  const [transactions, setTransactions] = useState<Transaction[]>([]);
Enter fullscreen mode Exit fullscreen mode

O que queremos é:

  • Ao abrir a tela, os dados da API devem ser pegados e mostrados em tela.
  • Ao mesmo tempo, é calculado o balanço e depois alterado o valor dos Cards.

Sempre que o React tem um dos seus estados alterados todo o componente é recarregado, e por isso não podemos escrever código diretamente dentro da função Home. Para isso, o React nos fornece um hook useEffect que executa um trecho de código sempre que algum das suas dependências forem alteradas; se não houver dependências ele só é executado na primeira vez que código é carregado.
Pareceu confuso? Na prática é bem simples.

O useEffect é uma função que recebe dois parametros:

  • Uma função a ser executada.
  • Um array com suas dependencias
// pages/Home/index.tsx

import { useEffect, useState } from "react";

// adicionar abaixo dos useState

useEffect(() => {
    setBalance({
      income: 10,
      outcome: 0,
      total: 10,
    });
  }, []);
Enter fullscreen mode Exit fullscreen mode

O que fizemos aqui foi que na primeira vez que o componente Home for renderizado ele irá 'setar' a variável balance com um novo valor.

Vamos utilizar o useEffect para buscar nossa API:

// pages/Home/index.tsx

import { useEffect, useState } from "react";

// adicionar abaixo dos useState

useEffect(() => {
    setBalance({
      income: 10,
      outcome: 0,
      total: 10,
    });
  }, []);
Enter fullscreen mode Exit fullscreen mode

Explicando um pouco de como funciona o axios:

  • Primeiro importamos o nosso service.
  • Depois utilizamos ele informando qual método HTTP iremos utilizar. Como vamos 'pegar' uma lista de dados, utilizamos get.
  • Passamos <Transaction[]> para informar ao Axios qual a tipagem dos dados que a API retornará.
  • Passamos 'transactions' como sendo nossa rota, assim o axios fará uma requisição para http://localhost:3333/transactions.
  • Como essa busca leva uma tempo, temos que utilizar o .then. Isso é a parte assíncrona do Javascript, onde se não utilizarmos o then o Javascript não esperaria a resposta da API para proseguir.
  • O then recebe como parâmetro uma função de callback, onde o argumento dessa função é toda resposta da API.
  • Estamos desestruturando essa resposta para pegarmos apenas os dados (data).
  • Por fim estamos 'setando' a nossa lista de transações para ser os dados enviados pela API.

Ufa... Em três linhas de código muito aconteceu. Mas isso é o básico de como consumir uma API.

Caso não tenha entendido, ou queira se aprofundar mais no axios tem um post bem legal no blog da Rocketseat sobre o axios. Aconselho a darem uma olhada se quiserem.

⚖️ Atualizando o balanço

Para isso também vamos utilizar outro useEffect só que agora esse terá uma dependencia, que será a lista de transações (transactions). Se liga só:

// pages/Home/index.tsx

import { useEffect, useState } from "react";

import Header from "../../components/Header";

import Cards, { Balance } from "../../components/Cards";
import TransactionList, { Transaction } from "../../components/TransactionList";

import { Container } from "./styles";

import api from "../../services/api";

function Home() {
  const [balance, setBalance] = useState<Balance>({
    income: 0,
    outcome: 0,
    total: 0,
  });

  const [transactions, setTransactions] = useState<Transaction[]>([]);

  // AQUI
  useEffect(() => {
    const newBalance: Balance = transactions.reduce(
      (acc, val) => {
        acc[val.type] += val.value;

        return acc;
      },
      { income: 0, outcome: 0, total: 0 }
    );

    newBalance.total = newBalance.income - newBalance.outcome;

    setBalance(newBalance);
  }, [transactions]);

  useEffect(() => {
    api.get<Transaction[]>("transactions").then(({ data }) => {
      setTransactions(data);
    });
  }, []);

  return (
    <>
      <Header />
      <Container>
        <Cards balance={balance} />
        <TransactionList transactions={transactions} />
      </Container>
    </>
  );
}

export default Home;
Enter fullscreen mode Exit fullscreen mode

Estamos utilizando um reduce para percorrer todos os item da lista e retornar o somatório entre cada tipo de transação.
Depois calculamos o total, e por fim 'setamos' o balance como sendo o newBalance.

😥 É o fim?

Com isso terminamos nossa primeira tela no React. É algo simples e pratico que eu espero que tenha te mostrado o quão bom o React pode ser.

Mas isso não quer dizer que chegamos ao fim. Ainda falta muita coisa para aprendermos, estamos apenas arranhado a superfície.

No próximo post vamos criar uma nova tela e descobrir como trocar entre rotas da aplicação.

PS: Um agradecimento especial💜 ao pessoal da Rocketseat🚀 pelo conteúdo de qualidade em React.

Top comments (0)