<?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: Samuel</title>
    <description>The latest articles on DEV Community by Samuel (@nyambe).</description>
    <link>https://dev.to/nyambe</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%2F372803%2F13610d8f-5de5-4452-b929-50ce3dbde2eb.jpeg</url>
      <title>DEV Community: Samuel</title>
      <link>https://dev.to/nyambe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nyambe"/>
    <language>en</language>
    <item>
      <title>Cursor Ai: Gracias, pero no gracias.. todavía</title>
      <dc:creator>Samuel</dc:creator>
      <pubDate>Wed, 04 Sep 2024 10:30:14 +0000</pubDate>
      <link>https://dev.to/nyambe/cursor-ai-gracias-pero-no-gracias-aun-1390</link>
      <guid>https://dev.to/nyambe/cursor-ai-gracias-pero-no-gracias-aun-1390</guid>
      <description>&lt;h2&gt;
  
  
  Por qué no estoy usando Cursor AI... todavía
&lt;/h2&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%2Ffpzcwsf7txuw0cs15y0o.jpeg" 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%2Ffpzcwsf7txuw0cs15y0o.jpeg" alt="Pointer click a código AI mal escrito"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como programador experimentado, me ha intrigado el auge de las herramientas de programación impulsadas por IA. Cursor AI, en particular, ha llamado mi atención. Aunque ofrece algunas características impresionantes, me he resistido a integrarlo completamente en mi flujo de trabajo. Estas son las razones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Control&lt;/strong&gt;: Valoro saber exactamente qué está cambiando en mi código y por qué. Con la IA, ese nivel de control puede verse comprometido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memoria y contexto&lt;/strong&gt;: Las herramientas de IA a veces retienen direcciones previas, lo que puede llevar a resultados inesperados si cambio mi enfoque a mitad del proyecto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Funcionalidad del Compositor&lt;/strong&gt;: Aunque prometedora, la función del compositor aún no está del todo lograda. Su rendimiento puede ser inconsistente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redundancia&lt;/strong&gt;: Con acceso a Claude 3.5, ChatGPT y otros LLMs, las ofertas de Cursor AI se sienten algo redundantes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Experiencia y requisitos&lt;/strong&gt;: Mi experiencia en programación me permite visualizar soluciones precisas, a menudo dentro de requisitos específicos del proyecto que la IA podría no captar completamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestión de proyectos&lt;/strong&gt;: Apreciaría una forma más robusta de introducir y gestionar los requisitos y especificaciones del proyecto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Placer de programar&lt;/strong&gt;: Realmente disfruto programando. Con TypeScript e IntelliSense en VS Code, combinado con LLMs para documentación y sugerencias de IA, ya tengo un flujo de trabajo satisfactorio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Visibilidad del control de versiones&lt;/strong&gt;: La facilidad para ver los cambios no confirmados es crucial, especialmente con código generado por IA. La interfaz de Cursor hace que esto sea menos intuitivo en comparación con VS Code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sin embargo, Cursor AI no carece de méritos. Sobresale en el análisis rápido de proyectos existentes con múltiples importaciones y es experto en hacer cambios simples en toda la base de código. Para demostraciones rápidas, proyectos simples y principiantes, es una herramienta poderosa.&lt;/p&gt;

&lt;p&gt;Aunque Cursor AI muestra promesa, aún no está listo para reemplazar mi configuración actual. Muchas de sus características destacadas podrían potencialmente implementarse como plugins de VS Code, manteniendo el entorno familiar al que me he acostumbrado. A medida que las herramientas de programación con IA evolucionan, estoy emocionado por ver cómo abordarán estas preocupaciones y potencialmente revolucionarán la forma en que programamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/live/q-1HK-mkCgo" rel="noopener noreferrer"&gt;Probando Cursor AI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>espanol</category>
      <category>cursor</category>
      <category>ai</category>
    </item>
    <item>
      <title>Renderización Dinámica de Componentes en Vue 3 y Nuxt 3: Guía Práctica y Caso Real</title>
      <dc:creator>Samuel</dc:creator>
      <pubDate>Sun, 30 Jun 2024 08:22:00 +0000</pubDate>
      <link>https://dev.to/nyambe/renderizacion-dinamica-de-componentes-en-vue-3-y-nuxt-3-guia-practica-y-caso-real-4054</link>
      <guid>https://dev.to/nyambe/renderizacion-dinamica-de-componentes-en-vue-3-y-nuxt-3-guia-practica-y-caso-real-4054</guid>
      <description>&lt;h2&gt;
  
  
  Componentes dinámicos en Vue y Nuxt: Guía Práctica y Caso Real
&lt;/h2&gt;

&lt;p&gt;Nuxt 3 ofrece una forma flexible y muy potente de renderizar diferentes componentes basados en condiciones dinámicas. Esto es especialmente útil cuando el componente exacto a renderizar no se puede determinar hasta el tiempo de ejecución.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuración Básica
&lt;/h2&gt;

&lt;p&gt;Para empezar, asegúrate de tener un componente que deseas resolver dinámicamente. Por ejemplo, supongamos que tenemos un componente llamado &lt;code&gt;MyButton&lt;/code&gt; que queremos usar dinámicamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;setup&lt;/span&gt; &lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SomeComponent&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;#components&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;MyButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolveComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MyButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el script anterior, usamos &lt;code&gt;resolveComponent&lt;/code&gt; para resolver dinámicamente el componente &lt;code&gt;MyButton&lt;/code&gt;. Este método es útil cuando los componentes necesitan cargarse de manera condicional o cuando se trata de aplicaciones grandes donde los componentes se cargan bajo demanda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uso de Componentes Dinámicos en Plantillas
&lt;/h2&gt;

&lt;p&gt;Una vez que hemos resuelto nuestros componentes, podemos usarlos en la sección de la plantilla. La etiqueta &lt;code&gt;&amp;lt;component&amp;gt;&lt;/code&gt; en Vue 3 (y por lo tanto en Nuxt 3) permite la renderización dinámica de componentes. Aquí tienes un ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;template&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;"clickable ? MyButton : 'div'"&lt;/span&gt; &lt;span class="nt"&gt;/&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;"SomeComponent"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En esta plantilla:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;La primera etiqueta &lt;code&gt;&amp;lt;component&amp;gt;&lt;/code&gt; usa una operación ternaria para decidir si renderizar el componente &lt;code&gt;MyButton&lt;/code&gt; o un simple elemento &lt;code&gt;div&lt;/code&gt; basado en la condición &lt;code&gt;clickable&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La segunda etiqueta &lt;code&gt;&amp;lt;component&amp;gt;&lt;/code&gt; renderiza &lt;code&gt;SomeComponent&lt;/code&gt; directamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Explicación Técnica
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;resolveComponent&lt;/code&gt;&lt;/strong&gt;: Esta función se utiliza para resolver dinámicamente un componente por su nombre. Devuelve un componente que se puede usar en tu plantilla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;component :is="..."&amp;gt;&lt;/code&gt;&lt;/strong&gt;: Esta etiqueta especial de componente te permite especificar qué componente renderizar dinámicamente usando el atributo &lt;code&gt;:is&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Beneficios de los Componentes Dinámicos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidad&lt;/strong&gt;: Los componentes dinámicos permiten a los desarrolladores crear aplicaciones más flexibles y modulares. Los componentes pueden renderizarse basándose en interacciones del usuario, el estado de la aplicación u otras condiciones dinámicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ejemplo en un Caso Real
&lt;/h2&gt;

&lt;p&gt;En un caso real, necesitaba cargar dinámicamente componentes según la ruta. Aquí tienes un ejemplo de cómo se puede lograr esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UiVerticalNavigation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UiNavigationAccordion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UiBreadCrumbs&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;#components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRoute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;componentList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vertical Navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vertical-navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UiVerticalNavigation&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Navigation Links (PRO)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;navigation-accordion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UiNavigationAccordion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Breadcrumbs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;breadcrumbs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UiBreadCrumbs&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;componentList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UContainer&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-5 mt-32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;component &amp;amp;&amp;amp; currentComponent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-4xl font-bold py-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;currentComponent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currentComponent.component&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-4xl font-bold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;found&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/UContainer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/style&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Importación de Componentes&lt;/strong&gt;: Importamos los componentes que queremos renderizar dinámicamente (&lt;code&gt;UiVerticalNavigation&lt;/code&gt;, &lt;code&gt;UiNavigationAccordion&lt;/code&gt;, &lt;code&gt;UiBreadCrumbs&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obtención de la Ruta&lt;/strong&gt;: Utilizamos &lt;code&gt;useRoute&lt;/code&gt; para obtener la ruta actual y el parámetro &lt;code&gt;component&lt;/code&gt; de la URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lista de Componentes&lt;/strong&gt;: Creamos una lista de componentes con sus etiquetas, identificadores y referencias a los componentes importados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selección del Componente Actual&lt;/strong&gt;: Encontramos el componente actual en la lista basado en el identificador de la URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renderización en la Plantilla&lt;/strong&gt;: Utilizamos &lt;code&gt;&amp;lt;component :is="currentComponent.component" /&amp;gt;&lt;/code&gt; para renderizar el componente seleccionado dinámicamente. Si no se encuentra el componente, mostramos un mensaje de "Component not found".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este enfoque permite que la aplicación cargue y renderice componentes específicos basados en la ruta actual, lo cual es útil para crear interfaces de usuario dinámicas y adaptativas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Usa componentes dinámicos, es un recurso que te puede ahorra muchos dolores de cabeza&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>espanol</category>
      <category>vue</category>
      <category>nuxt3</category>
    </item>
    <item>
      <title>¡Adiós Options API, Hola Script Setup! La no tan nueva forma de programar en Vue 3</title>
      <dc:creator>Samuel</dc:creator>
      <pubDate>Sat, 27 May 2023 06:24:52 +0000</pubDate>
      <link>https://dev.to/nyambe/adios-options-api-hola-script-setup-la-no-tan-nueva-forma-de-programar-en-vue-3-4o40</link>
      <guid>https://dev.to/nyambe/adios-options-api-hola-script-setup-la-no-tan-nueva-forma-de-programar-en-vue-3-4o40</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;script setup&lt;/strong&gt; proporciona una forma más concisa de utilizar la Composition API en Single File Components (SFCs).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En su versión 3, Vue introdujo un nuevo sistema para organizar el código de los componentes llamado "Composition API". Esta API es una alternativa a la "Options API", que era el sistema original para organizar el código en Vue.&lt;/p&gt;

&lt;p&gt;La diferencia fundamental entre estas dos APIs radica en cómo se organizan y se acceden a las distintas partes del componente Vue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Options API
&lt;/h2&gt;

&lt;p&gt;Cuando defines un componente utilizando la Options API, lo haces proporcionando un objeto con diferentes opciones predefinidas.&lt;/p&gt;

&lt;p&gt;Estas opciones son (entre otras): data, methods, computed, watch, props, components, etc. Cada una de estas opciones sirve para un propósito específico y define una parte de la funcionalidad del componente. Hay muchas más opciones (mounted, created, beforeDestroyed etc), de ahí el nombre (Creo yo).&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;¡Hola, Vue!&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="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Composition API
&lt;/h2&gt;

&lt;p&gt;La Composition API es una nueva forma de definir y organizar componentes en Vue 3. En lugar de utilizar diferentes opciones para diferentes características, con la Composition API, defines tu componente utilizando una sola función: setup.&lt;/p&gt;

&lt;p&gt;Dentro de la función setup, puedes definir todos los aspectos de tu componente: datos reactivos, funciones, observadores, etc. Esto te permite agrupar la lógica relacionada en lugar de dividirla por características.&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;ref&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;vue&lt;/span&gt;&lt;span class="dl"&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;¡Hola, Vue!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;sayHello&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;h2&gt;
  
  
  Diferencias
&lt;/h2&gt;

&lt;p&gt;Las principales diferencias entre estas dos APIs son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organización del código&lt;/strong&gt;: Con la Options API, la lógica relacionada se divide entre diferentes opciones, mientras que con la Composition API, puedes agrupar la lógica relacionada juntos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reutilización de código&lt;/strong&gt;: La Composition API facilita la reutilización de código y lógica entre componentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tipo de datos&lt;/strong&gt;: Con la Options API, se utiliza &lt;em&gt;this&lt;/em&gt; para acceder a los datos reactivos, mientras que con la Composition API, se utilizan funciones como &lt;em&gt;ref&lt;/em&gt; y reactive para crear y acceder a los datos reactivos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vue 3 todavía soporta completamente la Options API, por lo que puedes seguir usándola si prefieres.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script Setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt; es una nueva característica introducida en Vue 3.2 que proporciona una forma más concisa de utilizar la Composition API en Single File Components (SFCs).&lt;/p&gt;

&lt;p&gt;En lugar de exportar un objeto de configuración del componente con una función setup, puedes escribir el código de tu componente directamente en el bloque &lt;strong&gt;&lt;/strong&gt;. Cualquier variable o función que declares en &lt;strong&gt;&lt;/strong&gt; se expondrá automáticamente en la plantilla de tu componente.&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&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;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;¡Hola, Vue!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este es el equivalente exacto al componente que definimos anteriormente con la función setup estándar, pero es más conciso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ventajas de Script Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Código más conciso y limpio&lt;/strong&gt;: Puedes escribir  tu código directamente en el bloque en lugar de tener que exportar una objeto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mayor re utilización de la lógica&lt;/strong&gt;: Puedes agrupar toda la lógica relacionada con una function en un mismo bloque&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mejor soporte de Typescript&lt;/strong&gt;: Si estás utilizando Typescript, script setup y compositions API tienen mejor soporte que la options API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Control más granular sobre la reactividad&lt;/strong&gt;: Puedes decidir exactamente qué datos deben ser reactivos y cómo deben reaccionar a los cambios&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organización del código&lt;/strong&gt;: Puedes organizar el código por lógica de la funcionalidad, no por las opciones del componente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;La elección entre usar &lt;strong&gt;&lt;/strong&gt; y la Composition API versus la Options API depende en gran medida de tu proyecto y de tus preferencias personales.  No obstante &lt;strong&gt;&lt;/strong&gt; es la nueva preferencia en proyectos Vue 3.&lt;/p&gt;

</description>
      <category>español</category>
      <category>vue</category>
      <category>react</category>
    </item>
    <item>
      <title>Revoluciona tu desarrollo web: Descubre las tendencias emergentes en Vue3, TypeScript y TailwindCSS</title>
      <dc:creator>Samuel</dc:creator>
      <pubDate>Fri, 28 Apr 2023 20:36:56 +0000</pubDate>
      <link>https://dev.to/nyambe/revoluciona-tu-desarrollo-web-descubre-las-tendencias-emergentes-en-vue3-typescript-y-tailwindcss-22in</link>
      <guid>https://dev.to/nyambe/revoluciona-tu-desarrollo-web-descubre-las-tendencias-emergentes-en-vue3-typescript-y-tailwindcss-22in</guid>
      <description>&lt;h2&gt;
  
  
  Tendencias y desarrollos futuros
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RHRhozRZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/etmiausqannvc0hptwe0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RHRhozRZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/etmiausqannvc0hptwe0.png" alt="El futuro de front end" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mejoras en la experiencia del desarrollador&lt;/li&gt;
&lt;li&gt;Aumento del uso de utilidades CSS&lt;/li&gt;
&lt;li&gt;Web Components y Micro Frontends&lt;/li&gt;
&lt;li&gt;Mejoras en la seguridad y la privacidad&lt;/li&gt;
&lt;li&gt;Aumento del uso de tecnologías sin servidor&lt;/li&gt;
&lt;li&gt;Rendimiento y optimización&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Mejoras en la experiencia del desarrollador
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;API Composition&lt;/li&gt;
&lt;li&gt;Integraciones sólidas con TypeScript&lt;/li&gt;
&lt;li&gt;Expansión de las capacidades de Vite&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Aumento del uso de utilidades CSS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Popularidad de las bibliotecas de utilidades CSS&lt;/li&gt;
&lt;li&gt;Nuevas herramientas y características complementarias&lt;/li&gt;
&lt;li&gt;Plugin JIT (Just-In-Time) de TailwindCSS&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dAqyAfY9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n80r06hp69xmtckt8ire.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dAqyAfY9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n80r06hp69xmtckt8ire.png" alt="Tendencias Vue 3" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Web Components y Micro Frontends
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Componentes reutilizables y aislados&lt;/li&gt;
&lt;li&gt;Integraciones y compatibilidad mejoradas&lt;/li&gt;
&lt;li&gt;Funcionamiento en diferentes frameworks y aplicaciones&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Mejoras en la seguridad y la privacidad
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Herramientas y prácticas relacionadas con la seguridad&lt;/li&gt;
&lt;li&gt;Aplicación de las mejores prácticas de seguridad en proyectos&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Aumento del uso de tecnologías sin servidor
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arquitecturas sin servidor y funciones como servicio (FaaS)&lt;/li&gt;
&lt;li&gt;Integración en proyectos con Vue3, TypeScript y TailwindCSS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Rendimiento y optimización
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mejoras y actualizaciones en las herramientas de optimización de rendimiento&lt;/li&gt;
&lt;li&gt;Aplicación en proyectos con Vue3, TypeScript y TailwindCSS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Mantenerse actualizado y adaptarse a los cambios
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5i9BQESx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/koquhcxwhdjtoo83o2wq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5i9BQESx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/koquhcxwhdjtoo83o2wq.png" alt="El futuro de Vue 3" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seguir blogs, podcasts, conferencias y redes sociales relevantes&lt;/li&gt;
&lt;li&gt;Participar en comunidades en línea y contribuir a proyectos de código abierto&lt;/li&gt;
&lt;li&gt;Estar atento a las actualizaciones y noticias en el ecosistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8DazbAYauQQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>español</category>
      <category>vue</category>
      <category>typescript</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Introducción a Typescript: ¿Huir o Abrazarlo con Pasión?"</title>
      <dc:creator>Samuel</dc:creator>
      <pubDate>Thu, 20 Apr 2023 05:39:15 +0000</pubDate>
      <link>https://dev.to/nyambe/introduccion-a-typescript-huir-o-abrazarlo-con-pasion-11ae</link>
      <guid>https://dev.to/nyambe/introduccion-a-typescript-huir-o-abrazarlo-con-pasion-11ae</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es TypeScript y por qué utilizarlo?
&lt;/h2&gt;

&lt;p&gt;TypeScript es un lenguaje de programación de código abierto desarrollado por Microsoft que extiende JavaScript al agregar tipos estáticos. Facilita la detección de errores en tiempo de desarrollo y mejora la legibilidad y autocompletado del código.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CGJiLJ2i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/v2/resize:fit:700/1%2A1BfjwqSNOyf9TApuu-V2WQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CGJiLJ2i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/v2/resize:fit:700/1%2A1BfjwqSNOyf9TApuu-V2WQ.jpeg" alt="typescript @samiebuka" width="700" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ventajas de TypeScript sobre JavaScript
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Tipos estáticos: Ayudan a prevenir errores en tiempo de ejecución&lt;/li&gt;
&lt;li&gt;  Herramientas de desarrollo mejoradas: Autocompletado, refactorización y navegación más sólidos&lt;/li&gt;
&lt;li&gt;  Características modernas de JavaScript: Incluye características de ECMAScript recientes y propuestas&lt;/li&gt;
&lt;li&gt;  Orientación a objetos más sólida: Clases, interfaces, herencia y otros conceptos de OOP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tipos primitivos (string, number, boolean, null, undefined, symbol)
&lt;/h2&gt;

&lt;p&gt;Los tipos primitivos, también conocidos como tipos básicos o tipos fundamentales, son los bloques de construcción básicos de un lenguaje de programación. Estos tipos representan valores simples que no están compuestos por otros valores o estructuras de datos más complejas. Los tipos primitivos suelen incluir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Number: representa números, tanto enteros como decimales (por ejemplo, 42, -3, 3.14). En JavaScript y TypeScript, todos los números se representan como números de coma flotante de doble precisión según el estándar IEEE 754.&lt;/li&gt;
&lt;li&gt; String: representa secuencias de caracteres, es decir, texto (por ejemplo, "hola", "abc123"). Los strings pueden ser delimitados por comillas simples (''), comillas dobles ("") o acentos graves (``) en JavaScript y TypeScript.&lt;/li&gt;
&lt;li&gt; Boolean: representa valores verdaderos o falsos (por ejemplo, &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;). Este tipo se utiliza comúnmente para representar condiciones, resultados de comparaciones o estados binarios.&lt;/li&gt;
&lt;li&gt; Null: representa un valor nulo, es decir, una referencia que no apunta a ningún objeto o valor. En JavaScript y TypeScript, &lt;code&gt;null&lt;/code&gt; es un tipo primitivo y un valor especial que indica que una variable no tiene ningún valor o referencia.&lt;/li&gt;
&lt;li&gt; Undefined: representa un valor que no ha sido asignado o definido. En JavaScript y TypeScript, &lt;code&gt;undefined&lt;/code&gt; es un tipo primitivo y un valor especial que indica que una variable ha sido declarada pero no se le ha asignado un valor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En TypeScript, además de los tipos primitivos mencionados, existen dos tipos básicos adicionales:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Symbol: representa valores únicos e inmutables que pueden ser utilizados como identificadores para propiedades de objetos.&lt;/li&gt;
&lt;li&gt; BigInt: representa números enteros de precisión arbitraria. Este tipo permite trabajar con números enteros más grandes que el límite superior de los números de tipo &lt;code&gt;number&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;`typescript&lt;br&gt;
var s = "JavaScript syntax highlighting";&lt;br&gt;
alert(s);&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Ejemplos prácticos de uso de tipos primitivos
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;`typescript&lt;br&gt;
var s = "JavaScript syntax highlighting";&lt;br&gt;
alert(s);&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
let nombre: string = "Juan";\&lt;br&gt;
let edad: number = 30;\&lt;br&gt;
let casado: boolean = false;\&lt;br&gt;
let indefinido: undefined;\&lt;br&gt;
let nulo: null = null;&lt;/p&gt;

&lt;p&gt;function saludo(nombre: string): string {\&lt;br&gt;
  return &lt;code&gt;Hola, ${nombre}!&lt;/code&gt;;\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;console.log(saludo(nombre)); // Hola, Juan&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/play?#code/DYUwLgBAdg9gtgIwE4gFwQM5iQSygcwgF4IAiAKQFcBDKUgbgFgAoUSEAE2o-SksRBJiEAMwAGJq3AQAxtQzcY6BDBihawgGbVgGEJLYQ8HEJrw4OSiJSgmzUTgel9gVl8GHunkDDkRqrDABPfw8SAGUQlWAAClITDBlcAAcZHBg6AEpJFk0bGTB0qEwdSksY2EQUdCxcAkya7DxCAG8WCAgUMEokYoADAAk1agAaCAASFsrkEABfAEI+yVmWFhkMjDUQADpXfBiFYDKYCvgZzOyIAHoriCHgUYgqWiA"&gt;&lt;em&gt;ver online este ejemplo&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ejemplo con Symbol&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;typescript&lt;br&gt;
const simboloNombre = Symbol("nombre");\&lt;br&gt;
const simboloEdad = Symbol("edad");&lt;/p&gt;

&lt;p&gt;const persona = {\&lt;/p&gt;

&lt;p&gt;saludar: function () {\&lt;br&gt;
    console.log(&lt;code&gt;Hola, mi nombre es ${this[simboloNombre]} y tengo ${this[simboloEdad]} años.&lt;/code&gt;);\&lt;br&gt;
  },\&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;persona.saludar(); // Hola, mi nombre es Juan y tengo 30 años.&lt;/p&gt;

&lt;p&gt;// Las propiedades con símbolos no se muestran en un bucle for...in ni en Object.keys()\&lt;br&gt;
for (const prop in persona) {\&lt;br&gt;
  console.log(prop);\&lt;br&gt;
}\&lt;br&gt;
// Output: saludar&lt;/p&gt;

&lt;p&gt;console.log(Object.keys(persona)); // Output: [ 'saludar' ]&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;En este ejemplo, las propiedades &lt;code&gt;nombre&lt;/code&gt; y &lt;code&gt;edad&lt;/code&gt; del objeto &lt;code&gt;persona&lt;/code&gt; usan símbolos como claves en lugar de strings. Esto garantiza que estas claves sean únicas y no entren en conflicto con otras propiedades que puedan tener el mismo nombre.&lt;/p&gt;

&lt;p&gt;Ejemplo con BigInt&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;typescript&lt;br&gt;
const numeroGrande1: bigint = BigInt("123456789012345678901234567890");\&lt;br&gt;
const numeroGrande2: bigint = BigInt("987654321098765432109876543210");&lt;/p&gt;

&lt;p&gt;const suma: bigint = numeroGrande1 + numeroGrande2;\&lt;br&gt;
const multiplicacion: bigint = numeroGrande1 * numeroGrande2;&lt;/p&gt;

&lt;p&gt;console.log("Suma:", suma.toString()); // Suma: 1111111110111111111011111111100\&lt;br&gt;
console.log("Multiplicación:", multiplicacion.toString());\&lt;br&gt;
// Multiplicación: 12193263113702179522496570642228279470&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;En este ejemplo, creamos dos números &lt;code&gt;BigInt&lt;/code&gt; a partir de strings que contienen números enteros muy grandes. Luego realizamos operaciones de suma y multiplicación con estos números &lt;code&gt;BigInt&lt;/code&gt;. Con &lt;code&gt;BigInt&lt;/code&gt;, podemos trabajar con números enteros más grandes que el límite superior de los números de tipo &lt;code&gt;number&lt;/code&gt; sin perder precisión.&lt;/p&gt;
&lt;h2&gt;
  
  
  Interfaces y tipos personalizados
&lt;/h2&gt;

&lt;p&gt;Una interfaz en TypeScript es una estructura que define la forma de un objeto, es decir, el conjunto de propiedades y métodos que un objeto debe tener.&lt;/p&gt;

&lt;p&gt;Las interfaces en TypeScript se crean utilizando la palabra clave &lt;code&gt;interface&lt;/code&gt; seguida del nombre de la interfaz. Las interfaces pueden contener declaraciones de propiedades, métodos y también pueden ser extendidas o implementadas por otras interfaces y clases.&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;typescript&lt;br&gt;
interface Persona {\&lt;br&gt;
  nombre: string;\&lt;br&gt;
  edad: number;\&lt;br&gt;
  casado?: boolean;\&lt;br&gt;
  saludar: () =&amp;gt; string;\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const juan: Persona = {\&lt;br&gt;
  nombre: "Juan",\&lt;br&gt;
  edad: 30,\&lt;br&gt;
  saludar: function () {\&lt;br&gt;
    return &lt;code&gt;Hola, soy ${this.nombre} y tengo ${this.edad} años. ${this.casado ? 'Estoy casado' : 'Estoy Soltero'}&lt;/code&gt;;\&lt;br&gt;
  },\&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;console.log(juan.saludar()); // "Hola, soy Juan y tengo 30 años. Estoy Soltero"&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
Los tipos personalizados se crean utilizando la palabra clave &lt;/code&gt;type`, seguida del nombre del tipo y la definición del mismo. Estos tipos te permiten especificar estructuras de datos más complejas y darles un nombre semántico, lo que mejora la legibilidad y la organización del código.&lt;/p&gt;

&lt;p&gt;Los tipos personalizados también pueden representar uniones de tipos, alias de tipos primitivos y tipos más complejos, como funciones y tuplas. Por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`typescript&lt;br&gt;
type ID = string | number;\&lt;br&gt;
type Callback = (error: Error | null, data: any) =&amp;gt; void;\&lt;br&gt;
type Punto3D = [number, number, number];&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Debería estar usando Typescript ya?
&lt;/h2&gt;

&lt;p&gt;Yo creo que sí, pero la respuesta no se tan sencilla como parece. Te pongo algunos ejemplos donde usar Typescript es una ventaja clara.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ventajas de usar Typescript
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Detección de errores: TypeScript verifica los tipos de datos en tiempo de compilación, lo que ayuda a detectar errores antes de que el código se ejecute en tiempo de ejecución. Si copias y pegas código de un sitio a otro y hay problemas de tipo, TypeScript te alertará sobre estos problemas antes de que se conviertan en errores difíciles de encontrar en tiempo de ejecución.&lt;/li&gt;
&lt;li&gt; Mejora la colaboración entre equipos: TypeScript proporciona una forma explícita de definir las estructuras de datos y las expectativas de tipos en el código. Esto facilita la comprensión y la colaboración en el código escrito por otros equipos, ya que los desarrolladores pueden ver rápidamente cómo deben interactuar con las funciones y objetos proporcionados por otros equipos.&lt;/li&gt;
&lt;li&gt; Navegación y refactorización en proyectos grandes: TypeScript mejora la navegación y refactorización en proyectos grandes al proporcionar información de tipo detallada y herramientas de análisis estático. Las herramientas de desarrollo integradas en los editores de código (como Visual Studio Code) pueden aprovechar esta información de tipo para proporcionar sugerencias de código, saltos a definiciones, cambios de nombre globales y otras características que facilitan la navegación y la modificación del código en proyectos grandes y complejos.&lt;/li&gt;
&lt;li&gt; Integración con frameworks y bibliotecas: TypeScript es compatible con muchas bibliotecas y frameworks populares de JavaScript, como React, Angular y Vue. Los archivos de declaración de tipo (archivos &lt;code&gt;.d.ts&lt;/code&gt;) proporcionados por estos proyectos permiten a los desarrolladores utilizar TypeScript para aprovechar la verificación de tipos, la autocompletión de código y otras características útiles al trabajar con estas bibliotecas y frameworks.&lt;/li&gt;
&lt;li&gt; Desarrollo de aplicaciones escalables: TypeScript es especialmente útil en proyectos de software grandes y a largo plazo que requieren escalabilidad y mantenibilidad. El sistema de tipos de TypeScript y las características de lenguaje adicionales (como interfaces, clases y decoradores) permiten a los desarrolladores crear aplicaciones modulares y bien estructuradas que son más fáciles de mantener y ampliar a lo largo del tiempo. Esto es especialmente útil en aplicaciones empresariales y proyectos de código abierto con muchos colaboradores.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Desventajas de implementar Typescript
&lt;/h3&gt;

&lt;p&gt;Aunque TypeScript ofrece muchas ventajas, también hay algunas desventajas o desafíos potenciales al implementarlo en un proyecto. Algunas de estas desventajas incluyen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Curva de aprendizaje: TypeScript agrega un conjunto adicional de características y conceptos a JavaScript, lo que significa que los desarrolladores que no estén familiarizados con TypeScript tendrán que aprender estos conceptos antes de poder trabajar de manera efectiva en un proyecto que lo utilice.&lt;/li&gt;
&lt;li&gt; Tiempo de compilación: TypeScript requiere un paso de compilación adicional para convertir el código TypeScript en JavaScript antes de que pueda ejecutarse en un navegador o entorno de Node.js. Este paso de compilación puede aumentar el tiempo de desarrollo y construcción, especialmente en proyectos grandes.&lt;/li&gt;
&lt;li&gt; Integración con bibliotecas y frameworks: Aunque TypeScript es compatible con la mayoría de las bibliotecas y frameworks populares de JavaScript, puede haber casos en los que una biblioteca o un framework no tenga tipos de TypeScript disponibles o estén desactualizados. Esto puede requerir que los desarrolladores creen sus propias definiciones de tipos o trabajen con tipos menos precisos, lo que puede aumentar la complejidad y el tiempo de desarrollo.&lt;/li&gt;
&lt;li&gt; Verbosidad: El uso de tipos explícitos y anotaciones de tipo en TypeScript puede hacer que el código sea más largo y posiblemente más difícil de leer en comparación con el código JavaScript puro. Los desarrolladores pueden necesitar tiempo para adaptarse a este estilo de codificación y encontrar un equilibrio adecuado entre la precisión de los tipos y la legibilidad del código.&lt;/li&gt;
&lt;li&gt; Adopción en el equipo: Si trabajas en un equipo con desarrolladores que no están familiarizados con TypeScript, puede haber resistencia a la adopción de TypeScript debido a la curva de aprendizaje y la preocupación por la compatibilidad con las herramientas y bibliotecas existentes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En general, es importante sopesar las ventajas y desventajas de implementar TypeScript en función de las necesidades específicas de tu proyecto y equipo. Si las ventajas en términos de seguridad de tipos, escalabilidad y mantenibilidad superan los desafíos y las desventajas potenciales, entonces TypeScript puede ser una adición valiosa a tu proyecto.&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Soy principiante, qué debo aprender antes Typescript o Javascript?
&lt;/h2&gt;

&lt;p&gt;JavaScript es el lenguaje base sobre el que se construye TypeScript, por lo que comprender los fundamentos de JavaScript te permitirá aprender TypeScript de manera más efectiva. Conocer las estructuras de control, funciones, objetos y otros conceptos básicos de JavaScript es esencial para cualquier desarrollador web.&lt;/p&gt;

&lt;p&gt;No obstante, puesto que Typescript está basado en Javascript, puedes aprender puedes aprender los principios básicos de Javascript en el entorno de Typescript.&lt;/p&gt;

&lt;p&gt;Este código es valido en Javascript y en Typescript por ejemplo&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`typescript&lt;br&gt;
let nombre = "Juan";\&lt;br&gt;
let edad = 30;\&lt;br&gt;
let casado = false;\&lt;br&gt;
let indefinido;\&lt;br&gt;
let nulo = null;\&lt;br&gt;
let simbolo = Symbol("descripcion");\&lt;br&gt;
function saludo(nombre) {\&lt;br&gt;
    return `Hola, ${nombre}!`;\&lt;br&gt;
}\&lt;br&gt;
console.log(saludo(nombre)); // Hola, Juan&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/spt9c0HQu1s"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión - Abrazarlo, con pasión moderada!
&lt;/h2&gt;

&lt;p&gt;En general, es importante sopesar las ventajas y desventajas de implementar TypeScript en función de las necesidades específicas de tu proyecto y equipo. Si las ventajas en términos de seguridad de tipos, escalabilidad y mantenibilidad superan los desafíos y las desventajas potenciales, entonces TypeScript puede ser una adición valiosa a tu proyecto.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>espanol</category>
    </item>
  </channel>
</rss>
