<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Eduardo Ramos</title>
    <description>The latest articles on Forem by Eduardo Ramos (@dooramos).</description>
    <link>https://forem.com/dooramos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F701973%2F8d8a58d2-61e5-414a-aedd-46ad6fe99b62.jpg</url>
      <title>Forem: Eduardo Ramos</title>
      <link>https://forem.com/dooramos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dooramos"/>
    <language>en</language>
    <item>
      <title>React JS - Construindo uma wiki de personagens Ricky e Morty - parte 1</title>
      <dc:creator>Eduardo Ramos</dc:creator>
      <pubDate>Wed, 27 Jul 2022 12:32:06 +0000</pubDate>
      <link>https://forem.com/dooramos/react-js-construindo-uma-wiki-de-personagens-ricky-e-morty-parte-1-4g9b</link>
      <guid>https://forem.com/dooramos/react-js-construindo-uma-wiki-de-personagens-ricky-e-morty-parte-1-4g9b</guid>
      <description>&lt;p&gt;Nesse primeiro tutorial de React, vamos fazer um "hands on lab" ou melhor "mão na massa" porque primeiramente será todo em português e segundo que será o mais prático possível sem entrar muito afundo sobre cada funcionalidade aqui utilizada. No final deste artigo você terá aprendido (ou não) alguns conceitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar componentes;&lt;/li&gt;
&lt;li&gt;Usar filtros;&lt;/li&gt;
&lt;li&gt;Usar paginação;&lt;/li&gt;
&lt;li&gt;Usar react hooks (useState, useEffect);&lt;/li&gt;
&lt;li&gt;Criar rotas dinâmicas;&lt;/li&gt;
&lt;li&gt;Criar barra de pesquisa, navegação dentre outros;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obs: Embora o artigo seja em português, todo o código será escrito em inglês por questões de boas práticas.&lt;/p&gt;

&lt;p&gt;Então vamos lá!&lt;br&gt;
Crie uma pasta com o nome 'react-wiki';&lt;br&gt;
Abra essa pasta no VSCODE;&lt;/p&gt;

&lt;p&gt;Agora abra o terminal (CTRL + ') e rode os seguintes comandos: &lt;/p&gt;

&lt;p&gt;1- O NPX é um package runner do NPM. Ele executa as bibliotecas que podem ser baixadas do site npmjs.&lt;br&gt;
&lt;code&gt;npx create-react-app .&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;2- Bootstrap é um framework front-end que fornece estruturas de CSS para a criação de sites e aplicações responsivas de forma rápida e simples.&lt;br&gt;
&lt;code&gt;npm install bootstrap&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3- O Popper. js é uma biblioteca JavaScript que serve para posicionar elementos como menus, tooltips e popovers.&lt;br&gt;
 &lt;code&gt;npm install @popperjs/core --save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4- O SASS é uma linguagem de extensão do CSS, a sigla significa “Syntactically Awesome Style Sheets” traduzindo ao pé da letra, folhas de estilo com uma sintaxe incrível. A sua ideia é adicionar recursos especiais como variáveis, funções, operações e outras coisas.&lt;br&gt;
&lt;code&gt;npm install sass&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;5- O React Router é uma biblioteca do React que permite a navegação entre diversas partes da aplicação, como páginas.&lt;br&gt;
&lt;code&gt;npm install react-router-dom&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;6- O React Paginate é um componente que fará toda a paginação. Neste artigo vou mostrar apenas como implementá-lo sem entrar na lógica de funcionamento do mesmo. &lt;br&gt;
&lt;code&gt;npm install react-paginate --save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E por último rode a aplicação para ver se está tudo OK com:&lt;br&gt;
&lt;code&gt;npm start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tudo funcionando? Se sim, vc deve ter visto um logo do ReactJs girando na tela e ela provavelmente abriu no endereço "&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;A aplicação que vamos desenvolver será uma "wiki" de personagens do desenho animado &lt;strong&gt;Rick and Morty&lt;/strong&gt; e para isso vamos consumir a api pública que está neste endereço &lt;a href="https://rickandmortyapi.com" rel="noopener noreferrer"&gt;https://rickandmortyapi.com&lt;/a&gt;.&lt;br&gt;
Toda documentação e como usar a api pode ser conferida na seção &lt;strong&gt;&lt;em&gt;Docs&lt;/em&gt;&lt;/strong&gt; ou na url &lt;a href="https://rickandmortyapi.com/documentation" rel="noopener noreferrer"&gt;https://rickandmortyapi.com/documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nossa aplicação terá um menu de navegação, barra de pesquisa, filtros por status, gênero (gender), espécies (species), episódios (episodes) e localização (location).&lt;br&gt;
Segue uma figura pra ver a cara da aplicação final. No final do artigo vou deixar um link do app rodando para que possam conferir com mais detalhes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynhbfw00kjvyrlzaeame.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynhbfw00kjvyrlzaeame.png" alt="App final" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg53k8e1r64sn6rn5x5va.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg53k8e1r64sn6rn5x5va.png" alt="App final 2" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Nosso primeiro passo agora é criar uma estrutura de pasta para organizar o &lt;strong&gt;app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Crie uma estrutura de pastas como essa abaixo: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgqx6dlux5glrnmkr8br.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgqx6dlux5glrnmkr8br.PNG" alt="fig1" width="262" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;src &amp;gt; components &amp;gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Card&lt;/li&gt;
&lt;li&gt;Filter&lt;/li&gt;
&lt;li&gt;Navbar&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos remover todo o conteúdo do arquivo &lt;strong&gt;App.css&lt;/strong&gt; e transformá-lo em arquivo SASS, basta renomeá-lo para &lt;strong&gt;App.scss&lt;/strong&gt;;&lt;br&gt;
Dentro desse arquivo vamos ter apenas uma classe css, mas já vamos nos habituar a usar como sass:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.active {&lt;br&gt;
  color: #0b5ed7 !important;&lt;br&gt;
  font-weight: bold;&lt;br&gt;
  border-bottom: 3px solid #0b5ed7;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro do arquivo &lt;strong&gt;App.js&lt;/strong&gt; vamos importar inicialmente o &lt;strong&gt;&lt;em&gt;css&lt;/em&gt;&lt;/strong&gt; do &lt;strong&gt;bootstrap&lt;/strong&gt;, o &lt;strong&gt;&lt;em&gt;js&lt;/em&gt;&lt;/strong&gt; do &lt;strong&gt;bootstrap&lt;/strong&gt; e os &lt;strong&gt;&lt;em&gt;hooks&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;useState&lt;/strong&gt; e &lt;strong&gt;useEffect&lt;/strong&gt; do &lt;strong&gt;react&lt;/strong&gt;. Suas primeiras linhas de código no arquivo &lt;strong&gt;App.js&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import "bootstrap/dist/css/bootstrap.min.css";&lt;br&gt;
import "bootstrap/dist/js/bootstrap";&lt;br&gt;
import React, { useState, useEffect } from "react";&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Antes de continuar vamos criar um card para exibir o resultado da api. &lt;/p&gt;
&lt;h2&gt;
  
  
   
&lt;/h2&gt;
&lt;h2&gt;
  
  
   
&lt;/h2&gt;
&lt;h2&gt;
  
  
  » Card
&lt;/h2&gt;
&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;p&gt;Agora criaremos um card para exibir o resultado da api que iremos utilizar. O resultado ficará igual a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lmzbwpdjgfwjnpw9pkb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lmzbwpdjgfwjnpw9pkb.PNG" alt="fig2" width="588" height="461"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Primeiro vamos criar um arquivo chamado &lt;strong&gt;Card.module.scss&lt;/strong&gt; dentro da pasta &lt;strong&gt;&lt;em&gt;Card&lt;/em&gt;&lt;/strong&gt;. Ele terá o &lt;em&gt;css&lt;/em&gt; do card e será interpretado pelo sass. &lt;/p&gt;

&lt;p&gt;Coloque o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$radius: 10px;

.card {
  border: 2px solid #0b5ed7;
  border-radius: $radius;
}

.content {
  padding: 10px;
}

.img {
  border-radius: $radius $radius 0 0;
}

.badge {
  top: 10px;
  right: 20px;
  font-size: 17px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pra quem nunca viu ou usou o sass. O uso do sass pode ser conferido na variável $radius. Ao atribuir um valor para $radius, podemos atribuí-la diretamente como valor para cada propriedade no   restante do css e ao mudar o valor da variável, mudará para todas as propriedades de uma vez, assim como fazemos com javascript por exemplo.&lt;/p&gt;

&lt;p&gt;Dentro da pasta &lt;strong&gt;&lt;em&gt;Card&lt;/em&gt;&lt;/strong&gt;, crie um arquivo javascript &lt;strong&gt;Card.js&lt;/strong&gt; e adicione o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import styles from "./Card.module.scss";

const Card = ({ page, results }) =&amp;gt; {    

    let display;

    if (results) {
        display = results.map((x) =&amp;gt; {
        let { id, image, name, status, location } = x;

          return (
            &amp;lt;div
            key={id}
            className="col-lg-4 col-md-6 col-sm-6 col-12 mb-4 position-relative text-dark"
          &amp;gt;
            &amp;lt;div className={`${styles.card} d-flex flex-column justify-content-center`}&amp;gt;
                &amp;lt;img className={`${styles.img} img-fluid`} src={image} alt="" /&amp;gt;
                &amp;lt;div className={`${styles.content}`}&amp;gt;
                    &amp;lt;div className="fs-5 fw-bold mb-4"&amp;gt;{name}&amp;lt;/div&amp;gt;
                    &amp;lt;div className=""&amp;gt;
                        &amp;lt;div className="fs-6 fw-normal"&amp;gt;Last Location&amp;lt;/div&amp;gt;
                        &amp;lt;div className="fs-5"&amp;gt;{location.name}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        );
      });
      }
    else{
      display = "Nenhum personagem encontrado :/";
    }

    return &amp;lt;&amp;gt;{display}&amp;lt;/&amp;gt;;
  }

  export default Card;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função Card epera dois parametros "page" e "results". Ela mapeia o results e extrai as propriedades que vamos utilizar como id, image, name, etc. No "return" colocamos o html que queremos renderizar. Note algumas particularidades aqui, como ao invés de usar "class" no ReactJS usamos "className" para atribuir uma classe de css.&lt;br&gt;
E para usar uma classe do arquivo scss, fazemos o que chamamos de interpolação e atribuimos com o "styles" na frente da classe, ou seja se quiser usar a classe "card" numa div tem que colocar algo similar a isso:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div className={`${styles.card}`} &amp;gt;conteudo da div&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
. &lt;/p&gt;

&lt;p&gt;Agora preparar o nosso &lt;strong&gt;App.js&lt;/strong&gt; e adicionar o código abaixo para importar o card:&lt;br&gt;
&lt;code&gt;import Card from "./components/Card/Card";&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e dentro da "function App()" vamos fazer uso dos &lt;strong&gt;&lt;em&gt;hooks&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;useState&lt;/strong&gt; e &lt;strong&gt;useEffect&lt;/strong&gt;, adicione o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  let [fetchedData, updateFetchedData] = useState([]);
  let { info, results } = fetchedData;

  let api = `https://rickandmortyapi.com/api/character/?page=1`;
  useEffect(() =&amp;gt; {
    (async function () {
      let data = await fetch(api).then((res) =&amp;gt; res.json());
      updateFetchedData(data);
    })();
  }, [api]);

  return (
    &amp;lt;div className="App"&amp;gt;
    &amp;lt;h1 className="text-center mb-3"&amp;gt;Personagens&amp;lt;/h1&amp;gt;
    &amp;lt;div className="container"&amp;gt;
    &amp;lt;div className="row"&amp;gt;
      Filtro aparecerá aqui
      &amp;lt;div className="col-lg-8 col-12"&amp;gt;

            &amp;lt;div className="row"&amp;gt;
              &amp;lt;Card page="/" results={results} /&amp;gt;
            &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui foi feito uma chamada para api e agora já vamos ver o resultado preenchendo nossos cards.&lt;/p&gt;

&lt;p&gt;O Arquivo &lt;strong&gt;App.js&lt;/strong&gt; completo deverá estar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'bootstrap/dist/css/bootstrap.min.css';
import "bootstrap/dist/js/bootstrap";
import React, { useState, useEffect } from "react";
import Card from "./components/Card/Card";

function App() {
  let [fetchedData, updateFetchedData] = useState([]);
  let { info, results } = fetchedData;

  let api = `https://rickandmortyapi.com/api/character/?page=1`;
  useEffect(() =&amp;gt; {
    (async function () {
      let data = await fetch(api).then((res) =&amp;gt; res.json());
      updateFetchedData(data);
    })();
  }, [api]);

  return (
    &amp;lt;div className="App"&amp;gt;
    &amp;lt;h1 className="text-center mb-3"&amp;gt;Personagens&amp;lt;/h1&amp;gt;
    &amp;lt;div className="container"&amp;gt;
    &amp;lt;div className="row"&amp;gt;
      Filtro aparecerá aqui
      &amp;lt;div className="col-lg-8 col-12"&amp;gt;       
            &amp;lt;div className="row"&amp;gt;
              &amp;lt;Card page="/" results={results} /&amp;gt;
            &amp;lt;/div&amp;gt;         
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  );
}

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado deverá ser igual a esse:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcerhxi5n17caadlcdeb7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcerhxi5n17caadlcdeb7.PNG" alt="fig3" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos acrescentar o indicador de status do personagem em nosso card, para isso coloque o seguinte código no retorno da função Card no arquivo &lt;strong&gt;Card.js&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; {(() =&amp;gt; {
            if (status === "Dead") {
              return (
                &amp;lt;div
                  className={`${styles.badge} position-absolute badge bg-danger`}
                &amp;gt;
                  {status}
                &amp;lt;/div&amp;gt;
              );
            } else if (status === "Alive") {
              return (
                &amp;lt;div
                  className={`${styles.badge} position-absolute badge bg-success`}
                &amp;gt;
                  {status}
                &amp;lt;/div&amp;gt;
              );
            } else {
              return (
                &amp;lt;div
                  className={`${styles.badge} position-absolute badge bg-secondary`}
                &amp;gt;
                  {status}
                &amp;lt;/div&amp;gt;
              );
            }
          })()}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima verifica o status e adiciona um "badge" da cor do status para cada card.&lt;br&gt;
O Arquivo &lt;strong&gt;Card.js&lt;/strong&gt; completo ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import styles from "./Card.module.scss";


const Card = ({ page, results }) =&amp;gt; {

    let display;

    if (results) {
        display = results.map((x) =&amp;gt; {
        let { id, image, name, status, location } = x;

          return (
            &amp;lt;div
            key={id}
            className="col-lg-4 col-md-6 col-sm-6 col-12 mb-4 position-relative text-dark"
          &amp;gt;
            &amp;lt;div className={`${styles.card} d-flex flex-column justify-content-center`}&amp;gt;
                &amp;lt;img className={`${styles.img} img-fluid`} src={image} alt="" /&amp;gt;
                &amp;lt;div className={`${styles.content}`}&amp;gt;
                    &amp;lt;div className="fs-5 fw-bold mb-4"&amp;gt;{name}&amp;lt;/div&amp;gt;
                    &amp;lt;div className=""&amp;gt;
                        &amp;lt;div className="fs-6 fw-normal"&amp;gt;Last Location&amp;lt;/div&amp;gt;
                        &amp;lt;div className="fs-5"&amp;gt;{location.name}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            {(() =&amp;gt; {
            if (status === "Dead") {
              return (
                &amp;lt;div
                  className={`${styles.badge} position-absolute badge bg-danger`}
                &amp;gt;
                  {status}
                &amp;lt;/div&amp;gt;
              );
            } else if (status === "Alive") {
              return (
                &amp;lt;div
                  className={`${styles.badge} position-absolute badge bg-success`}
                &amp;gt;
                  {status}
                &amp;lt;/div&amp;gt;
              );
            } else {
              return (
                &amp;lt;div
                  className={`${styles.badge} position-absolute badge bg-secondary`}
                &amp;gt;
                  {status}
                &amp;lt;/div&amp;gt;
              );
            }
          })()}

            &amp;lt;/div&amp;gt;
        );
      });
      }
    else{
      display = "Nenhum personagem encontrado :/";
    }

    return &amp;lt;&amp;gt;{display}&amp;lt;/&amp;gt;;
  }

  export default Card;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado dessa alteração será esse:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i5cft6ks1tbgytr4ekn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i5cft6ks1tbgytr4ekn.PNG" alt="fig4" width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;h2&gt;
  
  
  » Search
&lt;/h2&gt;

&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;p&gt;O próximo passo será a criação do componente &lt;strong&gt;Search&lt;/strong&gt; para pesquisar o card pelo termo digitado conforme a figura abaixo: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zidz5y83m3kcj35n8yi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zidz5y83m3kcj35n8yi.png" alt="fig5.5" width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiramente vamos criar 2 &lt;strong&gt;&lt;em&gt;hooks&lt;/em&gt;&lt;/strong&gt; do tipo &lt;strong&gt;useState&lt;/strong&gt; para nos auxiliar na pesquisa. &lt;/p&gt;

&lt;p&gt;Dentro de &lt;strong&gt;App.js&lt;/strong&gt; crie os &lt;strong&gt;&lt;em&gt;hooks&lt;/em&gt;&lt;/strong&gt; conforme o código abaixo:&lt;br&gt;
&lt;code&gt;let [pageNumber, updatePageNumber] = useState(1);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;let [search, setSearch] = useState("");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vamos precisar modificar a &lt;strong&gt;url&lt;/strong&gt; da api (no arquivo &lt;strong&gt;App.js&lt;/strong&gt;) para receber os parâmetros que iremos informar de agora em diante.&lt;/p&gt;

&lt;p&gt;troque isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; let api = `https://rickandmortyapi.com/api/character/?page=1`;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;por isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let api = `https://rickandmortyapi.com/api/character/?page=${pageNumber}&amp;amp;name=${search}`;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro da pasta &lt;strong&gt;&lt;em&gt;Sidebar&lt;/em&gt;&lt;/strong&gt;, crie dois arquivos, um &lt;strong&gt;Sidebar.js&lt;/strong&gt; e um arquivo &lt;strong&gt;Search.module.scss&lt;/strong&gt; e coloque o código abaixo neste ultimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.input {
  width: 40%; border-radius: 8px;
  border: 2px solid #0b5ed7;
  box-shadow: 1px 3px 9px rgba($color: #000000, $alpha: 0.25);
  padding: 10px 15px;
  &amp;amp;:focus { outline: none; }
}
.btn {
  box-shadow: 1px 3px 9px rgba($color: #000000, $alpha: 0.25);
}
@media (max-width: 576px) {
  .input { width: 80%; }
}
```


Esse css estilizará nossa barra e botão de pesquisa.

Agora vamos colocar o código do **Search.js** conforme abaixo:


```
import React from "react";
import styles from "./Search.module.scss";

const Search = ({ setSearch, updatePageNumber }) =&amp;gt; {
  let searchBtn = (e) =&amp;gt; {
    e.preventDefault();
  };
  return (
    &amp;lt;form
      className={`${styles.search} d-flex flex-sm-row flex-column align-items-center justify-content-center gap-4 mb-5`}
    &amp;gt;
      &amp;lt;input
        onChange={(e) =&amp;gt; {
          updatePageNumber(1);
          setSearch(e.target.value);
        }}
        placeholder="Pesquisar por personagens..."
        className={styles.input}
        type="text"
      /&amp;gt;
      &amp;lt;button
        onClick={searchBtn}
        className={`${styles.btn} btn btn-primary fs-5`}
      &amp;gt;
        Search
      &amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};

export default Search;

```


O código acima faz com que o clique do botão como o digitar do campo texto, efetuem uma pesquisa.

Agora vamos importar o componente Search dentro do nosso **App.js**. Insira a linha de código logo abaixo da importação do Card:
` import Search from "./components/Search/Search"; `

Ainda no **App.js** colocamos o trecho de código a seguir logo abaixo o **H1** com o titulo da página: 
` &amp;lt;Search setSearch={setSearch} updatePageNumber={updatePageNumber} /&amp;gt;`


Alterações feitas! Agora podemos testar, apenas digitando na barra de pesquisa já veremos o resultado acontecer.

![fig5](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y94ftpk2zpzblwblwxuh.PNG)

__________________________________________________________________

![fig6](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36zwyzw4uws3vkaeyqs8.PNG)
__________________________________________________________________

##&amp;amp;nbsp;
##&amp;amp;nbsp;
##&amp;amp;raquo; Pagination
##&amp;amp;nbsp;

Paginação! Chegou a hora de paginar a _p@rr#!_ toda! 
E pra fazer isso vamos usar um componente chamado **react-paginate**. 
Toda documentação e mais informações podem ser encontrada neste link [https://www.npmjs.com/package/react-paginate](https://www.npmjs.com/package/react-paginate). O intuito deste artigo não é aprofundar neste componente e sim mostrar sua implementação na prática.   

Então vamos lá!

Dentro da pasta **__Pagination__**, crie um arquivo **Pagination.js**. Nele vamos colocar o seguinte código para fazer nossa paginação:



```
import React, { useState, useEffect } from "react";
import ReactPaginate from "react-paginate";

const Pagination = ({ pageNumber, info, updatePageNumber }) =&amp;gt; {
  let pageChange = (data) =&amp;gt; {
    updatePageNumber(data.selected + 1);
  };

  const [width, setWidth] = useState(window.innerWidth);
  const updateDimensions = () =&amp;gt; {
    setWidth(window.innerWidth);
  };
  useEffect(() =&amp;gt; {
    window.addEventListener("resize", updateDimensions);
    return () =&amp;gt; window.removeEventListener("resize", updateDimensions);
  }, []);

  return (
    &amp;lt;&amp;gt;
      &amp;lt;style jsx&amp;gt;
        {`
          @media (max-width: 768px) {
            .pagination {
              font-size: 12px;
            }
            .next,
            .prev {
              display: none;
            }
          }
          @media (max-width: 768px) {
            .pagination {
              font-size: 14px;
            }
          }
        `}
      &amp;lt;/style&amp;gt;
      &amp;lt;ReactPaginate
        className="pagination justify-content-center my-4 gap-4"
        nextLabel="Next"
        forcePage={pageNumber === 1 ? 0 : pageNumber - 1}
        previousLabel="Prev"
        previousClassName="btn btn-primary fs-5 prev"
        nextClassName="btn btn-primary fs-5 next"
        activeClassName="active"
        marginPagesDisplayed={width &amp;lt; 576 ? 1 : 2}
        pageRangeDisplayed={width &amp;lt; 576 ? 1 : 2}
        pageCount={info?.pages}
        onPageChange={pageChange}
        pageClassName="page-item"
        pageLinkClassName="page-link"
      /&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default Pagination;

```


No código acima temos uma função que recebe os parâmetros "pageNumber", "info" e "updatePageNumber" e atualiza os dados de acordo com a pagina informada. O ReactPaginate tem algumas propriedades que podem ser conferidas na documentação no site do componente.

No **App.js** colocamos bem próximo ao fechamento da ultima div o seguinte trecho de código:

`&amp;lt;Pagination info={info} pageNumber={pageNumber} updatePageNumber={updatePageNumber}/&amp;gt;`

A essa altura o seu arquivo **App.js** deve estar assim:



```
import 'bootstrap/dist/css/bootstrap.min.css';
import "bootstrap/dist/js/bootstrap";
import React, { useState, useEffect } from "react";
import Card from "./components/Card/Card";
import Search from "./components/Search/Search"
import Pagination from "./components/Pagination/Pagination"

function App() {

  let [fetchedData, updateFetchedData] = useState([]);
  let { info, results } = fetchedData;
  let [pageNumber, updatePageNumber] = useState(1);
  let [search, setSearch] = useState("");

  let api = `https://rickandmortyapi.com/api/character/?page=${pageNumber}&amp;amp;name=${search}`;
  useEffect(() =&amp;gt; {
    (async function () {
      let data = await fetch(api).then((res) =&amp;gt; res.json());
      updateFetchedData(data);
    })();
  }, [api]);

  return (
    &amp;lt;div className="App"&amp;gt;
    &amp;lt;h1 className="text-center mb-3"&amp;gt;Personagens&amp;lt;/h1&amp;gt;

    &amp;lt;Search setSearch={setSearch} updatePageNumber={updatePageNumber} /&amp;gt;

    &amp;lt;div className="container"&amp;gt;
    &amp;lt;div className="row"&amp;gt;
      Filtro aparecerá aqui
      &amp;lt;div className="col-lg-8 col-12"&amp;gt;       
            &amp;lt;div className="row"&amp;gt;
              &amp;lt;Card page="/" results={results} /&amp;gt;
            &amp;lt;/div&amp;gt;         
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;Pagination
        info={info}
        pageNumber={pageNumber}
        updatePageNumber={updatePageNumber}
      /&amp;gt;
  &amp;lt;/div&amp;gt;
  );
}

export default App;


```



E o resultado tem que estar parecido com a figura abaixo:


![fig7](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u22s0sh6qb1bjbgfb9n6.gif)







##&amp;amp;nbsp;






Continua... 

[Parte 2](https://dev.to/dooramos/react-js-construindo-uma-wiki-de-personagens-ricky-e-morty-parte-2-51dm)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>React JS - Construindo uma wiki de personagens Ricky e Morty - parte 2</title>
      <dc:creator>Eduardo Ramos</dc:creator>
      <pubDate>Wed, 27 Jul 2022 12:29:00 +0000</pubDate>
      <link>https://forem.com/dooramos/react-js-construindo-uma-wiki-de-personagens-ricky-e-morty-parte-2-51dm</link>
      <guid>https://forem.com/dooramos/react-js-construindo-uma-wiki-de-personagens-ricky-e-morty-parte-2-51dm</guid>
      <description>&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;h2&gt;
  
  
  » Filter
&lt;/h2&gt;

&lt;h2&gt;
  
  
   
&lt;/h2&gt;

&lt;p&gt;Bora lá colocar filtros...&lt;/p&gt;

&lt;p&gt;Primeiramente vamos criar uma estrutura de pasta e arquivos.&lt;br&gt;
Dentro da pasta &lt;strong&gt;&lt;em&gt;Filter&lt;/em&gt;&lt;/strong&gt; teremos os arquivos: &lt;strong&gt;Filter.js&lt;/strong&gt; e  &lt;strong&gt;FilterBTN.js&lt;/strong&gt;. Teremos também uma pasta &lt;strong&gt;&lt;em&gt;category&lt;/em&gt;&lt;/strong&gt; e dentro dela os arquivos: &lt;strong&gt;Gender.js&lt;/strong&gt;, &lt;strong&gt;Species.js&lt;/strong&gt; e &lt;strong&gt;Status.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No arquivo &lt;strong&gt;App.js&lt;/strong&gt; vamos criar mais alguns &lt;strong&gt;&lt;em&gt;hooks&lt;/em&gt;&lt;/strong&gt; para armazenar os filtros. Também vamos precisar mudar a &lt;strong&gt;url&lt;/strong&gt; da api novamente, para receber os novos parâmetros.&lt;/p&gt;

&lt;p&gt;Adicione na função &lt;strong&gt;App()&lt;/strong&gt; esse código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let [status, updateStatus] = useState("");
let [gender, updateGender] = useState("");
let [species, updateSpecies] = useState("");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e altere a api para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; let api = `https://rickandmortyapi.com/api/character/?page=${pageNumber}&amp;amp;name=${search}&amp;amp;status=${status}&amp;amp;gender=${gender}&amp;amp;species=${species}`;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, substitua o &lt;strong&gt;"Filtro aparecerá aqui"&lt;/strong&gt; por:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Filter
  pageNumber={pageNumber}
  status={status}
  updateStatus={updateStatus}
  updateGender={updateGender}
  updateSpecies={updateSpecies}
  updatePageNumber={updatePageNumber}
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No arquivo &lt;strong&gt;Filter.js&lt;/strong&gt; vamos importar as categorias criadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import Gender from "./category/Gender";
import Species from "./category/Species";
import Status from "./category/Status";

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes que eu me esqueça vou colocar o código de cada arquivo das categorias aqui, começando pelo &lt;strong&gt;Gender.js&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import FilterBTN from "../FilterBTN";

const Gender = ({ updateGender, updatePageNumber }) =&amp;gt; {
  let genders = ["female", "male", "genderless", "unknown"];
  return (
    &amp;lt;div className="accordion-item"&amp;gt;
      &amp;lt;h2 className="accordion-header" id="headingThree"&amp;gt;
        &amp;lt;button
          className="accordion-button collapsed"
          type="button"
          data-bs-toggle="collapse"
          data-bs-target="#collapseThree"
          aria-expanded="false"
          aria-controls="collapseThree"
        &amp;gt;
          Gender
        &amp;lt;/button&amp;gt;
      &amp;lt;/h2&amp;gt;
      &amp;lt;div
        id="collapseThree"
        className="accordion-collapse collapse"
        aria-labelledby="headingThree"
        data-bs-parent="#accordionExample"
      &amp;gt;
        &amp;lt;div className="accordion-body d-flex flex-wrap gap-3"&amp;gt;
          {genders.map((items, index) =&amp;gt; {
            return (
              &amp;lt;FilterBTN
                name="gender"
                index={index}
                key={index}
                updatePageNumber={updatePageNumber}
                task={updateGender}
                input={items}
              /&amp;gt;
            );
          })}
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Gender;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o &lt;strong&gt;Species.js&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import FilterBTN from "../FilterBTN";

const Species = ({ updateSpecies, updatePageNumber }) =&amp;gt; {
  let species = [
    "Human",
    "Alien",
    "Humanoid",
    "Poopybutthole",
    "Mythological",
    "Unknown",
    "Animal",
    "Disease",
    "Robot",
    "Cronenberg",
    "Planet",
  ];
  return (
    &amp;lt;div className="accordion-item "&amp;gt;
      &amp;lt;h2 className="accordion-header" id="headingTwo"&amp;gt;
        &amp;lt;button
          className="accordion-button collapsed"
          type="button"
          data-bs-toggle="collapse"
          data-bs-target="#collapseTwo"
          aria-expanded="false"
          aria-controls="collapseTwo"
        &amp;gt;
          Species
        &amp;lt;/button&amp;gt;
      &amp;lt;/h2&amp;gt;
      &amp;lt;div
        id="collapseTwo"
        className="accordion-collapse collapse"
        aria-labelledby="headingTwo"
        data-bs-parent="#accordionExample"
      &amp;gt;
        &amp;lt;div className="accordion-body d-flex flex-wrap gap-3"&amp;gt;
          {species.map((item, index) =&amp;gt; {
            return (
              &amp;lt;FilterBTN
                name="species"
                index={index}
                key={index}
                updatePageNumber={updatePageNumber}
                task={updateSpecies}
                input={item}
              /&amp;gt;
            );
          })}
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Species;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E por ultimo o &lt;strong&gt;Status.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import FilterBTN from "../FilterBTN";

const Status = ({ updateStatus, updatePageNumber }) =&amp;gt; {
  let status = ["Alive", "Dead", "Unknown"];
  return (
    &amp;lt;div className="accordion-item"&amp;gt;
      &amp;lt;h2 className="accordion-header" id="headingOne"&amp;gt;
        &amp;lt;button
          className="accordion-button"
          type="button"
          data-bs-toggle="collapse"
          data-bs-target="#collapseOne"
          aria-expanded="true"
          aria-controls="collapseOne"
        &amp;gt;
          Status
        &amp;lt;/button&amp;gt;
      &amp;lt;/h2&amp;gt;
      &amp;lt;div
        id="collapseOne"
        className="accordion-collapse collapse show"
        aria-labelledby="headingOne"
        data-bs-parent="#accordionExample"
      &amp;gt;
        &amp;lt;div className="accordion-body d-flex flex-wrap gap-3"&amp;gt;
          {status.map((item, index) =&amp;gt; (
            &amp;lt;FilterBTN
              key={index}
              index={index}
              name="status"
              task={updateStatus}
              updatePageNumber={updatePageNumber}
              input={item}
            /&amp;gt;
          ))}
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Status;

```



Vamos deixar o arquivo **FilterBTN.js** pronto também com o seguinte código:



```
import React from "react";

const FilterBTN = ({ input, task, updatePageNumber, index, name }) =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;style jsx&amp;gt;
        {`
          .x:checked + label {
            background-color: #0b5ed7;
            color: white;
          }
          input[type="radio"] {
            display: none;
          }
        `}
      &amp;lt;/style&amp;gt;

      &amp;lt;div className="form-check"&amp;gt;
        &amp;lt;input
          className="form-check-input x"
          type="radio"
          name={name}
          id={`${name}-${index}`}
        /&amp;gt;
        &amp;lt;label
          onClick={(x) =&amp;gt; {
            task(input);
            updatePageNumber(1);
          }}
          className="btn btn-outline-primary"
          for={`${name}-${index}`}
        &amp;gt;
          {input}
        &amp;lt;/label&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default FilterBTN;

```



Voltando ao arquivo **Filter.js** que até esse ponto possui apenas 4 linhas de código. Vamos deixá-lo assim:



```
import React from "react";
import Gender from "./category/Gender";
import Species from "./category/Species";
import Status from "./category/Status";

const Filter = ({
  pageNumber,
  updatePageNumber,
  updateStatus,
  updateGender,
  updateSpecies,
}) =&amp;gt; {
  let clear = () =&amp;gt; {
    updateStatus("");
    updateGender("");
    updateSpecies("");
    updatePageNumber(1);
    window.location.reload(false);
  };
  return (
    &amp;lt;div className="col-lg-3 col-12 mb-5"&amp;gt;
      &amp;lt;div className="text-center fw-bold fs-4 mb-2"&amp;gt;Filtros&amp;lt;/div&amp;gt;
      &amp;lt;div
        style={{ cursor: "pointer" }}
        onClick={clear}
        className="text-primary text-decoration-underline text-center mb-3"
      &amp;gt;
        Limpar Filtros
      &amp;lt;/div&amp;gt;
      &amp;lt;div className="accordion" id="accordionExample"&amp;gt;
        &amp;lt;Status
          updatePageNumber={updatePageNumber}
          updateStatus={updateStatus}
        /&amp;gt;
        &amp;lt;Species
          updatePageNumber={updatePageNumber}
          updateSpecies={updateSpecies}
        /&amp;gt;
        &amp;lt;Gender
          updatePageNumber={updatePageNumber}
          updateGender={updateGender}
        /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Filter;

```



Pra finalizar e testar os filtros o **App.js** tem que estar assim:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import 'bootstrap/dist/css/bootstrap.min.css';&lt;br&gt;
import "bootstrap/dist/js/bootstrap";&lt;br&gt;
import React, { useState, useEffect } from "react";&lt;br&gt;
import Search from "./components/Search/Search";&lt;br&gt;
import Card from "./components/Card/Card";&lt;br&gt;
import Pagination from "./components/Pagination/Pagination";&lt;br&gt;
import Filter from "./components/Filter/Filter";&lt;/p&gt;

&lt;p&gt;function App() {&lt;/p&gt;

&lt;p&gt;let [pageNumber, updatePageNumber] = useState(1);&lt;br&gt;
  let [status, updateStatus] = useState("");&lt;br&gt;
  let [gender, updateGender] = useState("");&lt;br&gt;
  let [species, updateSpecies] = useState("");&lt;br&gt;
  let [fetchedData, updateFetchedData] = useState([]);&lt;br&gt;
  let [search, setSearch] = useState("");&lt;br&gt;
  let { info, results } = fetchedData;&lt;/p&gt;

&lt;p&gt;let api = &lt;code&gt;https://rickandmortyapi.com/api/character/?page=${pageNumber}&amp;amp;name=${search}&amp;amp;status=${status}&amp;amp;gender=${gender}&amp;amp;species=${species}&lt;/code&gt;;&lt;br&gt;
  useEffect(() =&amp;gt; {&lt;br&gt;
    (async function () {&lt;br&gt;
      let data = await fetch(api).then((res) =&amp;gt; res.json());&lt;br&gt;
      updateFetchedData(data);&lt;br&gt;
    })();&lt;br&gt;
  }, [api]);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
    &lt;h1&gt;Personagens&lt;/h1&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Search setSearch={setSearch} updatePageNumber={updatePageNumber} /&amp;gt;

&amp;lt;div className="container"&amp;gt;
&amp;lt;div className="row"&amp;gt;
&amp;lt;Filter
        pageNumber={pageNumber}
        status={status}
        updateStatus={updateStatus}
        updateGender={updateGender}
        updateSpecies={updateSpecies}
        updatePageNumber={updatePageNumber}
      /&amp;gt;
  &amp;lt;div className="col-lg-8 col-12"&amp;gt;       
        &amp;lt;div className="row"&amp;gt;
          &amp;lt;Card page="/" results={results} /&amp;gt;
        &amp;lt;/div&amp;gt;         
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;Pagination
    info={info}
    pageNumber={pageNumber}
    updatePageNumber={updatePageNumber}
  /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;br&gt;
  );&lt;br&gt;
}

&lt;p&gt;export default App;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Agora vamos criar o componente com o menu de navegação.

##&amp;amp;nbsp;
##&amp;amp;nbsp;
##&amp;amp;raquo; Navigation
##&amp;amp;nbsp;

![fig8](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s76g5e5lgp7wk0xipsfj.png)


Dentro da pasta **_src_**, crie uma pasta **_Pages_** e dentro dela crie 2 arquivos **Episodes.js** e **Location.js**.

Agora vá para o arquivo **App.js** e importe esses arquivos que acabamos de criar:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;import Episodes from "./Pages/Episodes";&lt;br&gt;
import Location from "./Pages/Location";&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Vamos adicionar o react-router-dom e importar alguns componentes:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;import { BrowserRouter as Router, Routes, Route } from "react-router-dom";&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Agora vamos criar uma função auxiliar dentro do **App.js** mesmo:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;const Home = () =&amp;gt; {&lt;br&gt;
  // Código aqui&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Dentro da função **App** vamos criar um **Router** e um **Navbar** igual o código abaixo:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;function App() {&lt;br&gt;
  return (&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Agora definimos nossas rotas. Cada rota requer o caminho (path) e o componente (element):


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
  } /&amp;gt;&lt;br&gt;
  } /&amp;gt;&lt;br&gt;
  } /&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Feito isso, vamos criar o código da nossa **Navbar.js**.
Dentro do pasta **_Navbar_** crie um arquivo chamado **Navbar.js** e coloque o código abaixo:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import React from "react";&lt;br&gt;
import { NavLink, Link } from "react-router-dom";&lt;br&gt;
import "../../App.scss";&lt;/p&gt;

&lt;p&gt;const Navbar = () =&amp;gt; {&lt;br&gt;
  return (&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          Rick e Morty &lt;span&gt;WiKi&lt;/span&gt;&lt;br&gt;
        &lt;br&gt;
        {&amp;lt;code&amp;gt;&amp;lt;br&amp;gt;
          button[aria-expanded=&amp;amp;quot;false&amp;amp;quot;] &amp;amp;gt; .close {&amp;lt;br&amp;gt;
            display: none;&amp;lt;br&amp;gt;
          }&amp;lt;br&amp;gt;
          button[aria-expanded=&amp;amp;quot;true&amp;amp;quot;] &amp;amp;gt; .open {&amp;lt;br&amp;gt;
            display: none;&amp;lt;br&amp;gt;
          }&amp;lt;br&amp;gt;
&amp;lt;/code&amp;gt;}&lt;br&gt;
        
          className="navbar-toggler border-0"&lt;br&gt;
          type="button"&lt;br&gt;
          data-bs-toggle="collapse"&lt;br&gt;
          data-bs-target="#navbarNavAltMarkup"&lt;br&gt;
          aria-controls="navbarNavAltMarkup"&lt;br&gt;
          aria-expanded="false"&lt;br&gt;
          aria-label="Toggle navigation"&lt;br&gt;
        &amp;gt;&lt;br&gt;
          &lt;span&gt;&lt;/span&gt;&lt;br&gt;
          &lt;span&gt;&lt;/span&gt;&lt;br&gt;
        &lt;br&gt;
        
          className="collapse navbar-collapse justify-content-end"&lt;br&gt;
          id="navbarNavAltMarkup"&lt;br&gt;
        &amp;gt;&lt;br&gt;
          &lt;br&gt;
            &lt;br&gt;
              Personagens&lt;br&gt;
            &lt;br&gt;
            &lt;br&gt;
              Episódios&lt;br&gt;
            &lt;br&gt;
            
              activeClassName="active"&lt;br&gt;
              className="nav-link"&lt;br&gt;
              to="/location"&lt;br&gt;
            &amp;gt;&lt;br&gt;
              Localizações&lt;br&gt;
            &lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;export default Navbar;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Vamos criar mais páginas para testar a navegação. Porém antes de criarmos as próximas páginas, vamos criar um componente para auxiliar no filtro, que será incluído nelas. 
Esse componente terá o papel similar aos filtros de categoria, logo vamos criá-lo dentro da pasta **_category_** que está dentro da pasta **_Filter_**. Crie um arquivo chamado **InputGroup.js**

Coloque o código abaixo:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import React from "react";&lt;/p&gt;

&lt;p&gt;const InputGroup = ({ name, changeID, total }) =&amp;gt; {&lt;br&gt;
  return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      
        onChange={(e) =&amp;gt; changeID(e.target.value)}&lt;br&gt;
        className="form-select"&lt;br&gt;
        id={name}&lt;br&gt;
      &amp;gt;&lt;br&gt;
        Escolha...&lt;br&gt;
        {[...Array(total).keys()].map((x, index) =&amp;gt; {&lt;br&gt;
          return (&lt;br&gt;
            &lt;br&gt;
              {name} - {x + 1}&lt;br&gt;
            &lt;br&gt;
          );&lt;br&gt;
        })}&lt;br&gt;
       &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default InputGroup;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Dentro de **Episode.js** que está na pasta **_Pages_**, coloque o código abaixo:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import React, { useEffect, useState } from "react";&lt;br&gt;
import Card from "../components/Card/Card";&lt;br&gt;
import InputGroup from "../components/Filter/category/InputGroup";&lt;/p&gt;

&lt;p&gt;const Episodes = () =&amp;gt; {&lt;br&gt;
  let [results, setResults] = React.useState([]);&lt;br&gt;
  let [info, setInfo] = useState([]);&lt;br&gt;
  let { air_date, episode, name } = info;&lt;br&gt;
  let [id, setID] = useState(1);&lt;/p&gt;

&lt;p&gt;let api = &lt;code&gt;https://rickandmortyapi.com/api/episode/${id}&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    (async function () {&lt;br&gt;
      let data = await fetch(api).then((res) =&amp;gt; res.json());&lt;br&gt;
      setInfo(data);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  let a = await Promise.all(
    data.characters.map((x) =&amp;gt; {
      return fetch(x).then((res) =&amp;gt; res.json());
    })
  );
  setResults(a);
})();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}, [api]);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;br&gt;
        &lt;h1&gt;
&lt;br&gt;
          Episode name :{" "}&lt;br&gt;
          &lt;span&gt;{name === "" ? "Unknown" : name}&lt;/span&gt;&lt;br&gt;
        &lt;/h1&gt;
&lt;br&gt;
        &lt;h5&gt;
&lt;br&gt;
          Air Date: {air_date === "" ? "Unknown" : air_date}&lt;br&gt;
        &lt;/h5&gt;
&lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          &lt;h4&gt;Episódios&lt;/h4&gt;
&lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
          &lt;br&gt;
            &lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default Episodes;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

O que foi feito aqui é uma página com uma nova url para a api, onde o combo representado pelo componente **InputGroup** filtra o resultado.

No arquivo **Location.js** coloque este código:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import React, { useEffect, useState } from "react";&lt;br&gt;
import Card from "../components/Card/Card";&lt;br&gt;
import InputGroup from "../components/Filter/category/InputGroup";&lt;/p&gt;

&lt;p&gt;const Location = () =&amp;gt; {&lt;br&gt;
  let [results, setResults] = React.useState([]);&lt;br&gt;
  let [info, setInfo] = useState([]);&lt;br&gt;
  let { dimension, type, name } = info;&lt;br&gt;
  let [number, setNumber] = useState(1);&lt;/p&gt;

&lt;p&gt;let api = &lt;code&gt;https://rickandmortyapi.com/api/location/${number}&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    (async function () {&lt;br&gt;
      let data = await fetch(api).then((res) =&amp;gt; res.json());&lt;br&gt;
      setInfo(data);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  let a = await Promise.all(
    data.residents.map((x) =&amp;gt; {
      return fetch(x).then((res) =&amp;gt; res.json());
    })
  );
  setResults(a);
})();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}, [api]);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;br&gt;
        &lt;h1&gt;
&lt;br&gt;
          Location :&lt;br&gt;
          &lt;span&gt;&lt;br&gt;
            {" "}&lt;br&gt;
            {name === "" ? "Unknown" : name}&lt;br&gt;
          &lt;/span&gt;&lt;br&gt;
        &lt;/h1&gt;
&lt;br&gt;
        &lt;h5&gt;
&lt;br&gt;
          Dimension: {dimension === "" ? "Unknown" : dimension}&lt;br&gt;
        &lt;/h5&gt;
&lt;br&gt;
        &lt;h6&gt;Type: {type === "" ? "Unknown" : type}&lt;/h6&gt;
&lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          &lt;h4&gt;Localização&lt;/h4&gt;
&lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
        &lt;br&gt;
          &lt;br&gt;
            &lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
    

&lt;p&gt;);&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;export default Location;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Perceba que fizemos a mesma coisa aqui, trocando obviamente o _episodes_ por _location_ e alterando a url da api.


Agora vamos conferir mais uma vez o arquivo **App.js** que deve estar igual o código abaixo:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import "bootstrap/dist/css/bootstrap.min.css";&lt;br&gt;
import "bootstrap/dist/js/bootstrap";&lt;br&gt;
import React, { useState, useEffect } from "react";&lt;/p&gt;

&lt;p&gt;import Search from "./components/Search/Search";&lt;br&gt;
import Card from "./components/Card/Card";&lt;br&gt;
import Pagination from "./components/Pagination/Pagination";&lt;br&gt;
import Filter from "./components/Filter/Filter";&lt;br&gt;
import Navbar from "./components/Navbar/Navbar";&lt;/p&gt;

&lt;p&gt;import { BrowserRouter as Router, Routes, Route } from "react-router-dom";&lt;br&gt;
import Episodes from "./Pages/Episodes";&lt;br&gt;
import Location from "./Pages/Location";&lt;/p&gt;

&lt;p&gt;function App() {&lt;br&gt;
  return (&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
        } /&amp;gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;Route path="/episodes" element={&amp;lt;Episodes /&amp;gt;} /&amp;gt;


    &amp;lt;Route path="/location" element={&amp;lt;Location /&amp;gt;} /&amp;gt;

  &amp;lt;/Routes&amp;gt;
&amp;lt;/Router&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;);&lt;br&gt;
}&lt;br&gt;
const Home = () =&amp;gt; {&lt;br&gt;
  let [pageNumber, updatePageNumber] = useState(1);&lt;br&gt;
  let [status, updateStatus] = useState("");&lt;br&gt;
  let [gender, updateGender] = useState("");&lt;br&gt;
  let [species, updateSpecies] = useState("");&lt;br&gt;
  let [fetchedData, updateFetchedData] = useState([]);&lt;br&gt;
  let [search, setSearch] = useState("");&lt;br&gt;
  let { info, results } = fetchedData;&lt;/p&gt;

&lt;p&gt;let api = &lt;code&gt;https://rickandmortyapi.com/api/character/?page=${pageNumber}&amp;amp;name=${search}&amp;amp;status=${status}&amp;amp;gender=${gender}&amp;amp;species=${species}&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    (async function () {&lt;br&gt;
      let data = await fetch(api).then((res) =&amp;gt; res.json());&lt;br&gt;
      updateFetchedData(data);&lt;br&gt;
    })();&lt;br&gt;
  }, [api]);&lt;br&gt;
  return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;h1&gt;Personagens&lt;/h1&gt;
&lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          
            pageNumber={pageNumber}&lt;br&gt;
            status={status}&lt;br&gt;
            updateStatus={updateStatus}&lt;br&gt;
            updateGender={updateGender}&lt;br&gt;
            updateSpecies={updateSpecies}&lt;br&gt;
            updatePageNumber={updatePageNumber}&lt;br&gt;
          /&amp;gt;&lt;br&gt;
          &lt;br&gt;
            &lt;br&gt;
              &lt;br&gt;
            &lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
      
        info={info}&lt;br&gt;
        pageNumber={pageNumber}&lt;br&gt;
        updatePageNumber={updatePageNumber}&lt;br&gt;
      /&amp;gt;&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default App;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Sua aplicação  deve estar similar a isso:
![fig9](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9is0rldza8zerq0rgx1e.png)

_______________

![fig10](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ft15j9u24jx4dd41bn0l.png)

___________________ 

![fig11](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0rogy3ijdpln4zj59i0.png)

___________________

Antes de finalizar vamos criar uma página/componente para exibir detalhes do card que foi clicado.
Será uma página simples apenas com alguns detalhes a mais.
Futuramente iremos implementar uma modal, na evolução deste artigo, mas por ora optamos pela simplicidade de uma página comum.

Vá até a pasta **_Card_** e crie um arquivo chamado **CardDetails.js**.

Nele coloque o seguinte código:


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;import React, { useState, useEffect } from "react";&lt;br&gt;
import { useParams } from "react-router-dom";&lt;/p&gt;

&lt;p&gt;const CardDetails = () =&amp;gt; {&lt;br&gt;
  let { id } = useParams();&lt;/p&gt;

&lt;p&gt;let [fetchedData, updateFetchedData] = useState([]);&lt;br&gt;
  let { name, location, origin, gender, image, status, species } = fetchedData;&lt;/p&gt;

&lt;p&gt;let api = &lt;code&gt;https://rickandmortyapi.com/api/character/${id}&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    (async function () {&lt;br&gt;
      let data = await fetch(api).then((res) =&amp;gt; res.json());&lt;br&gt;
      updateFetchedData(data);&lt;br&gt;
    })();&lt;br&gt;
  }, [api]);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;br&gt;
        &lt;h1&gt;{name}&lt;/h1&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;img className="img-fluid" src={image} alt="" /&amp;gt;
    {(() =&amp;gt; {
      if (status === "Dead") {
        return &amp;lt;div className="badge bg-danger fs-5"&amp;gt;{status}&amp;lt;/div&amp;gt;;
      } else if (status === "Alive") {
        return &amp;lt;div className=" badge bg-success fs-5"&amp;gt;{status}&amp;lt;/div&amp;gt;;
      } else {
        return &amp;lt;div className="badge bg-secondary fs-5"&amp;gt;{status}&amp;lt;/div&amp;gt;;
      }
    })()}
    &amp;lt;div className="content"&amp;gt;
      &amp;lt;div className=""&amp;gt;
        &amp;lt;span className="fw-bold"&amp;gt;Gender : &amp;lt;/span&amp;gt;
        {gender}
      &amp;lt;/div&amp;gt;
      &amp;lt;div className=""&amp;gt;
        &amp;lt;span className="fw-bold"&amp;gt;Location: &amp;lt;/span&amp;gt;
        {location?.name}
      &amp;lt;/div&amp;gt;
      &amp;lt;div className=""&amp;gt;
        &amp;lt;span className="fw-bold"&amp;gt;Origin: &amp;lt;/span&amp;gt;
        {origin?.name}
      &amp;lt;/div&amp;gt;
      &amp;lt;div className=""&amp;gt;
        &amp;lt;span className="fw-bold"&amp;gt;Species: &amp;lt;/span&amp;gt;
        {species}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;);&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;export default CardDetails;&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Aqui estamos criando um card, a partir de um id que foi selecionado previamente no momento do click.
A api retorna alguns dados de acordo com o id que foi informado para ela. Dessa forma conseguimos ter nossa página de detalhes funcionando.

Vamos finalizar ajustando o arquivo **App.js** para redirecionar corretamente para a rota de detalhes. Para isso inclua mais algumas rotas:
`&amp;lt;Route path="/:id" element={&amp;lt;CardDetails /&amp;gt;} /&amp;gt;`
`&amp;lt;Route path="/episodes/:id" element={&amp;lt;CardDetails /&amp;gt;} /&amp;gt;`
`&amp;lt;Route path="/location/:id" element={&amp;lt;CardDetails /&amp;gt;} /&amp;gt;` 

Dentro do arquivo **Card.js** vamos colocar um elemento Link para encapsular a div e tornar o card "clicável". Para facilitar vou deixar aqui o código atualizado do **Card.js**:


&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;import React from "react";&lt;br&gt;
import { Link } from "react-router-dom";&lt;br&gt;
import styles from "./Card.module.scss";&lt;/p&gt;

&lt;p&gt;const Card = ({ page, results }) =&amp;gt; {&lt;br&gt;
  let display;&lt;/p&gt;

&lt;p&gt;if (results) {&lt;br&gt;
    display = results.map((x) =&amp;gt; {&lt;br&gt;
      let { id, image, name, status, location } = x;&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  return (
    &amp;lt;Link
      style={{ textDecoration: "none" }}
      to={`${page}${id}`}
      key={id}
      className="col-lg-4 col-md-6 col-sm-6 col-12 mb-4 position-relative text-dark"
    &amp;gt;
      &amp;lt;div
        className={`${styles.card} d-flex flex-column justify-content-center`}
      &amp;gt;
        &amp;lt;img className={`${styles.img} img-fluid`} src={image} alt="" /&amp;gt;
        &amp;lt;div className={`${styles.content}`}&amp;gt;
          &amp;lt;div className="fs-5 fw-bold mb-4"&amp;gt;{name}&amp;lt;/div&amp;gt;
          &amp;lt;div className=""&amp;gt;
            &amp;lt;div className="fs-6 fw-normal"&amp;gt;Last Location&amp;lt;/div&amp;gt;
            &amp;lt;div className="fs-5"&amp;gt;{location.name}&amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

      {(() =&amp;gt; {
        if (status === "Dead") {
          return (
            &amp;lt;div
              className={`${styles.badge} position-absolute badge bg-danger`}
            &amp;gt;
              {status}
            &amp;lt;/div&amp;gt;
          );
        } else if (status === "Alive") {
          return (
            &amp;lt;div
              className={`${styles.badge} position-absolute badge bg-success`}
            &amp;gt;
              {status}
            &amp;lt;/div&amp;gt;
          );
        } else {
          return (
            &amp;lt;div
              className={`${styles.badge} position-absolute badge bg-secondary`}
            &amp;gt;
              {status}
            &amp;lt;/div&amp;gt;
          );
        }
      })()}
    &amp;lt;/Link&amp;gt;
  );
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;} else {&lt;br&gt;
    display = "Nenhum personagem encontrado :/";&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return &amp;lt;&amp;gt;{display}&amp;lt;/&amp;gt;;&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;export default Card;&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Importe o componente **CardDetails.js** dentro do **App.js**:
`import CardDetails from "./components/Card/CardDetails";`

E pra não ter erro o seu arquivo **App.js** deverá ficar assim:



&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;import "bootstrap/dist/css/bootstrap.min.css";&lt;br&gt;
import "bootstrap/dist/js/bootstrap";&lt;br&gt;
import React, { useState, useEffect } from "react";&lt;/p&gt;

&lt;p&gt;import Search from "./components/Search/Search";&lt;br&gt;
import Card from "./components/Card/Card";&lt;br&gt;
import CardDetails from "./components/Card/CardDetails";&lt;br&gt;
import Pagination from "./components/Pagination/Pagination";&lt;br&gt;
import Filter from "./components/Filter/Filter";&lt;br&gt;
import Navbar from "./components/Navbar/Navbar";&lt;/p&gt;

&lt;p&gt;import { BrowserRouter as Router, Routes, Route } from "react-router-dom";&lt;br&gt;
import Episodes from "./Pages/Episodes";&lt;br&gt;
import Location from "./Pages/Location";&lt;/p&gt;

&lt;p&gt;function App() {&lt;br&gt;
  return (&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
        } /&amp;gt;&lt;br&gt;
        } /&amp;gt;&lt;br&gt;
        } /&amp;gt;&lt;br&gt;
        } /&amp;gt;&lt;br&gt;
        } /&amp;gt;&lt;br&gt;
        } /&amp;gt;&lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}&lt;br&gt;
const Home = () =&amp;gt; {&lt;br&gt;
  let [pageNumber, updatePageNumber] = useState(1);&lt;br&gt;
  let [status, updateStatus] = useState("");&lt;br&gt;
  let [gender, updateGender] = useState("");&lt;br&gt;
  let [species, updateSpecies] = useState("");&lt;br&gt;
  let [fetchedData, updateFetchedData] = useState([]);&lt;br&gt;
  let [search, setSearch] = useState("");&lt;br&gt;
  let { info, results } = fetchedData;&lt;/p&gt;

&lt;p&gt;let api = &lt;code&gt;https://rickandmortyapi.com/api/character/?page=${pageNumber}&amp;amp;name=${search}&amp;amp;status=${status}&amp;amp;gender=${gender}&amp;amp;species=${species}&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    (async function () {&lt;br&gt;
      let data = await fetch(api).then((res) =&amp;gt; res.json());&lt;br&gt;
      updateFetchedData(data);&lt;br&gt;
    })();&lt;br&gt;
  }, [api]);&lt;br&gt;
  return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;h1&gt;Personagens&lt;/h1&gt;
&lt;br&gt;
      &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          
            pageNumber={pageNumber}&lt;br&gt;
            status={status}&lt;br&gt;
            updateStatus={updateStatus}&lt;br&gt;
            updateGender={updateGender}&lt;br&gt;
            updateSpecies={updateSpecies}&lt;br&gt;
            updatePageNumber={updatePageNumber}&lt;br&gt;
          /&amp;gt;&lt;br&gt;
          &lt;br&gt;
            &lt;br&gt;
              &lt;br&gt;
            &lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
      
        info={info}&lt;br&gt;
        pageNumber={pageNumber}&lt;br&gt;
        updatePageNumber={updatePageNumber}&lt;br&gt;
      /&amp;gt;&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default App;&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


O resultado final ao clicar no card deverá ser igual a figura abaixo: 

![fig13](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qzvijrb2eulump05cpak.png)


_____________________

Esse foi um post para mostrar o básico de **React**. 
Resolvi fazer esse post, pois acompanhei algumas postagens e tutoriais que "ensinavam" a implementar o consumo dessa mesma api inclusive, porém sempre me senti perdido quanto a didática da postagem, pois não ficava claro onde colocar arquivos ou trecho de códigos. Pra quem está iniciando é bem complicado quando não se consegue acompanhar ou reproduzir o artigo ou tutorial. Tentei ser o mais claro e objetivo.
Em breve escreverei outros artigos incluindo **Typescript**, **Context** e outros conceitos. Espero que gostem e principalmente consigam entender e implementar. 






##&amp;amp;nbsp;
_____________________

_____________________[Clique aqui para ver o resultado final](https://wiki-rick-morty-react.vercel.app/)_____________________

_____________________
##&amp;amp;nbsp;
A primeira parte do artigo está aqui: 

[Parte 1](https://dev.to/dooramos/react-js-construindo-uma-wiki-de-personagens-ricky-e-morty-parte-1-4g9b)
&lt;/code&gt;&lt;/pre&gt;

</description>
    </item>
  </channel>
</rss>
