{"id":1152,"date":"2020-03-20T13:37:08","date_gmt":"2020-03-20T13:37:08","guid":{"rendered":"http:\/\/www.andrefelizardo.com.br\/blog\/?p=1152"},"modified":"2021-10-24T19:26:00","modified_gmt":"2021-10-24T19:26:00","slug":"web-components-guia-geral","status":"publish","type":"post","link":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/","title":{"rendered":"Web Components \u2013 Guia Geral"},"content":{"rendered":"\n<p>Neste guia veremos o que s\u00e3o web components, quando usar, sua estrutura e tamb\u00e9m um <em>crash course <\/em>criando um web component do zero que \u00e9 um card Pok\u00e9mon, com v\u00e1rios recursos interessantes.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">O que s\u00e3o web components<\/h2>\n\n\n\n<p>Web Components s\u00e3o elementos customizados reutiliz\u00e1veis constru\u00eddos  com diferentes tecnologias para serem utilizados em aplica\u00e7\u00f5es web.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quando usar<\/h2>\n\n\n\n<p>Voc\u00ea j\u00e1 desenvolveu com <a rel=\"noreferrer noopener\" href=\"http:\/\/www.andrefelizardo.com.br\/blog\/angular-2-nao-continuacao-do-angular-1\/\" target=\"_blank\">Angular<\/a>, <a rel=\"noreferrer noopener\" href=\"http:\/\/www.andrefelizardo.com.br\/blog\/o-que-e-vue-js\/\" target=\"_blank\">Vue.js<\/a> ou <a rel=\"noreferrer noopener\" href=\"http:\/\/www.andrefelizardo.com.br\/blog\/react-js-o-que-e-introducao-ao-react\/\" target=\"_blank\">React<\/a>?  Uma das grandes vantagens da utiliza\u00e7\u00e3o desses frameworks \u00e9 a  reutiliza\u00e7\u00e3o do c\u00f3digo, atrav\u00e9s de componentes customizados. Agora  imagine todo esse poder usando HTML, CSS e JavaScript sem precisar  utilizar nenhum framework, \u00e9 nesse momento que surgem os web components.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Estrutura<\/h2>\n\n\n\n<p>Os web components s\u00e3o formados por tr\u00eas principais tecnologias que  usadas em conjunto permitem criarmos componentes reutiliz\u00e1veis mas  tamb\u00e9m encapsulados, evitando conflito de c\u00f3digo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Elementos customizados<\/h3>\n\n\n\n<p>Elemento customizado \u00e9 a possibilidade de criarmos um elemento por  exemplo <code>&lt;andre-felizardo&gt;&lt;\/andre-felizardo&gt;<\/code> atrav\u00e9s de APIs  do <a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/javascript-comecando-do-jeito-certo\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Javascript (opens in a new tab)\">Javascript<\/a> que permitem definir comportamentos para esse elemento.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Shadow DOM<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><em>DOM<\/em><\/h4>\n\n\n\n<p>Primeiro precisamos entender o que \u00e9 DOM. <\/p>\n\n\n\n<p>Document Object Model \u00e9 uma plataforma que representa como as \nmarca\u00e7\u00f5es HTML (entre outras) s\u00e3o lidas e organizadas pelo navegador que\n voc\u00ea usa. Depois que s\u00e3o carregadas (indexadas) as marca\u00e7\u00f5es se \ntransformam em elementos de \u00e1rvore, que podemos manipular via API.<\/p>\n\n\n\n<p>Entender como essa \u00e1rvore \u00e9 constru\u00edda possibilita que possamos criar c\u00f3digos CSS e Javascript mais perform\u00e1ticos, por exemplo.<\/p>\n\n\n\n<p>Voltando ao Shadow DOM, ele cria um <em>DOM Fantasma<\/em>, \nencapsulado (dentro) do elemento customizado que criamos e \u00e9 renderizado\n de forma separada do DOM principal. \u00c9 esta tecnologia que permite \nmanter os recursos do elemento customizado privados, podendo escrever \nCSS e Javascript sem causar conflitos em outras partes do documento. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Templates HTML<\/h3>\n\n\n\n<p>Para escrever os componentes temos os elementos <code>&lt;template&gt;<\/code><em> <\/em>e <code>&lt;slot&gt;<\/code><em> <\/em>que  permitem criar templates de marca\u00e7\u00e3o que n\u00e3o ser\u00e3o exibidos na p\u00e1gina  mas poder\u00e3o ser reutilizadas se tornando modelo da estrutura de  componentes customizados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mas realmente j\u00e1 d\u00e1 pra usar?<\/h2>\n\n\n\n<p>A mais de 6 anos eu leio e ou\u00e7o que os web components s\u00e3o o futuro, \nmas atualmente v\u00e1rias das features j\u00e1 funcionam nos browsers, ent\u00e3o, web\n components s\u00e3o o presente! Vamos dar uma olhada no <em><a href=\"https:\/\/caniuse.com\/#search=web%20components\" target=\"_blank\" rel=\"noreferrer noopener\">Can I use<\/a><\/em> e ver como est\u00e1 a compatibilidade dos navegadores com essas funcionalidades.<\/p>\n\n\n\n<p>Em geral, web components s\u00e3o adotados por padr\u00e3o no Firefox (a partir  da vers\u00e3o 63), Chrome, Opera e Edge (vers\u00e3o 80). Safari suporta apenas  algumas features (\u00ea Apple \u2013\u2018).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"388\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade-1024x388.png\" alt=\"\" class=\"wp-image-1121 lazyload\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade-1024x388.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade-300x114.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade-768x291.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade-1536x582.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/custom-elements-compatibilidade-2048x776.png 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/388;\" \/><\/a><figcaption>Compatibilidade Custom Elements<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"578\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade-1024x578.png\" alt=\"\" class=\"wp-image-1122 lazyload\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade-1024x578.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade-300x169.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade-768x434.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade-1536x867.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/shadow-dom-compatibilidade-2048x1156.png 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/578;\" \/><\/a><figcaption>Compatibilidade Shadow DOM<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"384\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade-1024x384.png\" alt=\"\" class=\"wp-image-1123 lazyload\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade-1024x384.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade-300x112.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade-768x288.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade-1536x575.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/html-templates-compatibilidade-2048x767.png 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/384;\" \/><\/a><figcaption>Compatibilidade HTML templates<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Crash Course &#8211; Desenvolvendo Web Components<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Desenvolvendo primeiro web component<\/h3>\n\n\n\n<p><strong>ALERT<\/strong>: Pra acompanhar melhor o tutorial a seguir, \u00e9 importante que voc\u00ea tenha conhecimento b\u00e1sico em HTML, CSS e Javascript.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.1 Criar p\u00e1gina HTML<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>Crie uma pasta para o projeto, dentro crie um arquivo <em>index.html, <\/em>nele coloque a estrutura b\u00e1sica de uma p\u00e1gina HTML.<\/li><li>Dentro do <em>body<\/em> coloque um <em>h3 <\/em>com o texto \u201cDesenvolvendo Web Components\u201d.<\/li><li>Tamb\u00e9m dentro do <em>body <\/em>vamos colocar o nosso elemento customizado <code>&lt;poke-card&gt;&lt;\/poke-card&gt;<\/code>.<\/li><li>Por \u00faltimo vamos chamar um script chamado pokeCard.js que vamos criar sem seguida.<\/li><li>N\u00e3o esque\u00e7a de alterar o t\u00edtulo da p\u00e1gina.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"623\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01-1024x623.png\" alt=\"\" class=\"wp-image-1142 lazyload\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01-1024x623.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01-300x183.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01-768x468.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01-1536x935.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-01.png 1544w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/623;\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">1.2 Criando arquivo Javascript<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>Crie um arquivo chamado <em>pokeCard.js <\/em>no mesmo lugar onde criou o <em>index.html<\/em>.<\/li><li>No arquivo crie uma <em>class <\/em>com o nome de <em>PokeCard<\/em>.  Essa classe vai estender o HTMLElement.  Ela poderia estender por  exemplo HTMLInputElement ou v\u00e1rias outras possibilidades. Mas como vamos  criar um componente mais gen\u00e9rico, estenderemos de HTMLElement, que \u00e9  um elemento gen\u00e9rico.<\/li><li>Dentro da classe, vamos usar a fun\u00e7\u00e3o construtora. Dentro dela vamos chamar a fun\u00e7\u00e3o <em>super<\/em>. A palavra-chave <em>super<\/em> chama o construtor da classe pai (<em>HTMLElement<\/em>). Em geral, chamar <em>super<\/em> deve ser a primeira coisa a ser feita dentro da fun\u00e7\u00e3o construtora.<\/li><li>Depois vamos alterar o conte\u00fado do nosso elemento customizado, com o comando <code>this.innerHTML = 'PokeCard';<\/code><\/li><li>Fora das chaves que encapsulam a nossa classe, vamos registrar o  nosso elemento customizado, definindo como ser\u00e1 sua tag, e como \u00e9 sua  constru\u00e7\u00e3o com o comando <code>window.customElements.define('poke-card', PokeCard);<\/code><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-02.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"395\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-02-1024x395.png\" alt=\"\" class=\"wp-image-1143 lazyload\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-02-1024x395.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-02-300x116.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-02-768x296.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-02.png 1442w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/395;\" \/><\/a><\/figure>\n\n\n\n<p>Depois de salvar no navegador, a apar\u00eancia deve ser essa aqui:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-03.png\" alt=\"\" class=\"wp-image-1144 lazyload\" width=\"326\" height=\"187\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-03.png 922w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-03-300x173.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-03-768x443.png 768w\" data-sizes=\"(max-width: 326px) 100vw, 326px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 326px; --smush-placeholder-aspect-ratio: 326\/187;\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2. Recebendo par\u00e2metros<\/h3>\n\n\n\n<p>Primeiro vamos alterar o HTML, para que o nosso componente receba o nome do Pok\u00e9mon. Adicione no nosso componente um atributo <em>name <\/em>com o valor <em>Pikachu<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-04.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-04-1024x633.png\" alt=\"\" class=\"wp-image-1145 lazyload\" width=\"401\" height=\"247\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-04-1024x633.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-04-300x185.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-04-768x475.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-04.png 1450w\" data-sizes=\"(max-width: 401px) 100vw, 401px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 401px; --smush-placeholder-aspect-ratio: 401\/247;\" \/><\/a><\/figure>\n\n\n\n<p>Dentro da nossa classe no Javascript, abaixo da chamada de <em>super()<\/em> vamos primeiro armazenar o valor passado no atributo em uma constante com o comando <code>const name = this.getAttribute('name')<\/code> e depois passar essa constante para o template do nosso componente com <code>this.innerHTML = name<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-05.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-05-1024x434.png\" alt=\"\" class=\"wp-image-1146 lazyload\" width=\"480\" height=\"203\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-05-1024x434.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-05-300x127.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-05-768x325.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-05.png 1270w\" data-sizes=\"(max-width: 480px) 100vw, 480px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 480px; --smush-placeholder-aspect-ratio: 480\/203;\" \/><\/a><\/figure>\n\n\n\n<p>Depois disso o resultado final deve ser esse aqui:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-06.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-06.png\" alt=\"\" class=\"wp-image-1147 lazyload\" width=\"479\" height=\"285\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-06.png 798w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-06-300x179.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-06-768x458.png 768w\" data-sizes=\"(max-width: 479px) 100vw, 479px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 479px; --smush-placeholder-aspect-ratio: 479\/285;\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3. Encapsulando o componente<\/h3>\n\n\n\n<p>Podemos evoluir o componente da mesma forma como estamos desenvolvendo,  por\u00e9m se n\u00e3o encapsularmos o componente, podemos ter problema de CSS  onde por exemplo uma regra interna ao nosso componente alteraria tamb\u00e9m  os elementos externos ao componente. Ent\u00e3o antes de come\u00e7armos a  escrever CSS, vamos encapsular nosso componente, usando <em>Shadow Root<\/em>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3.1 Usando Shadow Root<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos come\u00e7ar <em>anexando <\/em>um <em>Shadow DOM<\/em> ao nosso componente. Fazemos isso com o comando <code>this.attachShadow({ mode: 'open'}); <\/code>Deixe o c\u00f3digo antigo, ap\u00f3s <em>super()<\/em> para baixo desses novos comandos.<\/li><li>Ap\u00f3s fazer isso, podemos acessar a raiz do nosso Shadow DOM com \nthis.shadowRoot. Nela vamos adicionar uma c\u00f3pia do nosso elemento, que \nvamos armazenar numa vari\u00e1vel chamada template \u2013 que ainda n\u00e3o criamos \u2013\n com o comando <code>this.shadowRoot.appendChild(template.content.cloneNode(true));<\/code><\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">3.2 Criando o template<\/h4>\n\n\n\n<p>Antes da declara\u00e7\u00e3o da classe, vamos criar uma constante com o nome de template, e fazer ela receber um novo elemento <em>template<\/em> com o comando <code>const template = document.createElement('template');<\/code><\/p>\n\n\n\n<p>Dentro dessa constante template construiremos nosso HTML e CSS, passando o c\u00f3digo usando o comando <code>template.innerHTML<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Coloque uma tag <em>style<\/em>, e coloque uma cor no <em>h3<\/em>.<\/li><li>Depois crie uma tag <em>h3<\/em> vazia, fora da tag style.<\/li><\/ul>\n\n\n\n<p>Depois, voltando ao c\u00f3digo dentro da nossa fun\u00e7\u00e3o construtora, ap\u00f3s  receber o atributo nome e armazenar numa constante, vamos jogar o  conte\u00fado dentro do h3 que escrevemos acima com o comando <code>this.shadowRoot.querySelector('h3').innerText = name;<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/f3db56c6-ed6d-7a45-a1a6-1dfa5c318484\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-07-1024x921.png\" alt=\"\" class=\"wp-image-1156 lazyload\" width=\"495\" height=\"445\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-07-1024x921.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-07-300x270.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-07-768x691.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-07-1536x1382.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-07.png 1636w\" data-sizes=\"(max-width: 495px) 100vw, 495px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 495px; --smush-placeholder-aspect-ratio: 495\/445;\" \/><\/a><\/figure>\n\n\n\n<p>O resultado esperado \u00e9:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-08.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-08.png\" alt=\"\" class=\"wp-image-1157 lazyload\" width=\"498\" height=\"308\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-08.png 680w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-08-300x186.png 300w\" data-sizes=\"(max-width: 498px) 100vw, 498px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 498px; --smush-placeholder-aspect-ratio: 498\/308;\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">4. Adicionando imagem e mais um card<\/h3>\n\n\n\n<p>Vamos alterar o HTML para nosso card ter uma imagem. Assim como fizemos com o atributo name, crie no HTML do card um atributo <em>avatar <\/em>e passe nele a URL de uma imagem.<\/p>\n\n\n\n<p>Depois copie o card e coloque o nome de outro Pok\u00e9mon e outra imagem.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09-1024x746.png\" alt=\"\" class=\"wp-image-1159 lazyload\" width=\"535\" height=\"389\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09-1024x746.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09-300x218.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09-768x559.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09-1536x1118.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-09.png 1876w\" data-sizes=\"(max-width: 535px) 100vw, 535px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 535px; --smush-placeholder-aspect-ratio: 535\/389;\" \/><\/a><\/figure>\n\n\n\n<p>No nosso arquivo Javascript, vamos colocar uma largura para imagem no CSS, e tamb\u00e9m colocar uma tag <em>img <\/em>vazia antes do <em>h3 <\/em>que inserimos anteriormente.<\/p>\n\n\n\n<p>Dentro da nossa fun\u00e7\u00e3o construtora, vamos fazer parecido com o que fizemos com o <em>h3<\/em> para inserir a <em>URL<\/em> na imagem.<\/p>\n\n\n\n<p>Primeiro vamos armazenar o valor do atributo em uma constante com o c\u00f3digo <code>const imageURL = this.getAttribute('avatar');<\/code><\/p>\n\n\n\n<p>Ap\u00f3s vamos inserir o valor dessa constante na imagem com o c\u00f3digo <code>this.shadowRoot.querySelector('img').setAttribute('src', imageURL);<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10-952x1024.png\" alt=\"\" class=\"wp-image-1160 lazyload\" width=\"539\" height=\"579\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10-952x1024.png 952w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10-279x300.png 279w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10-768x826.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10-1427x1536.png 1427w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-10.png 1710w\" data-sizes=\"(max-width: 539px) 100vw, 539px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 539px; --smush-placeholder-aspect-ratio: 539\/579;\" \/><\/a><\/figure>\n\n\n\n<p>E o resultado esperado \u00e9 esse aqui:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-11.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-11-703x1024.png\" alt=\"\" class=\"wp-image-1161 lazyload\" width=\"292\" height=\"424\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-11-703x1024.png 703w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-11-206x300.png 206w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-11-768x1118.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-11.png 790w\" data-sizes=\"(max-width: 292px) 100vw, 292px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 292px; --smush-placeholder-aspect-ratio: 292\/424;\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">4.1 Melhorando a apar\u00eancia do card<\/h4>\n\n\n\n<p>O objetivo num \u00e9 focar no CSS, ent\u00e3o apenas copie (ou crie sua pr\u00f3pria estiliza\u00e7\u00e3o).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-12.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-12-967x1024.png\" alt=\"\" class=\"wp-image-1163 lazyload\" width=\"477\" height=\"505\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-12-967x1024.png 967w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-12-283x300.png 283w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-12-768x813.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-12.png 1294w\" data-sizes=\"(max-width: 477px) 100vw, 477px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 477px; --smush-placeholder-aspect-ratio: 477\/505;\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">5. Utilizando <em>slot<\/em><\/h3>\n\n\n\n<p>Usar um <em>slot<\/em> torna nosso componente mais flex\u00edvel. Utilizaremos ele para adicionar o peso e altura do Pok\u00e9mon. <\/p>\n\n\n\n<p>No HTML, dentro da nossa tag customizada adicione <code>&lt;span slot=\"height\"&gt;0.4 m&lt;\/&gt;<\/code> e <code>&lt;span slot=\"weight\"&gt;6.0 kg&lt;\/span&gt;<\/code>. Fa\u00e7a isso para os dois cards. O valor que colocamos dentro do atributo <em>slot<\/em> \u00e9 o nome que estamos dando a ele.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13-1024x865.png\" alt=\"\" class=\"wp-image-1165 lazyload\" width=\"492\" height=\"415\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13-1024x865.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13-300x253.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13-768x649.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13-1536x1297.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-13.png 1944w\" data-sizes=\"(max-width: 492px) 100vw, 492px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 492px; --smush-placeholder-aspect-ratio: 492\/415;\" \/><\/a><\/figure>\n\n\n\n<p>No arquivo Javascript, vamos alterar o conte\u00fado do template. Abaixo do <em>h3 <\/em>colocaremos uma <em>div <\/em>com a classe <em>info <\/em>e dentro dessa <em>div <\/em>dois  paragrafos um para a altura, outro para o peso. Dentro de cada  par\u00e1grafo escreveremos uma legenda e criaremos um span com o slot se  referenciando ao seu conte\u00fado do HTML.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14-932x1024.png\" alt=\"\" class=\"wp-image-1166 lazyload\" width=\"470\" height=\"516\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14-932x1024.png 932w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14-273x300.png 273w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14-768x844.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14-1399x1536.png 1399w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-14.png 1546w\" data-sizes=\"(max-width: 470px) 100vw, 470px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 470px; --smush-placeholder-aspect-ratio: 470\/516;\" \/><\/a><\/figure>\n\n\n\n<p>Tudo correto, a visualiza\u00e7\u00e3o esperada \u00e9:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-15.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-15-1024x953.png\" alt=\"\" class=\"wp-image-1167 lazyload\" width=\"388\" height=\"360\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-15-1024x953.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-15-300x279.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-15-768x715.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-15.png 1212w\" data-sizes=\"(max-width: 388px) 100vw, 388px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 388px; --smush-placeholder-aspect-ratio: 388\/360;\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">6. Adicionando fun\u00e7\u00f5es com connectedCallback<\/h3>\n\n\n\n<p>Vamos adicionar um bot\u00e3o dentro da <em>div info <\/em>para esconder ou exibir a info do Pok\u00e9mon (altura e peso).<\/p>\n\n\n\n<p>Repare na linha 37 (bot\u00e3o) e na linha 19 onde come\u00e7a o CSS do bot\u00e3o no print abaixo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16-816x1024.png\" alt=\"\" class=\"wp-image-1169 lazyload\" width=\"495\" height=\"620\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16-816x1024.png 816w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16-239x300.png 239w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16-768x963.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16-1224x1536.png 1224w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-16.png 1470w\" data-sizes=\"(max-width: 495px) 100vw, 495px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 495px; --smush-placeholder-aspect-ratio: 495\/620;\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">6.1 Entendendo o <em>lifecycle<\/em><\/h4>\n\n\n\n<p>ConnectedCallback \u00e9 uma fun\u00e7\u00e3o que todo web component tem. Ela \u00e9 chamada toda vez que o componente \u00e9 adicionado ao <em>DOM<\/em>. Dentro dela vamos adicionar um escutador pro evento de clique do bot\u00e3o <code>this.shadowRoot.querySelector('#toggle-info').addEventListener('click', () =&gt; this.toggleInfo());<\/code><\/p>\n\n\n\n<p>Em paralelo vamos criar a fun\u00e7\u00e3o <em>toggleInfo<\/em> que chamamos no <em>click<\/em>. A princ\u00edpio vamos apenas colocar um <em>console.log<\/em> dentro da fun\u00e7\u00e3o.<\/p>\n\n\n\n<p>DisconnectedCallback \u00e9 o oposto da fun\u00e7\u00e3o acima, ela \u00e9 chamada toda vez que o elemento customizado \u00e9 removido do <em>DOM<\/em>. \u00c9 uma boa pr\u00e1tica remover escutadores dentro dessa fun\u00e7\u00e3o, e \u00e9 isso que vamos fazer com o c\u00f3digo <code>this.shadowRoot.querySelector('#toggle-info').removeEventListener();<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17-1024x1002.png\" alt=\"\" class=\"wp-image-1170 lazyload\" width=\"506\" height=\"495\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17-1024x1002.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17-300x293.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17-768x751.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17-1536x1502.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-17.png 1732w\" data-sizes=\"(max-width: 506px) 100vw, 506px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 506px; --smush-placeholder-aspect-ratio: 506\/495;\" \/><\/a><\/figure>\n\n\n\n<p>Com isso feito, clicando no bot\u00e3o do card, ele deve exibir uma mensagem no  <em>console<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-18.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-18-947x1024.png\" alt=\"\" class=\"wp-image-1171 lazyload\" width=\"325\" height=\"351\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-18-947x1024.png 947w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-18-277x300.png 277w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-18-768x831.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-18.png 1394w\" data-sizes=\"(max-width: 325px) 100vw, 325px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 325px; --smush-placeholder-aspect-ratio: 325\/351;\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">7. Criando l\u00f3gica de <em>toggle<\/em> nas informa\u00e7\u00f5es<\/h3>\n\n\n\n<p>Agora \u00e9 s\u00f3 a cereja do bolo. Dentro da fun\u00e7\u00e3o construtora abaixo do <em>super() <\/em>vamos criar uma propriedade da nossa classe com o c\u00f3digo <code>this.showInfo = true;<\/code> \u00c9 essa vari\u00e1vel que vai controlar quando vamos exibir ou ocultar as informa\u00e7\u00f5es do Pok\u00e9mon.<\/p>\n\n\n\n<p>Dentro da fun\u00e7\u00e3o <em>toggleInfo <\/em>vamos criar uma l\u00f3gica b\u00e1sica de trocar a propriedade display da <em>div <\/em>e trocar o texto do bot\u00e3o.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19-1024x879.png\" alt=\"\" class=\"wp-image-1173 lazyload\" width=\"473\" height=\"405\" data-srcset=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19-1024x879.png 1024w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19-300x257.png 300w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19-768x659.png 768w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19-1536x1318.png 1536w, https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/web-component-19.png 1932w\" data-sizes=\"(max-width: 473px) 100vw, 473px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 473px; --smush-placeholder-aspect-ratio: 473\/405;\" \/><\/a><\/figure>\n\n\n\n<p>E pronto! Nosso elemento customizado est\u00e1 funcionando lindamente \ud83d\ude09<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/pV8r6w6MIo.gif\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" data-src=\"http:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/pV8r6w6MIo.gif\" alt=\"\" class=\"wp-image-1140 lazyload\" width=\"405\" height=\"353\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 405px; --smush-placeholder-aspect-ratio: 405\/353;\" \/><\/a><\/figure>\n\n\n\n<p>Eu coloquei esse c\u00f3digo tamb\u00e9m no <a href=\"https:\/\/github.com\/andrefelizardo\/poke-card\" target=\"_blank\" rel=\"noreferrer noopener\">Github<\/a>, e se voc\u00ea clicar em  <em><a href=\"https:\/\/github.com\/andrefelizardo\/poke-card\/commits\/master\" target=\"_blank\" rel=\"noreferrer noopener\">commits<\/a> <\/em>voc\u00ea pode ver a evolu\u00e7\u00e3o do codigo, passo a passo, como foi explicado aqui no texto.<\/p>\n\n\n\n<p>Web Components n\u00e3o s\u00e3o o futuro, s\u00e3o o presente.<\/p>\n\n\n\n<p>D\u00favidas, sugest\u00e3o? Deixa a\u00ed nos coment\u00e1rios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste guia veremos o que s\u00e3o web components, quando usar, sua estrutura e tamb\u00e9m um crash course criando um web component do zero que \u00e9 um card Pok\u00e9mon, com v\u00e1rios recursos interessantes.<\/p>\n","protected":false},"author":1,"featured_media":1220,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[117,2,5],"tags":[144,49,93,111,114,53,55,56],"class_list":["post-1152","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","category-dicas","category-tecnologia","tag-crash-course","tag-css","tag-desenvolvimento","tag-devs","tag-frontend","tag-html","tag-javascript","tag-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Web Components \u2013 Guia Geral - Blog do Andr\u00e9 Felizardo<\/title>\n<meta name=\"description\" content=\"Entenda o que s\u00e3o web components e desenvolva um web component completo sem nenhum framework, com apenas HTML, CSS e Javascript.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Web Components \u2013 Guia Geral - Blog do Andr\u00e9 Felizardo\" \/>\n<meta property=\"og:description\" content=\"Entenda o que s\u00e3o web components e desenvolva um web component completo sem nenhum framework, com apenas HTML, CSS e Javascript.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog do Andr\u00e9 Felizardo\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-20T13:37:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-24T19:26:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2250\" \/>\n\t<meta property=\"og:image:height\" content=\"1179\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Felizardo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Felizardo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Felizardo\",\"@id\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/7ffba68b251851fb519600e2e387a02b\"},\"headline\":\"Web Components \u2013 Guia Geral\",\"datePublished\":\"2020-03-20T13:37:08+00:00\",\"dateModified\":\"2021-10-24T19:26:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/\"},\"wordCount\":1573,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/capa-web-components-1.png\",\"keywords\":[\"crash-course\",\"css\",\"desenvolvimento\",\"devs\",\"frontend\",\"html\",\"javascript\",\"js\"],\"articleSection\":[\"Dev\",\"Dicas\",\"Tecnologia\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/\",\"url\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/\",\"name\":\"Web Components \u2013 Guia Geral - Blog do Andr\u00e9 Felizardo\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/capa-web-components-1.png\",\"datePublished\":\"2020-03-20T13:37:08+00:00\",\"dateModified\":\"2021-10-24T19:26:00+00:00\",\"author\":{\"@id\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/7ffba68b251851fb519600e2e387a02b\"},\"description\":\"Entenda o que s\u00e3o web components e desenvolva um web component completo sem nenhum framework, com apenas HTML, CSS e Javascript.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/capa-web-components-1.png\",\"contentUrl\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/capa-web-components-1.png\",\"width\":2250,\"height\":1179},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/web-components-guia-geral\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Web Components \u2013 Guia Geral\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/#website\",\"url\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/\",\"name\":\"Blog do Andr\u00e9 Felizardo\",\"description\":\"Programa\u00e7\u00e3o de dev para dev\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"http:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/7ffba68b251851fb519600e2e387a02b\",\"name\":\"Andr\u00e9 Felizardo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/wphb-cache\\\/gravatar\\\/9f9\\\/9f92d8b773ef5acf9b462d6dab41d783x96.jpg\",\"url\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/wphb-cache\\\/gravatar\\\/9f9\\\/9f92d8b773ef5acf9b462d6dab41d783x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/wp-content\\\/wphb-cache\\\/gravatar\\\/9f9\\\/9f92d8b773ef5acf9b462d6dab41d783x96.jpg\",\"caption\":\"Andr\u00e9 Felizardo\"},\"sameAs\":[\"http:\\\/\\\/www.andrefelizardo.com.br\"],\"url\":\"https:\\\/\\\/www.andrefelizardo.com.br\\\/blog\\\/author\\\/andrefelizardo\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Web Components \u2013 Guia Geral - Blog do Andr\u00e9 Felizardo","description":"Entenda o que s\u00e3o web components e desenvolva um web component completo sem nenhum framework, com apenas HTML, CSS e Javascript.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/","og_locale":"pt_BR","og_type":"article","og_title":"Web Components \u2013 Guia Geral - Blog do Andr\u00e9 Felizardo","og_description":"Entenda o que s\u00e3o web components e desenvolva um web component completo sem nenhum framework, com apenas HTML, CSS e Javascript.","og_url":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/","og_site_name":"Blog do Andr\u00e9 Felizardo","article_published_time":"2020-03-20T13:37:08+00:00","article_modified_time":"2021-10-24T19:26:00+00:00","og_image":[{"width":2250,"height":1179,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png","type":"image\/png"}],"author":"Andr\u00e9 Felizardo","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Andr\u00e9 Felizardo","Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#article","isPartOf":{"@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/"},"author":{"name":"Andr\u00e9 Felizardo","@id":"http:\/\/www.andrefelizardo.com.br\/blog\/#\/schema\/person\/7ffba68b251851fb519600e2e387a02b"},"headline":"Web Components \u2013 Guia Geral","datePublished":"2020-03-20T13:37:08+00:00","dateModified":"2021-10-24T19:26:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/"},"wordCount":1573,"commentCount":0,"image":{"@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#primaryimage"},"thumbnailUrl":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png","keywords":["crash-course","css","desenvolvimento","devs","frontend","html","javascript","js"],"articleSection":["Dev","Dicas","Tecnologia"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/","url":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/","name":"Web Components \u2013 Guia Geral - Blog do Andr\u00e9 Felizardo","isPartOf":{"@id":"http:\/\/www.andrefelizardo.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#primaryimage"},"image":{"@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#primaryimage"},"thumbnailUrl":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png","datePublished":"2020-03-20T13:37:08+00:00","dateModified":"2021-10-24T19:26:00+00:00","author":{"@id":"http:\/\/www.andrefelizardo.com.br\/blog\/#\/schema\/person\/7ffba68b251851fb519600e2e387a02b"},"description":"Entenda o que s\u00e3o web components e desenvolva um web component completo sem nenhum framework, com apenas HTML, CSS e Javascript.","breadcrumb":{"@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#primaryimage","url":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png","contentUrl":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png","width":2250,"height":1179},{"@type":"BreadcrumbList","@id":"https:\/\/www.andrefelizardo.com.br\/blog\/web-components-guia-geral\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"http:\/\/www.andrefelizardo.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Web Components \u2013 Guia Geral"}]},{"@type":"WebSite","@id":"http:\/\/www.andrefelizardo.com.br\/blog\/#website","url":"http:\/\/www.andrefelizardo.com.br\/blog\/","name":"Blog do Andr\u00e9 Felizardo","description":"Programa\u00e7\u00e3o de dev para dev","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.andrefelizardo.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"http:\/\/www.andrefelizardo.com.br\/blog\/#\/schema\/person\/7ffba68b251851fb519600e2e387a02b","name":"Andr\u00e9 Felizardo","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/wphb-cache\/gravatar\/9f9\/9f92d8b773ef5acf9b462d6dab41d783x96.jpg","url":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/wphb-cache\/gravatar\/9f9\/9f92d8b773ef5acf9b462d6dab41d783x96.jpg","contentUrl":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/wphb-cache\/gravatar\/9f9\/9f92d8b773ef5acf9b462d6dab41d783x96.jpg","caption":"Andr\u00e9 Felizardo"},"sameAs":["http:\/\/www.andrefelizardo.com.br"],"url":"https:\/\/www.andrefelizardo.com.br\/blog\/author\/andrefelizardo\/"}]}},"jetpack_featured_media_url":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2020\/03\/capa-web-components-1.png","jetpack_shortlink":"https:\/\/wp.me\/p6EP66-iA","jetpack-related-posts":[{"id":1072,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/svg-guia-definitivo\/","url_meta":{"origin":1152,"position":0},"title":"SVG &#8211; Guia definitivo","author":"Andr\u00e9 Felizardo","date":"23 de novembro de 2019","format":false,"excerpt":"O que \u00e9 SVG \u00e9 a sigla para Scalable Vector Graphics que traduzindo seria gr\u00e1ficos vetoriais escal\u00e1veis. SVG \u00e9 uma linguagem XML para fazer desenhos, gr\u00e1ficos 2D de maneiras est\u00e1ticas ou din\u00e2micas a partir de vetores. A grande vantagem dos gr\u00e1ficos vetoriais \u00e9 que n\u00e3o se perde a qualidade quando\u2026","rel":"","context":"Em &quot;Dev&quot;","block_context":{"text":"Dev","link":"https:\/\/www.andrefelizardo.com.br\/blog\/category\/dev\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/11\/capa-blog-svg.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/11\/capa-blog-svg.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/11\/capa-blog-svg.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/11\/capa-blog-svg.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1055,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/padroes-css\/","url_meta":{"origin":1152,"position":1},"title":"Padr\u00f5es CSS","author":"Andr\u00e9 Felizardo","date":"22 de setembro de 2019","format":false,"excerpt":"Quando voc\u00ea come\u00e7a a trabalhar com grandes projetos de front-end, os arquivos CSS v\u00e3o crescendo, e os problemas tamb\u00e9m. Voc\u00ea come\u00e7ou a usar muitos important!\u00a0no projeto? Os arquivos CSS est\u00e3o ficando muito grandes? Voc\u00ea n\u00e3o sabe onde encontrar uma regra CSS espec\u00edfica? Voc\u00ea n\u00e3o \u00e9 o \u00fanico a passar por\u2026","rel":"","context":"Em &quot;Dev&quot;","block_context":{"text":"Dev","link":"https:\/\/www.andrefelizardo.com.br\/blog\/category\/dev\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/09\/capa-blog-padroes-css.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/09\/capa-blog-padroes-css.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/09\/capa-blog-padroes-css.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2019\/09\/capa-blog-padroes-css.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":963,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/o-que-e-vue-js\/","url_meta":{"origin":1152,"position":2},"title":"O que \u00e9 Vue.js","author":"Andr\u00e9 Felizardo","date":"10 de janeiro de 2018","format":false,"excerpt":"Vue.js \u00e9 uma biblioteca\u00a0JavaScript\u00a0acess\u00edvel, vers\u00e1til e perform\u00e1tica. E apesar do site oficial dizer que Vue.js \u00e9 um framework JavaScript Progressivo, eu j\u00e1 vou come\u00e7ar discordando :) Entendemos por framework, aquela solu\u00e7\u00e3o 'fechada' quando voc\u00ea j\u00e1 tem definido por exemplo a estrutura de diret\u00f3rios, ou a forma como voc\u00ea faz uma\u2026","rel":"","context":"Em &quot;Dev&quot;","block_context":{"text":"Dev","link":"https:\/\/www.andrefelizardo.com.br\/blog\/category\/dev\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2018\/01\/vuejs.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2018\/01\/vuejs.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2018\/01\/vuejs.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2018\/01\/vuejs.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":852,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/firebase-nao-desenvolva-o-backend\/","url_meta":{"origin":1152,"position":3},"title":"Firebase &#8211; N\u00e3o desenvolva o backend","author":"Andr\u00e9 Felizardo","date":"2 de julho de 2017","format":false,"excerpt":"Voc\u00ea j\u00e1 ouviu falar no Firebase? Firebase \u00e9 um servi\u00e7o do Google para agilizar o desenvolvimento de sites e aplicativos, disponibilizando ferramentas backend automatizadas. Ent\u00e3o, se voc\u00ea precisa desenvolver algo muito r\u00e1pido, focar nas regras de neg\u00f3cio sem precisar modelar banco, criar servi\u00e7o de autentica\u00e7\u00e3o e outros o Firebase \u00e9\u2026","rel":"","context":"Em &quot;Dev&quot;","block_context":{"text":"Dev","link":"https:\/\/www.andrefelizardo.com.br\/blog\/category\/dev\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/firebase.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/firebase.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/firebase.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/firebase.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":953,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/javascript-variaveis\/","url_meta":{"origin":1152,"position":4},"title":"JavaScript &#8211; Vari\u00e1veis: var, let e const","author":"Andr\u00e9 Felizardo","date":"3 de dezembro de 2017","format":false,"excerpt":"O que \u00e9 uma vari\u00e1vel? Vari\u00e1veis JavaScript s\u00e3o objetos onde n\u00f3s guardamos uma informa\u00e7\u00e3o apenas em tempo de execu\u00e7\u00e3o. Por exemplo: se voc\u00ea digita sua data de nascimento em um formul\u00e1rio, podemos guardar essa data em uma vari\u00e1vel para calcular a sua idade. Mas se voc\u00ea sair do site e\u2026","rel":"","context":"Em &quot;Dev&quot;","block_context":{"text":"Dev","link":"https:\/\/www.andrefelizardo.com.br\/blog\/category\/dev\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/12\/javascript-variaveis.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/12\/javascript-variaveis.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/12\/javascript-variaveis.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/12\/javascript-variaveis.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":830,"url":"https:\/\/www.andrefelizardo.com.br\/blog\/seja-grato-primeiro-app-na-loja\/","url_meta":{"origin":1152,"position":5},"title":"Seja Grato &#8211; Primeiro App na loja","author":"Andr\u00e9 Felizardo","date":"29 de junho de 2017","format":false,"excerpt":"No in\u00edcio de 2017 eu defini o objetivo de colocar tr\u00eas apps pr\u00f3prios at\u00e9 o fim do ano nas lojas de aplicativos. Quando chegou em maio, percebi que n\u00e3o tinha nenhum, ent\u00e3o decidi partir pra cima desse objetivo. A muito tempo eu vinha pensando num aplicativo (sem fins lucrativos) que\u2026","rel":"","context":"Em &quot;Ionic&quot;","block_context":{"text":"Ionic","link":"https:\/\/www.andrefelizardo.com.br\/blog\/category\/ionic\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/seja-grato.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/seja-grato.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/seja-grato.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.andrefelizardo.com.br\/blog\/wp-content\/uploads\/2017\/06\/seja-grato.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/posts\/1152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1152"}],"version-history":[{"count":0,"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/posts\/1152\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/media\/1220"}],"wp:attachment":[{"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.andrefelizardo.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}