Conheça o Deno, uma runtime JavaScript

O Deno é uma runtime simples, moderna e segura para JavaScript e TypeScript que utiliza o V8 e é construída em Rust.

Idealizado por Ryan Dahl, o criador do Node.js, o Deno é uma implementação totalmente nova, e não um novo fork do node.

A proposta do Deno é prover uma ferramenta standalone, ou seja, permite a criação de uma rápida solução para funcionalidades complexas, sendo sua abordagem a de um único arquivo executável.

  • O Deno é seguro por padrão. Não há acesso a arquivos, redes ou ambientes, a menos que seja explicitamente ativado;
  • Possui suporte ao TypeScript;
  • Envia apenas um único arquivo executável;
  • Possui utilitários embutidos, como um inspetor de dependências e um formatador de código;
  • Possui um conjunto de módulos padrão revisados que garantem o funcionamento com o Deno.

Como Instalar:

Para instalá-lo, você precisará usar os instaladores abaixo ou fazer o download de um binário da versão.

PowerShell (Windows)

iwr https://deno.land/x/install/install.ps1 -useb | iex

Shell (Max, Linux)

curl -fsSL https://deno.land/x/install/install.sh | sh

Chocolatey (Windows)

choco install deno

Iniciando com Deno:

Você pode tentar executar um programa simples dos próprios exemplos do Deno:

deno run https://deno.land/std/examples/welcome.ts

Ou realizar algo mais complexo:

import { serve } from "https://deno.land/std@0.54.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Olá Mundo\n" });
}

Você encontra instruções mais detalhadas no manual.

Documentação da Runtime:

A documentação básica da runtime do Deno é encontrada em: doc.deno.land. O Deno vem com um manual que contém explicações detalhadas sobre as funções complexas da runtime, uma introdução aos conceitos nos quais o Deno foi construído e como incorporar o Deno no seu próprio aplicativo. Junto à runtime, também é oferecida uma lista de módulos padrão que são revisados pela equipe principal do Deno. O Deno também pode importar módulos a partir de qualquer localização na web, como o GitHub, Cnd, entre outros. O deno.land também oferece um serviço de hospedagem pública simples para módulos ES que funcionam com o Deno.

Gostou desta notícia? Comente abaixo!

MERN stack, o que é?

Você já ouviu falar no termo MERN stack?

Por definição, MERN significa:

  • (M) MongoDB;
  • (E) ExpressJs;
  • (R) React;
  • (N) Node.js;

Ou seja, é chamado de MERN stack o profissional que domina todas essas quatro tecnologias. É uma stack que permite a criação de sites/sistemas completos (back-end e front-end) utilizando JavaScript no lado do Cliente e lado do Servidor. Com isso, o desenvolvedor fica apto a criar sites/sistemas completos, sem precisar conhecer outra tecnologia ou utilizar outra habilidade. O MERN stack representa uma aliança das tecnologias mais poderosas do mercado, pois oferece a possibilidade de dominar a parte de algoritmos e lógica utilizada no back-end, juntamente com os componentes de design, UX e animações que o front-end é responsável. Isso traz uma competência para apenas um desenvolvedor, onde, normalmente, seriam exigidos dois.

Atualmente, com a alta utilização do JavaScript, o MERN stack é um dos profissionais mais requisitados no mercado.

E quais são as tecnologias utilizadas?

  • MongoDB: É um banco de dados não-relacional. É utilizado na MERN stack pois os dados são manipulados no formato JSON.
  • Node.js: O Node.js trabalha com JavaScript, ou seja, um desenvolvedor que conheça bem a linguagem JavaScript não terá dificuldades em aprender Node.js.
  • Express.js: Um middleware dedicado ao gerenciamento de apps web complexos, é usado para criação de API REST. A API REST corresponde a um site que recuperará dados por meio de solicitações HTTP.
  • React.js: Responsável pelo front-end, é uma biblioteca JavaScript desenvolvida e utilizada pelo Facebook. Responsável por fazer, de maneira extremamente rápida, animações, uploads e transições.

Assim como a MERN stack, também temos a MEAN stack onde o React não é utilizado, mas sim o Angular, alterando somente a biblioteca/framework utilizado no Front-end. Utilizando o Vue.js, teremos o MEVN stack, ou seja, são muitas as opções para quem quer dominar Front e Back-end utilizando JavaScript!.

Dominando essas tecnologias, você é um desenvolvedor MERN/MEAN/MEVN stack!

Gostou deste artigo? Comente abaixo!

Referências:

 

UPDATE e DELETE simples com MongoDB + NodeJS

Dando sequência ao CRUD com MongoDB e NodeJS, no artigo anterior foram mostrados os métodos CREATE e READ. Neste artigo, demonstrarei como fazer um UPDATE e DELETE básicos.

UPDATE

Você pode utilizar o método updateOne() para atualizar um documento na sua coleção, passando como parâmetro o objeto a ser atualizado. O segundo parâmetro é o objeto que define os novos valores do documento.

Se a consulta encontra mais de um registro, somente a primeira ocorrência será atualizada.

Para realizar este update, vamos salvar o nosso valor a ser alterado em uma variável chamada valorAntigo e, também, adicionar os novos valores em outra variável, chamada valorNovo. Feito isso, vamos passar essas duas variáveis como parâmetro do nosso método updateOne().

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    let valorAntigo = {
        name: 'Usuario 1'
    };
    let valorNovo = { 
        $set: {
            name: 'Usuario Novo', endereco: 'Rua Nova' 
        } 
    };
    dbo.collection("clientes").updateOne(valorAntigo, valorNovo, function (err, res){
        if (err) throw err;
        console.log('Documento atualizado');
        db.close(); 
    });
});

Executando o arquivo, teremos uma mensagem no terminal, dizendo: “Documento atualizado”.

Podemos também apenas alterar um valor específico. Para isso, passamos à variável valorNovo apenas o novo valor do campo.

Você pode atualizar diversos campos utilizando o método updateMany().

Para verificar o seu documento atualizado, utilize o método find().

DELETE

Para excluirmos um documento, usamos o método deleteOne(), que especifica o documento a ser excluído. Devemos passar como parâmetro o campo do registro a ser excluído. Por exemplo, excluiremos o nosso “Usuario Novo”.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db){
    if (err) throw err;
    let dbo = db.db('mydb');
    let excluirDocumento = { name: 'Usuario Novo' };
    dbo.collection('clientes').deleteOne(excluirDocumento, function(err, obj){
        if (err) throw err;
        console.log("1 documento deletado");
        db.close();
    });
});

E você deverá ver no seu terminal a mensagem: “1 documento deletado”.

Você pode utilizar o método deleteMany() para deletar múltiplos documentos.

Verifique, utilizando o método find(), que o seu registro está vazio.

Gostou deste artigo? Comente abaixo!

CREATE e READ simples com MongoDB + NodeJS

Neste artigo criarei um CREATE e READ básico utilizando MongoDB e Node.js. Caso você não conheça o MongoDB, recomendo a leitura deste artigo que explica como realizar as operações CREATE, READ, UPDATE e DELETE no shell do MongoDB.

O MongoDB é um NoSQL. Com o Node.js, iremos acessar o banco de dados usando o node. Crie uma pasta chamada crud_mongo e abra-a no code. Abra o terminal do code para prosseguir com o artigo.

Precisamos instalar o driver oficial do MongoDB. Utilizando o NPM, vamos baixar o pacote do Mongo.

npm install mongodb

Pronto. Agora temos o pacote instalado na nossa aplicação. Com isso, já é possível manipular bases de dados do MongoDB com o Nodejs.

CRIANDO A BASE DE DADOS

Para criar o banco de dados, vamos fazer uma requisição de um objeto MongoClient, especificando o URL de conexão com o endereço do localhost, a porta a ser utilizada e passando o nome da base de dados a ser criada.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function(err, db){
    if (err) throw err;
    console.log("Banco de Dados criado!");
    db.close();
})

Execute o arquivo no seu servidor NodeJS. Você verá a mensagem: Banco de Dados Criado!

Observação: O banco de dados não é exatamente criado até que ele receba conteúdo. Vamos inserir conteúdo nesta base a seguir.

CRIANDO UMA COLEÇÃO

Para criar uma coleção na nossa base de dados, usaremos o método createCollection(). Neste médodo, passaremos o nome da coleção a ser criada.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    dbo.createCollection("clientes", function (err, res) {
        if (err) throw err;
        console.log("Coleção criada");
        db.close();
    });
});

E pronto, a nossa coleção foi criada!

INSERINDO DOCUMENTOS NA COLEÇÃO

Para inserir um documento (registro) na coleção, podemos utilizar o método insertOne() para registros simples, e insertMany() para registros múltiplos. Vamos realizar uma inserção de apenas um documento na nossa coleção:

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    let myObj = {
        name: "Usuario 1",
        endereco: "Rua teste 1"
    };
    dbo.collection("clientes").insertOne(myObj, function (err, res) {
        if (err) throw err;
        console.log("Documento inserido");
        db.close();
    });
});

Se você tentar inserir documentos em uma coleção inexistente, o MongoDB criará a coleção automaticamente.

READ (find())

Para selecionar os dados de uma coleção no Mongo, podemos utilizar os métodos findOne() e find(), que seleciona um dado e todos os dados da coleção, respectivamente. Utilize o método toArray para retornar os elementos em um vetor.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    dbo.collection("clientes").find({}).toArray(function (err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

E nosso retorno será:

Com isso, já sabemos inserir e pesquisar dados no MongoDB utilizando o NodeJS.

Referência: https://www.w3schools.com/nodejs/nodejs_mongodb.asp

Até o próximo artigo pessoal!

Criando um Web Scraper com NodeJs

O Web Scraping é uma espécie de garimpo da internet. Esse “garimpo” envolve a extração de informações de determinado site. A ideia do Web Scraping é automatizar o trabalho usando bots, que coletam um maior número de dados em uma curta fração de tempo.

O processo de Web Scraping pode ser dividido em duas etapas principais:

  • Buscando o código-fonte HTML do site por meio de uma solicitação HTTP ou usando um navegador Headless;

  • Analisando os dados brutos para extrair apenas as informações de seu interesse.

Para realização deste tutorial, será necessário o Node.js na versão 8.x ou posterior e npm instalados no seu computador.

Vamos começar!

Crie uma pasta chamado scraper e inicie com o code. Abra o terminal do code e execute o comando:

npm init -y

Esse comando inicializará o projeto com um arquivo “package.json”. Deixe-o com seus padrões.

Agora, instalaremos as dependências que utilizaremos para criar o Web Scraper:

npm install axios cheerio puppeteer –save

O que cada dependência faz?

  • Axios: é um cliente HTTP baseado em Promises para Node.js;

  • Cheerio: implementação do jQuery para o Node.js. O Cheerio facilita a seleção, edição e exibição de elementos DOM;

  • Puppeteer: uma biblioteca Node.js para controlar o Chrome ou Chromium.

Web Scrap:

Para demonstrar como fazer Web Scrap em um site utilizando o Node.js, configuraremos um script para capturar algumas informações da tabela do Campeonato Carioca de 2020 (Taça Rio). Especificamente, capturaremos os principais goleadores da competição até o momento e organizaremos os dados como um JSON.

Crie um novo arquivo na sua pasta scrapper, chamado goleadorScrap.js.

1º Passo:

Faça as requisições do axios, cheerio e coloque a url em uma constante (Vamos utilizar o site do globoesporte para fazer esse Web Scrap):

const axios = require('axios');
const cheerio = require('cheerio');
const url = 'https://globoesporte.globo.com/rj/futebol/campeonato-carioca/';

Agora, precisamos utilizar o axios para realizar a leitura do nosso HTML. O axios nos traz uma longa sequência de HTML, mas como analisar esse HTML e extrair apenas os dados que queremos? Esse é o trabalho do Cheerio. Ele nos permite utilizar os métodos jQUery para analisar o HTML e extrair informações que desejamos com ele.

Abra o link e abra as ferramentas de desenvolvedor, pressionando a tecla f12 ou clicando com o botão direito do mouse e Inspecionando. Vamos trazer os dados dos artilheiros do Campeonato Carioca. Como você pode notar, o corpo da tabela possui uma div com classe chamada “ranking-item-wrapper”, que contém as informações de cada jogador. Precisamos de um vetor para armazenar essas informações. O código ficaria assim:

const axios = require('axios');
const cheerio = require('cheerio');
const url = 'https://globoesporte.globo.com/rj/futebol/campeonato-carioca/';

axios(url).then(response => {
    const html = response.data;
    const $ = cheerio.load(html);
    const tabelaStatus = $('.ranking-item-wrapper');
    const tabelaJogador = [];
}).catch(console.error);

Os dados que queremos capturar dessa tabela são:

  • Nome do jogador: criaremos uma constante chamada nomeJogador, que receberá o texto disponível na div com classe “jogador-nome”.

  • Posição do Jogador: qual a posição do jogador. Pegue a classe “jogador-posicao” e capture o seu conteúdo de texto;

  • Número de gols: a quantidade de gols que o jogador fez. Capture o conteúdo da classe “jogador-gols”;

  • Time do jogador: o time para qual o jogador pertence. Nesse atributo, precisamos capturar o texto “alt” da tag “img”, que está aninhada a uma div com classe “jogador-escudo”.

O código ficará assim:

const nomeJogador = $(this).find('.jogador-nome').text();
const posicaoJogador = $(this).find('.jogador-posicao').text();
const numeroGols = $(this).find('.jogador-gols').text();
const timeJogador = $(this).find('.jogador-escudo > img').attr('alt');

Agora, precisamos dar um push no nosso vetor. Para isso, usaremos um .each para criar um laço de repetição, colocando em cada posição do vetor, um objeto com os dados do jogador. Feito isso, mostraremos no console os dados de cada jogador!

Este é o código completo:

const axios = require('axios');
const cheerio = require('cheerio');
const url = 'https://globoesporte.globo.com/rj/futebol/campeonato-carioca/';

axios(url).then(response => {
    const html = response.data;
    const $ = cheerio.load(html);
    const tabelaStatus = $('.ranking-item-wrapper');
    const tabelaJogador = [];

    tabelaStatus.each(function(){
        const nomeJogador = $(this).find('.jogador-nome').text();
        const posicaoJogador = $(this).find('.jogador-posicao').text();
        const numeroGols = $(this).find('.jogador-gols').text();
        const timeJogador = $(this).find('.jogador-escudo > img').attr('alt');
        tabelaJogador.push({
            nomeJogador,
            posicaoJogador,
            numeroGols,
            timeJogador
        });
    });
    console.log(tabelaJogador);
}).catch(console.error);

Faça o teste! Veja o resultado no seu terminal!

Gostou deste exemplo? Comente abaixo!

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

Como instalar o Prettier no VS Code

O Prettier é um formatador de código para o JavaScript, Typescript, HTML, CSS entre outras tecnologias que ajuda a padronizar tudo que uma equipe desenvolve.

Existem plugins Prettier para muitos editores diferentes disponíveis. Aqui vou mostrar a instalação no Visual Studio Code.

1. Instale o plug-in Prettier VS Code

Abra a Paleta de comandos (no submenu Exibir ou use Cmd + Shift + P no Mac e Ctrl + Shift + P no Windows). Em seguida, selecione “Extensões: Instalar extensões”.

Procure por “Prettier”, clique em “Instalar” e depois em “Recarregar” quando a instalação estiver concluída.

2. Execute o Prettier em um arquivo

Agora, se você abrir um arquivo JavaScript e selecionar “Formatar Documento” na Command Palette Prettier, o seu código será arrumado!

3. Execute automaticamente o Prettier ao salvar um arquivo

Abra as configurações da área de trabalho por meio da paleta de comandos. Ative formatOnSave:

{
“pastas”: [],
“configurações”: {},
“editor.formatOnSave”: true,
}
Salve suas configurações e agora seu código deverá ser formatado toda vez que um arquivo for atualizado!

O Prettier também suporta outros idiomas além do JavaScript, por exemplo TypeScript, HTML, CSS ou JSON. No entanto, se você não deseja que eles sejam formatados, pode controlar a configuração formatOnSave por tipo de arquivo:

{
“pastas”: [],
“configurações”: {},
“[javascript]”: {
“editor.formatOnSave”: true
}
}
Formatando código existente com linha de comando
Você pode formatar o código para todo o seu projeto usando a interface da linha de comando (CLI) da Prettier. Primeiro instale a ferramenta CLI:

npm install mais bonito – global
Atualize seu código atual:

mais bonito “* /. ts” – escrever
Feito! Um aviso rápido: atualizar automaticamente a formatação do código significa que você fará um grande commit no controle de origem, onde um grande número de arquivos é atualizado. Isso pode dificultar o uso, por exemplo. git culpa, já que metade das linhas de um arquivo pode ter sido modificada pela última vez no commit do Prettier.

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!