<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edvaldo Lima</title>
    <description>The latest articles on DEV Community by Edvaldo Lima (@edvaldolima).</description>
    <link>https://dev.to/edvaldolima</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F660560%2Fa335ceb3-1634-4331-9f9d-aec0f84ad3ba.jpeg</url>
      <title>DEV Community: Edvaldo Lima</title>
      <link>https://dev.to/edvaldolima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edvaldolima"/>
    <language>en</language>
    <item>
      <title>Front-End e o gerenciamento de estado global</title>
      <dc:creator>Edvaldo Lima</dc:creator>
      <pubDate>Fri, 04 Aug 2023 14:12:59 +0000</pubDate>
      <link>https://dev.to/edvaldolima/front-end-e-o-gerenciamento-de-estado-global-5fh3</link>
      <guid>https://dev.to/edvaldolima/front-end-e-o-gerenciamento-de-estado-global-5fh3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As bibliotecas Flux são como óculos: você saberá quando precisar delas. Dan Abramov, o autor do Redux.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E aí carinha do computador. Como que anda a vista? E os óculos? Tudo em dia?&lt;/p&gt;

&lt;p&gt;Eita, o gerenciamento de estado global! Já ouvi falar muita coisa sobre ele:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Você só usa quando precisa passar dados de irmão para irmão(componentes) para facilitar a vida"&lt;/li&gt;
&lt;li&gt;"Só usa quando a hierarquia entre os componentes fica muito distante"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos cortar o papo, do que é, onde vive, do que se alimenta, etc. E vamos focar no propósito de existência do gerenciamento de estado global em um projeto.&lt;/p&gt;

&lt;p&gt;Veja:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17qqqbqvp8qqzouestcd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17qqqbqvp8qqzouestcd.png" alt="Vuex"&gt;&lt;/a&gt;&lt;a href="https://vuex.vuejs.org/ptbr/index.html#o-que-e-um-padrao-de-gerenciamento-do-estado" rel="noopener noreferrer"&gt;fonte&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de qualquer coisa, vamos falar do &lt;em&gt;Vuex&lt;/em&gt;, mas isso pode se aplicar as bibliotecas que fazem uso do Flux Pattern, para aquele seu projeto de 5 páginas, ou qualquer coisa nesse sentido, provavelmente não fará sentido algum adicionar gerenciamento de estado global, inclusive, é uma recomendação do &lt;em&gt;Vuex&lt;/em&gt;, &lt;em&gt;Redux&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Se o seu projeto consome uma API, ele já poderia fazer o uso do gerenciamento de estado global! "Mas pera, e a história do projeto de 5 páginas?", é simplesmente uma escolha! Deve se considerar os prós e contras do uso em seu projeto.&lt;/p&gt;

&lt;p&gt;Mas vamos ao propósito, viu a imagem ali em cima e o que cada camada faz? Vamos lá!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Actions&lt;/strong&gt;: A camada que tem como responsabilidade a comunicação com a API do projeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutations&lt;/strong&gt;: A camada que tem como responsabilidade modificar estados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Getters&lt;/strong&gt;: A camada que tem como responsabilidade facilitar a busca dos dados de um estado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State&lt;/strong&gt;: A camada que tem como responsabilidade armazenar o estado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o gerenciamento de estado global, a aplicação irá centralizar os dados vindos da API no &lt;em&gt;State&lt;/em&gt; fazendo com que qualquer componente tenha acesso aos dados, da mesma forma as chamadas de API ficam ao alcance de qualquer componente por meio do &lt;em&gt;Vuex&lt;/em&gt;, como à qualquer outra camada, e sim, as &lt;em&gt;Actions&lt;/em&gt; seriam um tipo de "&lt;em&gt;Services&lt;/em&gt;", centralizando todas as chamadas de API. Claro, você não irá guardar apenas os dados vindos da API, poderá adicionar qualquer dado de interesse global ou de contexto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Para pequenos projetos, mesmo com consumo de API, o gerenciamento de estado global pode parecer verboso e desanimador, mas na minha opinião o uso se paga e muito bem ao longo do projeto, você sabe de onde vem os dados, são modificados de forma previsível e isso ajuda muito na manutenção.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>react</category>
      <category>vuex</category>
      <category>redux</category>
    </item>
    <item>
      <title>CapacitorJS, PWAs e como empacotar um front-end para Android e iOS.</title>
      <dc:creator>Edvaldo Lima</dc:creator>
      <pubDate>Thu, 01 Jun 2023 11:00:39 +0000</pubDate>
      <link>https://dev.to/edvaldolima/capacitorjs-pwa-e-empacotando-front-end-para-android-e-ios-o69</link>
      <guid>https://dev.to/edvaldolima/capacitorjs-pwa-e-empacotando-front-end-para-android-e-ios-o69</guid>
      <description>&lt;h2&gt;
  
  
  🛠️ Por que usar Capacitor em vez de só uma PWA
&lt;/h2&gt;

&lt;p&gt;Você desenvolve aplicações web (HTML, CSS, JavaScript) e ficou interessado em levar esse mesmo código para dispositivos móveis, transformar sua PWA em binários instaláveis (.apk para Android e .ipa para iOS) é uma possibilidade real com o CapacitorJS — uma runtime nativa criada pela equipe do Ionic que funciona como evolução moderna do Cordova.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 O que é o CapacitorJS
&lt;/h2&gt;

&lt;p&gt;O CapacitorJS é um runtime nativo open-source que permite empacotar aplicações web como apps nativos para Android, iOS e também servir como Progressive Web App (PWA). Ele fornece uma bridge entre o código web e APIs nativas (como câmera, GPS, notificações, armazenamento nativo, etc.), com uma API consistente que funciona tanto no contexto web quanto nas plataformas móveis.&lt;/p&gt;

&lt;p&gt;Diferente do Cordova, o Capacitor foi projetado para ser mais modular, trabalhar com plugins modernos e ter melhor integração com APIs e ferramentas nativas atuais. Progressive Web Apps já oferecem uma experiência rica em navegadores modernos, com recursos como service workers e instalação no dispositivo.&lt;/p&gt;

&lt;p&gt;Mas se seu objetivo é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Publicar na Google Play Store e Apple App Store;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usar recursos nativos do dispositivo com performance mais integrada;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ter um binário nativo que não dependa exclusivamente do navegador do usuário;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;… então o Capacitor é uma solução técnica mais robusta do que apenas uma PWA comum.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Como empacotar seu front-end com Capacitor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instalação da CLI e Core
&lt;/h3&gt;

&lt;p&gt;Instale o capacitor no seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @capacitor/core
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; @capacitor/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inicialização do projeto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cap init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria os arquivos de configuração básicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O capacitor.config.ts
&lt;/h3&gt;

&lt;p&gt;Esse arquivo define parâmetros essenciais, como o appId, o nome do aplicativo e o diretório onde o build web será gerado (geralmente dist):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CapacitorConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@capacitor/cli&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CapacitorConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;appId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;com.example.app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;appName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local-chat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;webDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// destino da build do seu projeto&lt;/span&gt;
  &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;androidScheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adicionando plataformas
&lt;/h3&gt;

&lt;p&gt;Depois da configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @capacitor/android @capacitor/ios
npx cap add android
npx cap add ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build e sincronização
&lt;/h3&gt;

&lt;p&gt;Construa seu front-end com seu framework (React, Vue, Svelte, etc.):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida sincronize com o projeto nativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cap &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Abrir nos IDEs nativos
&lt;/h3&gt;

&lt;p&gt;Por fim, abra o projeto no Android Studio ou Xcode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cap open android
npx cap open ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou execute direto no dispositivo (se a configuração estiver correta):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cap run android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse fluxo já te permite instalar e testar o app no dispositivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 Considerações finais
&lt;/h2&gt;

&lt;p&gt;O desenvolvimento híbrido com Capacitor é uma alternativa eficiente para muitos projetos onde manter uma única base de código é uma vantagem (Web + Android + iOS). Em muitos casos você consegue acessar APIs nativas sem escrever Swift/Kotlin — mas se precisar de funcionalidades nativas personalizadas, plugins ou código específico ainda podem ser escritos e integrados.&lt;/p&gt;

&lt;p&gt;O uso de Capacitor não exclui a necessidade de entender os ciclos de build nativos quando for necessário ajustar elementos específicos — mas para a maioria dos cenários padrão, a experiência é bastante fluida para desenvolvedores web.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>android</category>
      <category>ios</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Front-End, o mundo além de pintar botões.</title>
      <dc:creator>Edvaldo Lima</dc:creator>
      <pubDate>Thu, 25 May 2023 11:31:02 +0000</pubDate>
      <link>https://dev.to/edvaldolima/front-end-o-mundo-alem-de-pintar-botoes-32ak</link>
      <guid>https://dev.to/edvaldolima/front-end-o-mundo-alem-de-pintar-botoes-32ak</guid>
      <description>&lt;p&gt;E aí programador, cê ainda sobe uns projetos por FTP em pleno 2023? Fica tranquilo, acontece nas "melhores" empresas. 🤭&lt;/p&gt;

&lt;p&gt;Se você aí é programador das antigas, por um acaso bateu a cabeça e ficou em coma por uns 15 anos, acordou e acha que JQuery ainda é tech de ponta e que front-end ainda é aquela "simplicidade", estamos todos enganados!&lt;/p&gt;

&lt;p&gt;A piadinha do programador, na verdade, pode ser eu e você, sabemos que o JQuery não é tech de ponta, mas a ideia de que o front-end é algo "extremamente simples", ainda perdura pelos dias de hoje nas nossas cabeças, me lembro da primeira vez em que li "Front-End Engineer", achei exagerado, pensei, "quer dizer que o cara vai assinar um papel e se o front cair em produção, será responsabilizado por todos os danos"(parecido com o que acontece na engenharia civil quando cai uma ponte), sentei, passei uns dias entendendo e me dei conta de que ainda não estava levando o assunto a sério.&lt;/p&gt;

&lt;p&gt;Já faz um bom tempo que as necessidades do front-end mudaram, e foram mudanças rápidas e que mudaram totalmente a forma de desenvolver e de pensar, logo apareceram coisas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SPA(Single Page Applications)&lt;/li&gt;
&lt;li&gt;PWA(Progressive Web App)&lt;/li&gt;
&lt;li&gt;Offline First&lt;/li&gt;
&lt;li&gt;Componente&lt;/li&gt;
&lt;li&gt;Arquitetura&lt;/li&gt;
&lt;li&gt;Roteamento&lt;/li&gt;
&lt;li&gt;Otimização de desempenho&lt;/li&gt;
&lt;li&gt;Análise minuciosa de novos pacotes adicionados ao projeto&lt;/li&gt;
&lt;li&gt;Atualização dependências&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não tem como estruturar um bom projeto com a "cabeça do JQuery"! Esse pensamento de que "é tudo muito simples", "só seguir e vai dar tudo certo", de forma resumida, isso pode resultar em projetos complexos de manter e dar manutenção ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Eu vivi algo que me trouxe um grande aprendizado, na época eu já tinha trabalhado com back-end, mobile e front-end, sai de uma empresa e fui para outra, e a minha ideia era começar uma jornada apenas com o front-end, nessa outra empresa eu ainda estava colocando a mão em back-end, ao passar dos dias eu fui conhecendo o projeto e entendendo melhor, era VueJs e Laravel, porém, o time estava migrando do VueJs para o Svelte, em um momento em que o Svelte nem sequer estava consolidado, ao tentar entender melhor, recebi uma explicação parecida com isso: "há, acontece que com o VueJs ficou muito complicado de dar manutenção no projeto", e eu ainda fico por ali sem entender a explicação sabendo que o projeto nem sequer tinha 2 anos de existência, no final eu entendi que o front-end foi negligenciado no que diz respeito a sua complexidade e que mudar de seis(VueJs) para meia dúzia(Svelte) não iria adiantar em nada, se mantido o mesmo pensamento "simplista".&lt;/p&gt;

&lt;p&gt;Chegar ao ponto de migrar/reescrever um projeto com uma justificativa fraca é o resultado de escolhas ruins no início e ao longo do projeto, não se pode se dar ao luxo de reescrever, sabemos que isso envolve custos, por isso, estruturar um bom projeto e manter boas práticas é essencial para o sucesso do projeto ao longo do tempo, um projeto de simples entendimento e manutenção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A ideia aqui está longe de querer hipervalorizar algo, apenas dar um pitaco sobre um assunto que muitas pessoas ainda tratam de maneira simplista, entender as necessidades atuais e aplicar aos projetos pode nos livrar de longas dores de cabeça.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Component vs View.</title>
      <dc:creator>Edvaldo Lima</dc:creator>
      <pubDate>Fri, 19 May 2023 14:00:11 +0000</pubDate>
      <link>https://dev.to/edvaldolima/components-vs-views-e9m</link>
      <guid>https://dev.to/edvaldolima/components-vs-views-e9m</guid>
      <description>&lt;p&gt;E aê Frontender, debugando muito código com console.log(❤️)?&lt;/p&gt;

&lt;p&gt;No meu primeiro post aqui, venho falar sobre mais uma das dificuldades para nós, programadores, assim como dar bons nomes às nossas variáveis com significado e contexto, pode ser algo que leva tempo, os componentes e as views em um projeto front-end se encaixam muito bem nessa mesma situação, no sentido dos seus propósitos no projeto.&lt;/p&gt;

&lt;p&gt;Você não precisa ir muito longe para encontrar projetos com componentes de umas 1000 linhas de código e cheios de regras mirabolantes que vão se comportar dependendo do que tu passa pelas propriedades ou dentro do componente.&lt;/p&gt;

&lt;p&gt;Sobre componentes, na doc do Vue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Os componentes nos permitem dividir a interface do usuário em peças &lt;strong&gt;independentes&lt;/strong&gt; e &lt;strong&gt;reutilizáveis&lt;/strong&gt; e pensar em cada peça &lt;strong&gt;isoladamente&lt;/strong&gt;. &lt;a href="https://vuejs.org/guide/essentials/component-basics.html"&gt;Components Basics&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Componentes de contexto
&lt;/h2&gt;

&lt;p&gt;Se no seu projeto tem vários componentes que fazem algo parecido com isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[...]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isUser&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchCompany&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;[...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos então, componentes de contexto, componentes dependentes de que a lógica de alguma forma diga se é um usuário comum ou empresa, logo, ele não é um componente independente.&lt;/p&gt;

&lt;p&gt;Temos daí, dois contextos, o contexto de usuário e o de empresa, onde o ideal seria criar componentes que tenham contexto único, exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- User Info --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;UserInfo&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
await fetchUser()

&lt;span class="c"&gt;&amp;lt;!-- Company Info --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;CompanyInfo&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
await fetchCompany()

&lt;span class="c"&gt;&amp;lt;!-- In view --&amp;gt;&lt;/span&gt;
[...]
&lt;span class="nt"&gt;&amp;lt;component&lt;/span&gt; &lt;span class="na"&gt;:is=&lt;/span&gt;&lt;span class="s"&gt;"userOrCompany"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

if(isUser){
  this.userOrCompany = UserInfo
} else {
  this.userOrCompany = CompanyInfo
}
[...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Componentes genéricos, independentes
&lt;/h2&gt;

&lt;p&gt;Os componentes independentes de contexto, geralmente cumprem um único papel, não dependem de lógica contextualizada para existirem, exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- SInput --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SInput&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Inside --&amp;gt;&lt;/span&gt;
[...]
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;:type=&lt;/span&gt;&lt;span class="s"&gt;"inputType"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

props:{
 inputType:{
  type: String,
  default: () =&amp;gt; 'text',
 }
}
[...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por default no html os inputs sem a propriedade type, são do tipo texto, nem precisaria do default na propriedade do vue, mas o fato é que, esse componente consegue simplesmente existir sem precisar que alguma lógica diga para ele, de como ele deve se apresentar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Componentes reutilizáveis
&lt;/h2&gt;

&lt;p&gt;Eu particularmente já encontrei algo bem parecido com isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ModalNewUser&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ModalNewSettings&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ModalNewCity&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas não tem nada de errado nisso, correto? Deixa explicar, os componentes modais tinham exatamente replicados os mesmos comportamentos de uma modal, de forma simples, todos tinham, title, body e actions.&lt;/p&gt;

&lt;p&gt;O problema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ModalNewUser --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"modal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Add New User
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- form --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;cancel&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;add&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
[...]

&lt;span class="c"&gt;&amp;lt;!-- ModalNewSettings --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"modal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Add New Settings
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- form --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;cancel&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;add&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
[...]

&lt;span class="c"&gt;&amp;lt;!-- Etc --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma possível solução, para reutilização:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- SModal --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SModal&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Inside --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"modal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; {{ title }} &lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; {{ body }} &lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;cancel&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;add&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/slot&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

props:{
  title: {
   type: String,
   default: () =&amp;gt; 'Confirm action?',
  },
  body: {
   type: String,
   default: () =&amp;gt; 'Click, to confirm action',
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código resumido do componente a cima, mostrar duas formas de customizar um componente sem replicar código comportamental próprio da modal, se pode simplesmente mudar o texto do título e corpo por propriedades, ou, por slots caso no corpo da modal se adicione um formulário ou algo do tipo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Componente isolado
&lt;/h2&gt;

&lt;p&gt;Por si só um componente é um trecho de código isolado, seja ele aplicado à um contexto ou um componente genérico, o importante, no caso de componentes contextualizados, é isolar por contexto dando ao componente uma única responsabilidade no projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Você deve ter notado, que o foco maior foi nos Components, porque na realidade a View é quem vai encapsular todo o resto, é um pouco mais complexo que isso, é verdade, temos que ter cuidado em sempre isolar o máximo de código a fim de evitar muita lógica condicional na View tornando a manutenção complexa.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
