Exportando arquivos CSV com MongoDB

Olá, hoje exportaremos arquivos CSV com o MongoDB. O MongoDB é um banco de dados não-relacional que traz o conceito de Banco de Dados Orientado a Documentos. Ele tem como característica conter informações importantes em um único documento. Deste modo, possibilita a consulta de documentos através de métodos avançados de agrupamento e filtragem.

Caso você não conheça o MongoDB e não saiba fazer um CRUD básico, recomendo a leitura do artigo:

https://www.mundojs.com.br/2020/03/17/crud-basico-com-mongodb/

Caso já conheça, mas queira importar arquivos CSV, recomendo o seguinte artigo:

(Vamos utilizar esse artigo como base do nosso estudo)

https://www.mundojs.com.br/2020/03/27/importando-arquivos-com-mongodb/

E arquivos JSON:

https://www.mundojs.com.br/2020/03/30/importando-arquivos-json-com-mongodb/

Exportando arquivos JSON:

https://www.mundojs.com.br/2020/04/01/exportando-arquivos-json-com-mongodb/

Com o seu mongoDB devidamente configurado, começaremos a exportar os arquivos.

Primeiro, precisamos abrir o diretório em que trabalharemos. Utilize o comando cd diretorio para especificar o diretório a ser trabalhado.

Utilizando o comando mongoexport, precisamos especificar o nosso host, que no meu caso é 127.0.0.1. Após isso, utilizaremos a sintaxe –db nomedodocumento, que especifica em qual documento está o arquivo a ser exportado. Caso não exista, será criado.

Utilizaremos também a sintaxe –collection nomedacollection, que cria/especifica qual a coleção.

Especificados o host, nome do documento e nome da collection, precisamos especificar o tipo de arquivo. Usamos o –type csv para especificá-lo. Também precisamos do nome do arquivo  + extensão a ser exportado. Como já sabemos, o nosso arquivo é o cities.csv, e você usa a sintaxe –out para isso.

Utilizaremos o método –field para especificar os nomes dos campos a ser utilizados no CSV. Vamos utilizar os campos id,LatD,LatM,LatS,NS,LonD,LonM,LonS,EW,City,State.

E o comando ficará assim:

mongoexport --host=127.0.0.1 --db enderecos --collection listaenderecos --type=csv --out cities.csv --fields id,LatD,LatM,LatS,NS,LonD,LonM,LonS,EW,City,State

E a saída será:

connected to: mongodb://127.0.0.1/
exported 128 records

Com isso, exportamos nosso arquivo CSV com sucesso!

Verifique o diretório para confirmar a exportação do seu arquivo CSV.

Gostou deste artigo? Comente abaixo!

Diferenças entre for…of e for…in

Você conhece o loop For…Of?

Este loop é específico para iterar entre os elementos de uma lista. Ele percorre objetos iterativos, chamando uma função personalizada com instruções a serem executadas para o valor de cada objeto distinto.

Sintaxe:

for (variavel of iteravel){
   //Seu código aqui
}

Você pode fazer a leitura como: “Para cada item de uma lista”. No exemplo, dia começará com o valor “segunda” e o último valor será “sexta”.

O for…of percorre a lista de forma crescente, então ele irá mostrar de forma crescente os valores do seu vetor. Simples, não?

E o for..in?

O laço de repetição for…in interage sobre as propriedades enumeradas de um objeto, em sua ordem original de inserção. O laço pode ser executado para cada uma das propriedades distintas do seu objeto. É recomendável não adicionar, remover ou alterar propriedades do objeto durante a execução do laço for…in, pois, se uma propriedade é deletada durante a execução do loop, ela se torna indisponível para ser acessada depois. O loop for in retorna uma string com o nome das propriedades e seus respectivos valores

A sua sintaxe é:

for (variavel in objeto) {
    //Seu código aqui
}

Mas e quais são as suas diferenças entre os dois laços?

for…in

O loop for…in é usado para percorrer as propriedades de um objeto. Por exemplo:

let objetoComum = {
    nome: 'Nome',
    idade: '30'
}
for (let propriedade in objetoComum){
    console.log("Propriedade " + propriedade + "=" + objetoComum[propriedade])
}

for…of

Já o loop for…of é usado para percorrer objetos iteráveis, como Array, Map etc.

Utilizando o mesmo exemplo, mas usando o for…of:

let objetoComum = {
    nome: 'Nome',
    idade: '30'
}
for (let propriedade of objetoComum){
    console.log(propriedade)
}

Teremos a saída:

objetoComum is not iterable

Temos essa saída pois o nosso objeto não é iterável.

Agora, se obtivermos um objeto iterável, seria o seguinte:

let arrayComum = [10, 20, 30, 40, 50]

for (let elemento of arrayComum){
    console.log(elemento)
}

Nossa saída seria:

10
20
30
40
50

Gostou deste artigo? Comente abaixo!

Criando Pokedéx com React – Final

Olá pessoal! Chegamos a última parte do nosso tutorial Pokedex com React! Nesta última parte, gerenciaremos o estado e buscaremos dados da poke api. Por fim, usaremos os dados do Pokemón para preenchimento do nosso DetailView. Para dar sequência, você precisará dos artigos anteriores:

Passing Events:

Precisamos criar um evento de clique para cada um dos nossos PokeCells, afim de buscar os dados Pokemón da Poke API. Para fazer isso, criaremos a função como parte da classe APP e depois transmitiremos como props para cada um de nossos PokeCells.

Abra o arquivo App.js e cria uma função chamada handleOnClick, com o parâmetro id. No corpo da função, inclua um console.log do argumento id.

import React, { Component } from 'react';
import PokeList from './PokeList';
import DetailView from './DetailView';
import './styles/App.css';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  handleOnClick(id){
    console.log(id);
  }

  render() {
    return (
      <div className = "App">
        <PokeList />
        <DetailView />
      </div>
    );
  }
}

Precisamos passar esta função através do componente PokeList. Adicione a função handleOnClick para o PokeList:

render() {
    return (
      <div className = "App">
        <PokeList handleOnClick = {this.handleOnClick} />
        <DetailView />
      </div>
    );
  }

Usamos a palavra-chave this, porque handleOnClick é um método da classe App. No entanto, se não utilizarmos o bind, perderemos o contexto disso quando usarmos essa função no componente PokeList. Então, vamos vincular handleOnClick à classe atual:

class App extends Component {
  constructor() {
    super();
    this.state = {};

    this.handleOnClick = this.handleOnClick.bind(this);
  }

Agora, abra o seu arquivo PokeList.js e siga esta etapa:

  1. Desconstrua o handleOnCLick a partir dos argumentos PokeList;
  2. Adicione o método handleOnClick como um prop de PokeCells:
const PokeList = ({handleOnClick}) => {
    const cells = pokeClasses.map(pokeClass => {
        return (
            <PokeCell 
                key = {pokeClass.id}
                pokeClass = {pokeClass}
                handleOnClick = {handleOnClick}
            />
        );
    });

    return (
        <section className="poke-list">
            {cells}
        </section>
    )
}

Abra seu arquivo PokeCell e siga os seguintes passos:

  1. Desconstrua o handleOnClick a partir dos argumentos PokeCell;
  2. Adicione um evento onClick dentro da guia do botão e atribua a ele uma função anônima que chama handleOnClick com a variável id como parâmetro;

Agora, sempre que clicarmos no botão PokeCell, o ID do Pokémon clicado será registrado no console:

import React from 'react';
import sprites from '../assets/sprites.png';
import './styles/PokeCell.css';

const PokeCell = ({ pokeClass, handleOnClick }) => {
  const { id, backgroundPosition } = pokeClass;
  const style = { backgroundImage: `url(${sprites})`, backgroundPosition};

  return <button onClick={() => handleOnClick(id)} style={style} className="poke-cell"></button>
};

export default PokeCell;

Pokemon Helper:

Vamos criar uma classe Pokemon para limpar os dados da API que vamos buscar. Dessa forma, podemos gerenciar os dados de Pokemon mais facilmente. Dentro do diretório src, crie um arquivo Pokemon.js. Dentro deste arquivo Pokemon.js, adicione o código:

class Pokemon {
    constructor(data) {
        this.id = data.id;
        this.name = data.name;
        this.sprite = data.sprites.front_default;
        this.type = data.types[0].type.name;
    }
}

export default Pokemon;

Agora, quando buscarmos os dados, instanciaremos um novo objeto Pokemon e passa-lo aos dados buscados.

Buscando os dados:

Abra o arquivo App.js e siga estas etapas:

  1. Importe a classe Pokemon na parte superior do arquivo;
  2. No método handleOnClick, faça um fetch para a API. Adicione uma rota de URL dinâmico com o argumento id;
  3. Resolve a promise e crie uma nova instância de Pokecom com os dados buscados;
  4. Adicione um console.log do objeto Pokemon para ver os dados do Pokemon quando um PokeCell é clicado.
handleOnClick(id){
  fetch(`http://pokeapi.co/api/v2/pokemon/${id}/`)
  .then(res=> res.json())
  .then(data => {
    const pokemon = new Pokemon(data);

    console.log(pokemon);
  })
  .catch (err => console.log(err));
}

State:

Agora que nós já realizamos o fetch dos dados dos Pokemon, precisamos passar esses dados para o DetailView para mostrá-los.

Para fazer isso, precisamos tirar o objeto Pokemon da promise resolvida e armazená-lo no estado de nosso aplicativo. Na função construtora do componente App, adicione uma nova chave ao objeto de estado com o valor de um objeto vazio.

constructor() {
    super();
    this.state = {
      pokemon: {}
    };

    this.handleOnClick = this.handleOnClick.bind(this);
  }

Para atualizar o estado do pokemon, o React nos fornece uma função chamada setState. Essa função usa um objeto como argumento, onde precisamos especificar a chave que queremos atualizar e atribuir um novo valor a ele. Toda vez que essa função é chamada, o React renderiza novamente todos os componentes filhos.

handleOnClick(id){
    fetch(`http://pokeapi.co/api/v2/pokemon/${id}/`)
    .then(res=> res.json())
    .then(data => {
      const pokemon = new Pokemon(data);

      this.setState({pokemon});
    })
    .catch (err => console.log(err));
  }

Agora que armazenamos nossos dados de Pokemon no estado do aplicativo, podemos acessá-los na função de renderização. Passe o estado pokemon para o componente DetailView como um suporte. Como a propriedade state faz parte da classe App, precisamos incluir a palavra-chave this para acessá-la:

render() {
    return (
      <div className = "App">
        <PokeList handleOnClick = {this.handleOnClick} />
        <DetailView pokemon = {this.state.pokemon} />
      </div>
    );
  }

Exibindo os dados:

Abra o arquivo DetailView.js e siga estas etapas:

  1. Desconstrua o pokemon a partir dos argumentos DetailView;
  2. Desconstrua o ID, nome, Sprite e tipo da variável pokemon;
  3. Na tag da imagem, adiciona um atributo src e atribua a variável Sprite envolvida em chaves;
  4. Entre as tags h1, adicione as variáveis id e name envoltas em chaves;
  5. Na tag p, adicione a variável type envolvida em chaves.
import React from 'react';
import './styles/DetailView.css';

const DetailView = ({pokemon}) => {
    const { id, name, sprite, type } = pokemon;

    return (
        <section className="detail-view">
            <img src={sprite} className='sprite-image' alt='sprite' />
            <div className='data-wrapper'>
                <h1 className='data-name'>ID: {name}</h1>
                <p className="data-char">Type: {type}</p>
            </div>
        </section>
    )
}

export default DetailView;

E com isso, terminamos a nossa PokeDex! Gostou desta sequência de artigos? Comente abaixo!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-5-b61d730de5fc

Lendo e renderizando arquivos XML com JavaScript

Olá pessoal, neste artigo demonstrarei como ler e renderizar no seu HTML um arquivo XML, usando JavaScript. Para isso, necessitaremos de um servidor local, como Xamp ou Wamp server, por exemplo. No nosso exemplo, utilizaremos o Xamp.

Vamos começar?

Primeiro, criaremos um arquivo XML de exemplo. No nosso arquivo XML, teremos um catálogo com CDs. Cada CD possui um título e um artista. É importante especificar o tipo de codificação de caracteres no cabeçalho do nosso XML. O tipo de caractere usado nesse exemplo é do conjunto UTF-8.

Representaremos o catálogo com a tag <CATALOG>. Os CDs serão representados com a tag <CD> e teremos três CDs. Cada CD possui duas tags: <TITLE> e <ARTIST>, que possuem o nome do disco e nome do artista, respectivamente.

<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
    </CD>
    <CD>
        <TITLE>Hide your heart</TITLE>
        <ARTIST>Bonnie Tyler</ARTIST>
    </CD>
    <CD>
        <TITLE>Pavarotti Gala Concert</TITLE>
        <ARTIST>Luciano Pavarotti</ARTIST>
    </CD>
</CATALOG>

Pronto, agora que já temos o nosso arquivo XML, precisamos de um script JavaScript para realizar a leitura e renderizar o nome de cada disco e artista no DOM.

Dentro de um documento HTML, abra uma tag <script> e, dentro de uma estrutura condicional, utilize o XMLHttpRequest para que ocorra a transferência de dados entre o cliente e o servidor. Começaria assim:

<script>
    if (window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
     } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     }
</script>

O ActiveXObject é utilizado para suporte em Internet Explorer, sendo opcional no nosso exemplo.

Precisamos utilizar agora os métodos open() e send(), para abrir e enviar ao servidor/cliente o nosso arquivo XML a ser lido. Utilizaremos o método GET para isso.

if (window.XMLHttpRequest){
    xmlhttp = new XMLHttpRequest();
} else {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET", "file.xml", false);
xmlhttp.send();

Agora, utilizando o método responseXML, faremos a leitura do documento XML:

document.write("<table border='1'>");

Com nossa tabela criada, precisamos agora capturar a tag XML que contém os atributos título e artista. Como sabemos, essa tag é a CD. Utilizaremos o getElementsByTagName para capturarmos esses valores:

let x = xmlDoc.getElementsByTagName("CD");

Feito isso, criaremos um laço de repetição para percorrer esta tag CD e, assim, imprimir os conteúdos. Utilizaremos o childNodes e o nodeValue para capturar o conteúdos das tags <ARTIST> e <TITLE> do XML:

for (let i = 0; i < x.length; i++){
    document.write("<tr><td>");
    document.write("Artista: " + x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
    document.write("</br>")
    document.write("Disco: " + x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
    document.write("</td></tr>");
}

E por fim, fecharemos nossa tag <table>:

document.write("</table>");

O seu resultado deve ser algo parecido com isso:

O código JavaScript completo é este:

<script>
    if (window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET", "file.xml", false);
    xmlhttp.send();
    xmlDoc = xmlhttp.responseXML;

    document.write("<table border='1'>");
    let x = xmlDoc.getElementsByTagName("CD");
    for (let i = 0; i < x.length; i++){
        document.write("<tr><td>");
        document.write("Artista: " + x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
        document.write("</br>")
        document.write("Disco: " + x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
        document.write("</td></tr>");
    }
    document.write("</table>");
</script>

Gostou deste artigo? Comente abaixo!

Classes JavaScript: Uma introdução – Parte 1

As classes foram introduzidas no JavaScript no ECMAScript 2016, são simplificações para as heranças baseadas em prototypes. A sintaxe para classes não introduz nenhum modelo novo de herança de orientação a objetos em JS, mas provém uma maneira mais simples e clara de criar objetos e lidar com herança. As Classes são funções especiais e a sintaxe de uma classe possui dois componentes: class expressions e class declarations.

Como declarar classes?

Você pode usar uma declaração de classe para definir uma class. Utilize a palavra-chave class seguida pelo nome. Por exemplo:

class Sayajin {
    constructor(nome, poder){
        this.nome = nome;
        this.poder = poder;
    }
}

Aqui, definimos que nosso Sayajin possui um nome e poder de luta.

Hoisting:

Precisamos ter em mente que existe uma diferença entre declarar funções e classes. Primeiro, precisamos declarar a classe, para depois acessá-la. Caso contrário, o código lançará uma exceção ReferenceError.

const kakarotto = new Sayajin(); // ReferenceError

class Sayajin {}

O que são Expressões de Classes?

São formas de definir classes. Elas podem possuir nomes ou ser anônimas. O nome de uma expressão de classe é local ao corpo da classe.

// Anônima
let Sayajin = class {
    constructor(nome, poder){
        this.nome = nome;
        this.poder = poder;
    }
};

// Nomeada

let Sayajin = class Sayajin {
    constructor(nome, poder){
        this.nome = nome;
        this.poder = poder;
    }
};

Definindo métodos:

O corpo de uma classe é a parte que está entre as chaves {}. No corpo, você define os membros da sua classe, como os construtores, ou os métodos. Os corpos das Declarações de Classes e Expressões de Classes são executados em modo estrito.

Construtor:

O constructor é um método especial para criar e iniciar um objeto criado pela classe. Só pode existir um método especial com o nome “constructor” dentro de cada classe. Utilize a palavra-chave super para chamar o construtor de uma classe pai.

Método:

Métodos são funções, mas seguem a lógica das propriedades. Você chama um método, e percebe que é parecido com acessar uma propriedade, mas você coloca () no final do nome do método, possivelmente com argumentos. No exemplo abaixo, definimos e usamos o método nivelPoder() na classe Sayajin. Nosso método nivelPoder nos traz uma string, contendo o nome do Sayajin e seu poder de luta:

nivelPoder(){
    return `${this.nome} possui um poder de luta de mais de ${this.poder}!!!`;
}

Static Method:

A palavra-chave static define um método estático de uma classe. Eles são chamados sem instanciação e não podem ser chamados quando a classe é instanciada. Aqui, definimos o método estático kaioken, que retorna o poder do Sayajin multiplicado por 10:

class Sayajin {
    constructor(nome, poder){
        this.nome = nome;
        this.poder = poder;
    }

    static kaioken(a){
        const kaiokenXDez = a.poder * 10;
        return kaiokenXDez;
    }

    nivelPoder(){
        return `${this.nome} possui um poder de luta de mais de ${this.poder}!!!`;
    }
}

const kakarotto = new Sayajin("Kakarotto", 8000);
console.log(kakarotto.nivelPoder()); //Undefined
console.log(Sayajin.kaioken(kakarotto)); // 80000

Gostou deste artigo? Comente abaixo!

ES6: Default Parameters e Rest Parameter

O ECMAScript 6 foi a primeira atualização significativa para a linguagem desde o lançamento do ES5, que foi lançado em 2019. O Babel é uma ferramenta utilizada para pré-processar JavaScript, e nos permite usar algumas novas funcionalidades que ainda são experimentais, ou seja, estão em ambiente de testes. Atualmente, o ECMAScript já está em fase de experimentos da sua versão 2021, mas hoje, falaremos de duas importantes implementações do ES6: Default Parameters e Rest Parameter:

Default Parameters:

Para nos auxiliar na criação de funções mais flexíveis, o ES6 nos trouxe uma nova funcionalidade chamada Default Parameters para ser utilizada nas nossas funções. Por exemplo:
let saudacao = (nome = "Anônimo") => "Olá " + nome;
console.log(saudacao());
console.log(saudacao("Lúcio"));

// Olá Anônimo

// Olá Lúcio
O Default Parameter entra em ação quando você não especifica o argumento, ou seja, é indefinido. No nosso exemplo acima, o parâmetro nome recebe o valor padrão “Anônimo” quando você não fornece um valor como argumento.
Você pode passar mais valores padrão para quantos parâmetros você desejar:
let incrementar = (numero, valor = 8) => numero + valor;

console.log(incrementar(5));

// 13
Como você pôde perceber, o valor 8 não foi sobrescrito, trazendo 13 como resultado.

Rest Parameter

O ES6 também nos trouxe uma possibilidade de passar o Rest parameter como parâmetros de função, tornando possível a criação de funções que recebem um número variável de argumentos e esses argumentos são armazenados em um array que pode ser acessado posteriormente de dentro da função. O rest parameter elimina a necessidade de verificar a “args” e permite aplicar os métodos map(), reduce() e filter() no array de parâmetros.
Por exemplo, faremos uma função de multiplicação que receberá qualquer número nos seus argumentos e realizará uma multiplicação.
let multiplica = (...args) => {
    return args.reduce((a, b) => a * b, 1);
}

console.log(multiplica(10, 2, 10));

// 200

Com isso, vimos dois dos mais importantes recursos do JavaScript moderno que muita gente ainda desconhece. É importante sempre atualizar os seus conhecimentos da linguagem, pois ela está sempre em constante evolução, com novas funcionalidades, novos frameworks e bibliotecas para tornar seu código mais limpo, rápido e eficiente.

Gostou deste artigo? Comente abaixo!

Criando localhost básico para testes

Neste artigo, mostrarei como criar um localhost básico para testes rápidos, utilizando Nodejs + expressjs.
Em redes de computadores, o Localhost se refere ao computador que o está executando, funcionando basicamente como um servidor virtual. Ele também possui um endereço ip, variando de 127.0.0.0 a 127.255.255.255. Com um localhost você pode:

  • Testar Velocidade: você pode testar a velocidade de execução de equipamentos. No windows, você pode usar o comando ping localhost ou ping 127.0.0.1 no prompt de comando;
  • Testar aplicações: Assim que você utiliza o localhost, sua máquina se transforma em um servidor simulado;
  • E muito mais!

E como podemos criar um localhost para testes?

Para isso, precisaremos do Nodejs. É com ele que rodaremos JavaScript no Server-side.Você pode realizar o download em: https://nodejs.org/en/

Também utilizaremos o framework Express.js. Para realizar o download, abra o terminal e digite:

$ npm install express --save

Após isso, dê o comando:

npm start

E os arquivos package e package.json serão criados!

Crie um arquivo chamado index.js e vamos lá!

Iniciando

Para iniciar, precisamos fazer uma requisição para o módulo express que foi baixado. No seu arquivo index.js, comece com isso:

const express = require('express');
const app = express();

Criando as constantes express e app, fazemos a requisição do módulo express.

Com o módulo express, foram baixadas as dependências do módulo. Você pode verificá-las na pasta public. Com o método use, podemos utilizar diretamente os arquivos da pasta public.

app.use(express.static('./public'));

Agora que já estamos utilizando as dependências do express, podemos criar um método para escutar a porta na qual o localhost será executado. usando o app.listen(), mostraremos no console.log a porta e a url do nosso localhost:

app.listen(3000, function () {
    console.log('Porta 3000');
    console.log('link: http://localhost:3000/index.html');
});

Agora que já sabemos qual é a porta e qual a url do nosso localhost, vejamos no navegador:

Com isso, verificamos que o nosso localhost para testes está funcional!

Gostou deste artigo? Comente abaixo e mostre-nos outras alternativas de localhost!

Criando Pokedéx com React – Parte 4

Na parte 4 do nosso tutorial, vamos fazer o componente DetailView. Você poderá conferir a parte 3 no link: https://www.mundojs.com.br/2020/04/03/criando-pokedex-com-react-parte-3/

DetailView:

Vá para a sua pasta componentes e crie um arquivo chamado DetailView.js. Também vá para a pasta styles e crie o arquivo DetailView.css.

Abra o DetailView.js e siga esses passos:

  1. Importe o React;
  2. Importe o DetailView css;
  3. Cria uma nova função chamada DetailView;
  4. Retorne uma section vazia com className=”detail-view”;
  5. Adicione elementos para mostrar os dados e a imagem;
  6. Exporte a nova função criada.
import React from 'react';
import './styles/DetailView.css';

const DetailView = () => {
    return (
        <section className="detail-view">
            <img className='sprite-image' />
            <div className='data-wrapper'>
                <h1 className='data-name'></h1>
                <p className="data-char"></p>
            </div>
        </section>
    )
}

export default DetailView;

No seu arquivo DetailView.css, adicione o seguinte código:

.detail-view {
    width: 50%;
    height: 100%;
    padding: 10px;
    background-color: #df095e;
    border-top-right-radius: 10px;
    border-bottom-right-radius: 10px;
    display: flex;
    flex-direction: column;
    justify-content: center;
}

.sprite-image {
    width: 80%;
    height: 150px;
    margin: 10px auto;
    background-color: #585858;
    border: 15px solid #DEDEDE;
    color: #585858;
}

.data-wrapper {
    width: 80%;
    height: 110px;
    padding: 10px;
    margin: 0 auto;
    background-color: #585858;
    border-radius: 5px;
    box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.22);
    color: #FFF;
}

.data-name {
    margin: 0 0 5px;
}

.data-char {
    font-size: 10px;
}
  1. O sprite-image conterá o Sprite Pokemón;
  2. A classe data-chat refere-se às características do Pokemón (id, nome, tipo).

No App.js, importe o componente DetailView. Renderize-o colocando o componente DetailView como uma tag html dentro do elemento pai.

import React, { Component } from 'react';
import PokeList from './PokeList';
import DetailView from './DetailView';
import './styles/App.css';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
    return (
      <div className = "App">
        <PokeList />
        <DetailView />
      </div>
    );
  }
}

export default App;

E este será o resultado:

Está gostando desta sequência de artigos? Comente abaixo!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-4-72afd23905a6

Baixando múltiplas imagens com JavaScript

Olá pessoal, neste artigo, ensinarei a baixar múltiplas imagens de um site, usando um algoritmo para busca e download das imagens. Utilizarei o navegador Google Chrome neste exercício.

Vamos começar!

Primeiramente, precisamos abrir o console do nosso navegador. Podemos abrí-lo clicando f12 e acessando o console. Vamos utilizar o site https://www.mundojs.com.br/ para realizar o teste de download das imagens.

Com o site acessado e o console aberto, vamos começar criando uma variável chamada images. Esta variável receberá um querySelectorAll de todas as tags “img”.

let images = document.querySelectorAll('img');

Pronto, já temos todas as tags “img” na nossa variável images. Agora, precisamos percorrer esta lista de tags para realizarmos o download. Vamos utilizar o for…of para isso:

Caso você não conheça o laço de repetição for…of, recomendo a leitura deste artigo, com explicação em vídeo sobre o for…of.

for (let i of images){
    
}

Dentro do nosso laço for…of, precisamos criar um elemento “a”. Esse elemento receberá o atributo src da imagem.

let a = document.createElement('a');
a.href = i.src;

E iremos mostrar o elemento no console.

console.log(i);

Feito isso, criaremos uma pop-up de download. O browser fará o download de cada imagem em cada link do elemento i.

a.download = i.src;

Feito isso, adicionaremos o nosso elemento “a” ao body, utilizando o método appendChild():

document.body.appendChild(a);

E adicionaremos o evento click() ao elemento a, para, então, desanexar o elemento “a” do body, utilizando o método removeChild():

a.click();
document.body.removeChild(a);

E com isso, está pronto o nosso algoritmo para download de múltiplas imagens. O código completo é este:

let images = document.querySelectorAll('img');

for (let i of images){
    let a = document.createElement('a');
    a.href = i.src;
    console.log(i);
    a.download = i.src;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
}

Abra o site do MundoJS, e insira este código no console. Aceite os múltiplos downloads no navegador e o código irá baixar as fotos disponíveis com a tag “img”.

Gostou deste artigo? Comente abaixo e compartilhe com seus amigos!

Criando Pokedéx com React – Parte 2

Na parte 2 do nosso projeto, construiremos o layout básico do nosso projeto. Você precisará da Parte 1 para dar sequência neste artigo.

Wireframe:

O React tem a ver com construção de componentes. Então, a melhor maneira de fazer isso é criar wireframes para mapeamento dos componentes a serem construídos. O nosso aplicativo principal terá dois componentes: a visualização do Pokemón e a visualização dos detalhes.

O Pokemon view conterá um componente chamado PokeList que envolverá 151 PokeCélulas (da primeira geração de Pokemón). Ao clicar em uma PokeCélula, a visualização dos detalhes mostrará as informações e a sprite do Pokemón selecionado.

Tipos de componentes:

O React possui 2 tipos básicos de componentes: stateful (com estado) e stateless (sem estado). Os componentes Stateful têm seu próprio estado. No nosso aplicativo, o componente APP será Stateful, pois manterá o estado dos dados do Pokemón.

Vamos construir!

Abra o App.js e exclua todo o conteúdo interno. A primeira etapa é importar o pacote React e desconstruir a classe Component.

import React, { Component } from 'react';

Agora, precisamos criar um novo aplicativo que estenda o Componente. Todos os componentes Stateful requerem dois métodos principais:

  1. Construtor: onde inicializamos o nosso estado;
  2. Render: onde escrevemos nosso jsx.

No construtor, precisamos chamar a função super(), pois estamos estendendo da classe componente. Além disso, precisamos declarar nosso estado inicial. Por enquanto, será um objeto vazio.

import React, { Component } from 'react';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }
}

Adicionaremos o método render. Ele retorna a sintaxe jsx, que é uma mistura de JavaScript e HTML. O método render só pode retornar um elemento, portanto, criaremos um elemento pai e aninharemos filhos dentro dele. Se estamos retornando um elemento aninhado, envolveremos ele entre parênteses.

import React, { Component } from 'react';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
    return (
      <div className = "App">

      </div>
    );
  }
}

Feito isso, importaremos nossa folha de estilo na parte superior para adicionar o CSS do nosso componente e exportar toda a classe para que possamos usá-la em outros arquivos.

import React, { Component } from 'react';
import './styles/App.css'
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
    return (
      <div className = "App">

      </div>
    );
  }
}

export default App;

Abra o seu arquivo App.css e adicione o seguinte css:

.App {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 650px;
    height: 400px;
    padding-left: 10px;
    margin: 50px auto;
    background-color: #FE0065;
    border-radius: 10px;
    box-shadow: 0 14px 45px rgba(0, 0, 0, 0.22), 0 18px 45px rgba(0, 0, 0, 0.22);
}

 

  1. Usamos o display: flex para separar as duas visualizações que construiremos;
  2. Fixamos a largura e altura para a tela do desktop;
  3. Aplicamos margem superior e inferior para separar a vista dos cantos e esquerda e direita automaticamente para coloca-los no meio;
  4. Aplicamos cor ao fundo.

Com isso, concluímos a Parte 2! Até a próxima!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-2-3d119b07f9e0