course v3 cover

Curso de VUE 3 – Sistema de componentes

Curso de Vue 3 – Sistema de Componentes

Los componentes son una de las características más importantes de Vue, ya que permiten la creación de aplicaciones web modulares, reutilizables y escalables.

En Vue 3, existen varias formas de crear componentes, siendo los Componentes de Archivo Único (SFC, por sus siglas en inglés) la opción más popular y recomendada debido a su simplicidad y organización.

¿Qué es un Componente de Archivo Único (SFC)?

Los Componentes de Archivo Único (.vue) son la forma más común y recomendada de crear componentes en Vue.

En un solo archivo, puedes definir el template (HTML), el script (JavaScript, TypeScript, etc.) y los estilos (CSS, SCSS, etc.), proporcionando una estructura clara y fácil de manejar.

Aquí tienes un ejemplo básico de un SFC:

<template>
  <div class="container">
    <h1 v-text="message" />
  </div>
</template>
<script setup>
  import { ref } from 'vue';
  const message = ref('Hello, Vue 3!');
</script>
<style scoped>
.container {
  color: blue;
}
</style>

Componentes Funcionales

Los componentes funcionales son componentes sin estado y sin instancia de Vue, lo que significa que son más ligeros y eficientes cuando no se necesita mantener datos reactivos o manejar el ciclo de vida del componente.

Creación de Componentes con Vue 3

En Vue 3, los componentes se pueden crear principalmente de dos formas: utilizando la Options API o la Composition API con <script setup>. Nos centraremos en la creación de componentes utilizando Componentes de Archivo Único (SFC) y ambas APIs.

Ejemplo con la Options API

Aquí tienes un ejemplo básico de un componente creado con la Options API:

<template>
  <div>
    {{ message }}
  </div>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello, World!'
    }
  }
}
</script>
<style scoped>
  div {
    font-size: 24px;
    color: red;
  }
</style>

En este ejemplo, hemos definido un componente llamado HelloWorld que muestra un mensaje en la pantalla. Utilizamos la opción data para definir el estado del componente y mostramos el mensaje usando la sintaxis de plantillas de Vue ({{ message }}).

Ejemplo con la Composition API y <script setup>

Ahora, veremos el mismo componente utilizando la Composition API y <script setup>:

<template>
  <div>
    {{ message }}
  </div>
</template>
<script setup>
  import { ref } from 'vue';
  const message = ref('Hello, World!');
</script>
<style scoped>
  div {
    font-size: 24px;
    color: red;
  }
</style>

En este ejemplo, utilizamos la función ref de la Composition API para crear una variable reactiva message y mostramos el mensaje en la pantalla.

Comunicación entre Componentes: Props y Eventos

Vue permite la comunicación entre componentes mediante el paso de props y la emisión de eventos.

Ejemplo de Paso de Props y Eventos con Options API

A continuación, creamos un componente Button que acepta una prop label y emite un evento click:

<template>
  <button @click="emitClick">
    {{ label }}
  </button>
</template>
<script>
export default {
  props: {
    label: {
      type: String,
      required: true
    }
  },
  methods: {
    emitClick() {
      this.$emit('click');
    }
  }
}
</script>

El componente Button acepta una prop label para el texto del botón y emite un evento click cuando se hace clic en él. Luego, lo utilizamos en un componente padre:

<template>
  <div>
    <button-component label="Click me!" @click="handleClick"></button-component>
  </div>
</template>
<script>
  import ButtonComponent from './Button.vue';
  export default {
    components: {
      ButtonComponent
    },
    methods: {
      handleClick() {
        alert('Button was clicked!');
      }
    }
  }
</script>

Ejemplo con Composition API y <script setup>

Aquí tienes el mismo componente Button utilizando la Composition API:

<template>
  <button @click="emitClick">
    {{ label }}
  </button>
</template>
<script setup>
  import { defineProps, defineEmits } from 'vue';
  const props = defineProps({
    label: {
      type: String,
      required: true
    }
  });
  const emit = defineEmits(['click']);
  function emitClick() {
    emit('click');
  }
</script>

Y su uso en un componente padre:

<template>
  <div>
    <button-composition label="Click me!" @click="handleClick"></button-composition>
  </div>
</template>
<script setup>
  import ButtonComposition from './ButtonComposition.vue';
  function handleClick() {
    alert('Button was clicked!');
  }
</script>

Uso de Slots para Contenido Distribuido

Los slots permiten la creación de componentes con contenido distribuido, inyectando contenido desde el componente padre al hijo.

Ejemplo de Slots con Options API

Un componente Card con slots podría verse así:

<template>
  <div class="card">
    <div class="card-header">
      <slot name="header"></slot>
    </div>
    <div class="card-body">
      <slot></slot>
    </div>
    <div class="card-footer">
      <slot name="footer"></slot>
    </div>
  </div>
</template>
<script>
  export default {}
</script>
<style scoped>
  .card {
    border: 1px solid #ccc;
    margin-bottom: 1rem;
  }
  .card-header {
    background-color: #f5f5f5;
    border-bottom: 1px solid #ccc;
    padding: 0.5rem 1rem;
  }
  .card-body {
    padding: 0.5rem 1rem;
  }
  .card-footer {
    background-color: #f5f5f5;
    border-top: 1px solid #ccc;
    padding: 0.5rem 1rem;
  }
</style>

Y su uso:

<template>
  <div>
    <card-component>
      <template #header>
        <h3>Card Header</h3>
      </template>
      <p>Card Body</p>
      <template #footer>
        <p>Card Footer</p>
      </template>
    </card-component>
  </div>
</template>
<script>
  import CardComponent from './Card.vue';
  export default {
    components: {
      CardComponent
    }
  }
</script>

Componentes Dinámicos y Asincrónicos

Los componentes dinámicos se renderizan en función de condiciones y los componentes asincrónicos se cargan de manera dinámica. Se puede utilizar la directiva v-if para manejar los componentes dinámicos y defineAsyncComponent para los asincrónicos.

Ejemplo con Composition API y <script setup>

Aquí tienes un ejemplo de componente asincrónico:

<template>
  <div>
    <button @click="changeComponent">Change Component</button>
    <component :is="currentComponent"></component>
  </div>
</template>

<script setup>
import { ref, defineAsyncComponent } from 'vue'

const ComponentA = defineAsyncComponent(() => import('./ComponentA.vue'))
const ComponentB = defineAsyncComponent(() => import('./ComponentB.vue'))
const ComponentC = defineAsyncComponent(() => import('./ComponentC.vue'))

const currentComponent = ref(ComponentA)

function changeComponent() {
  const components = [ComponentA, ComponentB, ComponentC]
  const index = components.indexOf(currentComponent.value)
  currentComponent.value = components[(index + 1) % components.length]
}
</script>

Hooks del Ciclo de Vida de los Componentes

Vue proporciona hooks para manejar distintas fases del ciclo de vida de un componente, como beforeCreate, created, mounted, y más.

Ejemplo con Options API

Aquí tienes un ejemplo de cómo usar los hooks del ciclo de vida con la Options API:

<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  },
  beforeCreate() {
    this.message = 'beforeCreate'
    console.log('beforeCreate')
  },
  created() {
    this.message = 'created'
    console.log('created')
  },
  beforeMount() {
    this.message = 'beforeMount'
    console.log('beforeMount')
  },
  mounted() {
    this.message = 'mounted'
    console.log('mounted')
  },
  beforeUpdate() {
    this.message = 'beforeUpdate'
    console.log('beforeUpdate')
  },
  updated() {
    this.message = 'updated'
    console.log('updated')
  },
  beforeUnmount() {
    this.message = 'beforeUnmount'
    console.log('beforeUnmount')
  },
  unmounted() {
    this.message = 'unmounted'
    console.log('unmounted')
  }
}
</script>

Ejemplo con Composition API y <script setup>

Aquí tienes un ejemplo de uso de hooks del ciclo de vida:

<template>
  <div>
    {{ message }}
  </div>
</template>

<script setup>
import { ref, onBeforeCreate, onCreated, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'

const message = ref('')

onBeforeCreate(() => {
  message.value = 'beforeCreate'
})

onCreated(() => {
  message.value = 'created'
})

onBeforeMount(() => {
  message.value = 'beforeMount'
})

onMounted(() => {
  message.value = 'mounted'
})

onBeforeUpdate(() => {
  message.value = 'beforeUpdate'
})

onUpdated(() => {
  message.value = 'updated'
})

onBeforeUnmount(() => {
  message.value = 'beforeUnmount'
})

onUnmounted(() => {
  message.value = 'unmounted'
})
</script>

Conclusión

En este módulo, hemos cubierto varios aspectos fundamentales de los componentes en Vue 3, como los Componentes de Archivo Único (SFC), la Options API, la Composition API, la comunicación entre componentes mediante props y eventos, el uso de slots, componentes dinámicos y asincrónicos, y los hooks del ciclo de vida.

Explora cada uno de estos temas en tus propios proyectos para aprovechar al máximo las capacidades de Vue 3 y construir aplicaciones web modernas y dinámicas.

course v3 cover

Curso de VUE 3 – Plantillas y bindeo de datos

Curso de VUE 3 – Plantillas y bindeo de datos

Seguimos con el curso de Vue 3, y en esta nueva entrada del blog veremos que son los templates (plantillas), el bindeo de datos y algunas directivas.

¡Comencemos!

Sintaxis de plantillas

Las plantillas en Vue.js se escriben usando HTML estándar y añadiendo una sintaxis especial que nos proporciona Vue.

Si conoces o has trabajado con algún otro framework o librería como Angular, React o Svelte, esta sintaxis te resultara familiar.

En Vue cuando queremos mostrar datos en el template o evaluar expresiones, podemos usar las llaves dobles: {{ dato o expresión }}

<script setup>
  import { ref } from 'vue';
  const message = ref('Hello World!!!');
</script>

<template>
  <h1>{{ message }}</h1>
</template>

vue3-c2-1

En este ejemplo, la expresión {{ message }} se reemplaza por el valor de la variable message.

También podemos realizar evaluaciones de código en el mismo template.

<script setup>
  import { ref } from 'vue';
  const message = ref('Hello World!!!');
</script>
<template>
  <h1>{{ message }}</h1>
  <p>Suma 10 * 20 = {{ 10 * 20 }}</p>
</template>

vue3-c2-2

Existen otras formas de mostrar datos en un template y es mediante el uso de directivas, pero eso lo veremos en breve.

Enlaces de datos reactivos

De forma general Vue nos proporciona un sistema de bindeo de datos reactivo que nos permite conectar el estado la aplicación al interfaz de usuario.

Cuando el estado de la aplicación cambia, la interfaz de usuario se actualiza automáticamente para reflejar los cambios.

En Vue 3 y gracias a la Composition API podemos declarar el estado reactivo mediante el uso de funciones reactvie y ref.

<script setup>
  import { ref } from 'vue';
  const name = ref('');
</script>
<template>
  <div>
    <div>
      <input type="text" v-model="name" placeholder="Name" />
    </div>
    <div>
      Name: <label>{{ name }}</label>
    </div>
  </div>
</template>

vue3-c2-3

Directiva v-bind y v-on

La directiva v-bind se utiliza para enlazar una propiedad de un componente a un atributo HTML.

La sintaxis de la directiva v-bind es v-bind:atributo="valor" o podemos usar su shorthand (forma abreviada) de la siguiente forma :atributo="valor".

<script setup>
  import { ref } from 'vue';
  const imageURL = ref('https://www.arsys.es/blog/file/uploads/2020/04/01-vuejs.jpg');
</script>
<template>
  <div>
    <img :src="imageURL" />
    <img v-bind:src="imageURL" />
  </div>
</template>
<style>
  img {
    width: 200px;
    height: auto;
    border: 1px solid #cccccc;
  }
</style>

vue3-c2-4

La directiva v-on se utiliza para enlazar un método de un componente a un evento HTML.

La sintaxis de la directiva v-on es v-on:evento="método" o podemos usar su shorthand (forma abreviada) de la siguiente forma @evento="metodo".

<script setup>
  import { ref } from 'vue';
  const text = ref('');
  const reverseText = () => {
    text.value = text.value.split('').reverse().join('');
  };
</script>
<template>
  <div>
    <input type="text" v-model="text" placeholder="Write a text"/>
    <button v-on:click="reverseText">Click to reverse text</button>
    <button @click="reverseText">Click to reverse text</button>
  </div>
  <div>
    Reverse text: {{ text }}
  </div>
</template>

Directiva v-text y v-html

Estas directivas se utilizan para actualizar el contenido de un elemento HTML de manera reactiva.

Cada una tiene un propósito específico y se usa en diferentes casos según el tipo de contenido que se necesita renderizar.

La directiva v-text se usa para actualizar el contenido de texto de un elemento.

Es similar a usar interpolación con dobles llaves {{}}, pero v-text evita el parpadeo (flashing) del contenido cuando se renderiza inicialmente.

<script setup>
  import { ref } from 'vue';
  const text = ref('');
</script>
<template>
  <div>
    <input type="text" v-model="text" placeholder="Write a text"/>
    <p v-text="text"></p>
  </div>
</template>

La directiva v-html se usa para insertar contenido HTML sin escaparlo, es decir, el contenido se renderiza como HTML real.

Esto es útil cuando necesitas renderizar contenido HTML dinámico proveniente de una fuente confiable.

<script setup>
  import { ref } from 'vue';
  const text = ref('');
</script>
<template>
  <div>
    <input type="text" v-model="text" placeholder="Write a text" />
    <p v-html="text"></p>
  </div>
</template>

vue3-c2-5

Directiva v-if, v-show y v-for

La directiva v-if se usa para mostrar u ocultar un elemento HTML en función de una condición.

Debemos tener en cuenta que la directiva v-if en base a la condición dada, el elemento no se renderiza en el DOM.

<script setup>
  import { ref } from 'vue';
  const show = ref(false);
  const toggleTitle = () => {
    show.value = !show.value;
  };
</script>
<template>
  <div>
    <p v-if="show">Title</p>    
    <p>
      <button @click="toggleTitle">Toggle</button>
    </p>
  </div>
</template>

v-if-2 v-if-1

La directiva v-show funciona exactamente igual que v-if, pero en lugar de añadir o eliminar el elemento del DOM, simplemente ajusta la propiedad CSS display del elemento.

<script setup>
  import { ref } from 'vue';
  const show = ref(false);
  const toggleTitle = () => {
    show.value = !show.value;
  };
</script>
<template>
  <div>
    <p v-show="show">Title</p>    
    <p>
      <button @click="toggleTitle">Toggle</button>
    </p>
  </div>
</template>

v-show-2 v-show-1

La directiva v-for se utiliza para renderizar una lista de elementos HTML en función de un array de datos, y sus sintaxis es v-for="(item, index) in array"

<script setup>
  import { reactive } from 'vue';
const dataTable = reactive([
    { id: 1, name: 'John Doe', age: 30, gender: 'Male', city: 'New York' },
    { id: 2, name: 'Jane Doe', age: 25, gender: 'Female', city: 'Los Angeles' },
    { id: 3, name: 'Peter Smith', age: 40, gender: 'Male', city: 'Chicago' },
    { id: 4, name: 'Mary Smith', age: 35, gender: 'Female', city: 'Houston' },
    { id: 5, name: 'David Jones', age: 50, gender: 'Male', city: 'Dallas' }
  ]);

</script>
<template>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
        <th>Gender</th>
        <th>City</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="row in dataTable" :key="row.id">
        <td>{{ row.id }}</td>
        <td>{{ row.name }}</td>
        <td>{{ row.age }}</td>
        <td>{{ row.gender }}</td>
        <td>{{ row.city }}</td>
      </tr>
    </tbody>
  </table>
</template>
<style>
  @import url(https://fonts.googleapis.com/css?family=Roboto:400,500,300,700);
  body {
    font-family: 'Roboto', sans-serif;
  }
  table {
    border-collapse: collapse;
    width: 100%;
  }
  th {
    background-color: #f2f2f2;
    font-weight: bold;
  }
  th, td {
    border: 1px solid #ddd;
    padding: 8px;
    text-align: left;
  }
</style>

v-for-1

En este ejemplo usamos la directiva v-for para mostrar las filas de una tabla en función del array dataTable, usando la directiva :key  para proporcionar una clave única a cada elemento de la tabla.

course v3 cover

Curso de VUE 3 – Introducción a Vue 3

Curso de VUE 3 – Introducción a Vue 3

En esta nueva entrad del blog, quiero darte la bienvenida al nuevo curso de Vue 3, donde aprenderemos a desarrollar aplicaciones web.

A continuación algunas de las cosas que veremos en el curso:

  • Sintaxis de los templates (plantillas)
  • Reactividad usando computed y watches
  • Directivas más comunes
  • Eventos
  • Componentes
  • Manipulación del DOM

¡Comencemos!

Diferencias entre Vue 3 y Vue 2

  • Mejor rendimiento: Más rápido y eficiente gracias a la implementación de un nuevo motor de reactividad y la optimización del compilador.
  • Composition API: Introduce una nueva forma de escribir componentes llamada Composition API, que nos permite una mayor flexibilidad y reutilización de código.
  • Fragmentos y teletransporte: Nos permite crear múltiples elementos raíz en un componente y teletransportar elementos a otros componentes.
  • Mejoras en el manejo de eventos y transiciones y mejoras en integración con TypeScript.

Instalación y configuración del entorno de desarrollo

Para empezar a trabajar con Vue 3, es necesario instalar Node.js e instalar el Vue CLI.

El Vue CLI es una herramienta de la línea de comandos que nos permite crear y configurar proyectos.

Para instalarlo usaremos el siguiente comando:

npm install -g @vue/cli

Una vez instalado, procederemos a crear un nuevo proyecto usando la siguiente línea de comandos:

vue create my-project

Este comando nos abrirá un asistente interactivo en el cual podremos seleccionar las opciones de configuración del proyecto.

Por último, solo nos queda arranca nuestro servidor de desarrollo, y para ellos usaremos el siguiente comando:

npm run serve

Esto nos abrirá el proyecto en el navegador web y podremos ver cualquier cambio en tiempo real.

Con esta pequeña introducción, hemos visto algunas mejoras respecto a Vue 2 y además hemos podido crear un proyecto base desde cero usando el CLI de Vue.

qrcode vue3

Aplicación para la generación de códigos QR usando Vue 3

Aplicación para la generación de códigos QR usando Vue 3

En la era digital, las aplicaciones juegan un papel fundamental al ofrecer soluciones innovadoras y prácticas. En este artículo, exploraremos la creación de una aplicación que utiliza tecnologías modernas como Vue 3, Vite y Material Design Lite (MDL) para generar códigos QR. Esta aplicación no solo genera códigos QR, sino que también ofrece una personalización completa para que puedas adaptar el aspecto según tus preferencias.

Vue 3 y Vite: La Combinación Perfecta

Vue 3, es la última versión del popular framework JavaScript, que ofrece un rendimiento impresionante y una sintaxis más intuitiva. Combinado con Vite, un entorno de desarrollo rápido, podemos construir aplicaciones Vue de manera eficiente, aprovechando las ventajas de la modularidad y la velocidad de desarrollo.

Material Design Lite: Un Toque de Estilo Elegante

Material Design Lite (MDL) agrega un toque elegante a nuestra aplicación, proporcionando un conjunto de componentes y estilos que siguen los principios de diseño de Google. La interfaz limpia y moderna no solo mejora la estética, sino que también garantiza una experiencia de usuario coherente y atractiva.

Generación de Códigos QR Dinámicos

La función central de nuestra aplicación es la generación de códigos QR de manera dinámica. Con Vue 3, podemos gestionar fácilmente el estado de la aplicación y actualizar la interfaz de usuario en tiempo real. Utilizamos la librería qrious para crear códigos QR de alta calidad.

Amplia personalización

La verdadera innovación de nuestra aplicación radica en la capacidad de personalizar completamente el aspecto de los códigos QR generados. Puedes ajustar colores, tamaños y seleccionar entre diversos estilos predefinidos. La flexibilidad ofrecida por Vue 3 facilita la integración de opciones de configuración intuitivas.

Cómo Funciona:

  1. Copia en la barra de direcciones la siguiente url: https://qrcode.tecnops.es/ o pulsa aquí para abrir la aplicación en una nueva ventana.
  2. Selecciona tu Estilo: Escoge entre una variedad de estilos predefinidos o personaliza cada detalle según tus preferencias.
  3. Añade Detalles: Integra información adicional, como texto descriptivo, en tus códigos QR para hacerlos más informativos.
  4. Visualiza en Tiempo Real: Vue 3 garantiza que cualquier cambio que realices en la configuración se refleje instantáneamente en la interfaz de usuario.
  5. Descarga y Comparte: Una vez que estés satisfecho con el aspecto de tu código QR, descárgalo para su uso en impresiones, sitios web o materiales promocionales.

Conclusión:

En resumen, nuestra aplicación basada en Vue 3, Vite y Material Design Lite (MDL) redefine la generación de códigos QR al ofrecer no solo funcionalidad, sino también la capacidad de dar rienda suelta a tu creatividad. La combinación de tecnologías modernas y diseño elegante hace que esta aplicación sea una herramienta valiosa para profesionales de marketing, empresas y cualquier persona que busque destacar en la era digital. ¡Descubre una nueva forma de presentar información con nuestra aplicación innovadora!

pscode cover

Desarrollando una Aplicación de Generación de Código con Inteligencia Artificial

Desarrollando una Aplicación de Generación de Código con Inteligencia Artificial

La inteligencia artificial (IA) es un campo que ha avanzado a pasos agigantados en los últimos años, y su impacto se puede sentir en una variedad de aplicaciones y servicios.

En este artículo, quiero compartir una emocionante noticia con todos ustedes: he desarrollado una aplicación basada en Vue3 y Vuesax que utiliza la inteligencia artificial para generar código en múltiples lenguajes.

Lo mejor de todo es que es completamente gratuita y no almacena ningún dato personal.

Vue3 y Vuesax: Las Herramientas Clave

Para llevar a cabo este proyecto, he utilizado la última versión de VueJS (Vue3) y Vuesax como librería de componentes.

Estas herramientas me permitieron construir una interfaz de usuario elegante y funcional para nuestra aplicación de generación de código.

Vue3 es conocido por su facilidad de uso y flexibilidad, lo que lo convierte en una elección perfecta para proyectos de este tipo.

Por su parte, Vuesax proporciona una amplia gama de componentes predefinidos que facilitan la creación de una interfaz de usuario atractiva y receptiva.

Nuestra Fuente de Poder: Modelo «Phind/Phind-CodeLlama-34B-v2»

El corazón de la aplicación es el modelo de inteligencia artificial «Phind/Phind-CodeLlama-34B-v2«.

Este modelo ha sido puesto a disposición por la comunidad de desarrolladores en Hugging Face, un recurso valioso para la comunidad de IA.

Además, me gustaría reconocer a Meta la creación de este modelo, cuyo trabajo ha hecho posible que nuestra aplicación sea una realidad.

Generación de Texto y Código con Inteligencia Artificial

La generación de texto y código con modelos de inteligencia artificial es un campo en constante crecimiento.

Estos modelos son entrenados en enormes conjuntos de datos y pueden generar contenido de manera coherente y relevante en una variedad de lenguajes de programación.

La aplicación se basa en la capacidad de este modelo para comprender solicitudes de generación de código y proporcionar resultados precisos y útiles.

¡Pruébalo por Ti Mismo!

Si deseas experimentar con la aplicación de generación de código basada en IA, te invitamos a visitar https://ps-code.tecnops.es.

PS CODE

Espero que encuentres la herramienta útil y que te ayude a agilizar tus tareas de desarrollo de software.

Agradecimientos a la Comunidad

Quiero expresar mi más sincero agradecimiento a la comunidad de desarrolladores y entusiastas de la inteligencia artificial.

Los avances en este campo no serían posibles sin la colaboración y el espíritu de compartir conocimiento que caracterizan a esta comunidad.

También quiero agradecer a Hugging Face y Meta por proporcionar el modelo que ha hecho posible nuestra aplicación.

En resumen, la aplicación de generación de código es un emocionante ejemplo de cómo la inteligencia artificial puede ser aplicada para facilitar el trabajo de los desarrolladores.

Esperamos que la encuentres útil y que contribuya a tu productividad en el mundo del desarrollo de software.

¡Explora, experimenta y únete a nosotros en la emocionante era de la IA aplicada!

Descarga y Crea Contenido con Nuestra Aplicación Educativa

Descarga y Crea Contenido con Nuestra Aplicación Educativa

Introducción

En el mundo de la programación, aprender cómo funcionan diferentes bibliotecas y tecnologías puede ser una tarea desafiante pero emocionante.

Mi última creación es una aplicación educativa desarrollada utilizando JavaScript, Vue3 y Quasar 2, yt-converter y Stable Difussion, que permite obtener información de videos de YouTube, descargar audios y videos en varias calidades, y crear impresionantes imágenes. ¡Lo mejor de todo es que es totalmente gratuita!

Para acceder a ella y disfrutarla puedes acceder desde aquí.

Como funciona

La aplicación tiene un interface de usuario muy sencillo:

stable 1

Con la primera pestaña podemos obtener información sobre videos de YouTube.

Gracias al uso de la librería yt-converter, ahora puedes explorar este vasto universo de contenido directamente desde nuestra aplicación.

Una vez que ingreses la URL del video de YouTube que te interese, nuestra aplicación recuperará y mostrará toda la información relevante sobre ese video. ¿Te preguntas cuántas vistas tiene tu video favorito? ¿Quieres saber la duración exacta para programar tu tiempo? ¿O tal vez necesitas una breve descripción para compartir con tus amigos? Nuestra aplicación te proporcionará todos estos detalles y más, en una interfaz fácil de usar y elegante.

Pero eso no es todo. Sabemos que muchas veces deseas guardar contenido de YouTube para verlo más tarde sin conexión o compartirlo con otros. Por eso, hemos incorporado dos tablas llenas de enlaces para descargar el audio y el video de YouTube que has seleccionado. Puedes elegir entre diferentes calidades de audio y video según tus necesidades y preferencias. ¿Quieres escuchar ese discurso inspirador en alta calidad o simplemente necesitas un archivo de audio ligero para un rápido repaso? ¡Tú decides!

stable 2

Con la segunda pestaña, puedes desatar tu creatividad con Stable Difussion.

Sabemos lo importante que es para los educadores y estudiantes estimular su creatividad, por esta razón he integrado el uso de WebSocket y Stable Difussion para crear imágenes donde puedes dar rienda suelta a tu imaginación.

¿Cómo funciona? Es fácil. Solo ingresa el texto que deseas en el campo de texto y, con solo un clic, nuestra aplicación generará imágenes impresionantes utilizando Stable Difussion.

Observa cómo tus palabras cobran vida en forma de arte visual. Desde hermosos fondos para presentaciones hasta diseños gráficos para publicaciones en redes sociales, la aplicación te ofrece un sinfín de posibilidades creativas. ¡Es una experiencia verdaderamente mágica!

Conclusión

Entiendo lo importante que es tener acceso a herramientas educativas de calidad sin costo alguno, por eso la aplicación es gratis, sin publicidad, sin almacenar datos, nada de nada.

La aplicación fue desarrollada con fines educativos y de aprendizaje, y mi intención es mantenerla gratuita.

Yo siempre he pensado que el conocimiento y el aprendizaje deben ser accesibles para todos, y esta aplicación es mi pequeña forma de contribuir a esta causa.

Así que, ¿por qué no te sumerges en el emocionante mundo de nuestra aplicación educativa? Descarga videos y audios, explora tus intereses y crea imágenes únicas. ¡Todo esto mientras aprendes y te diviertes!

Recuerda, esta aplicación es una idea que se puede mejorar, lo que significa que siempre estoy abierto a sugerencias y contribuciones. Si tienes alguna idea para mejorarla o agregar nuevas características, ¡compártela con nosotros! Tu opinión es valiosa y nos ayudará a hacer crecer esta herramienta educativa.

Gracias por ser parte de esta emocionante aventura educativa. ¡Disfruta y diviértete mientras aprendes y exploras con nuestra aplicación gratuita y de código abierto!

vue3 cover

Introducción a Vue 3

Que es Vue 3

Esta nueva versión de Vue y que actualmente se encuentra en su versión 3.2.33, fue lanzada en septiembre de 2020 y ofrece una serie de mejoras y características nuevas en comparación con versiones anteriores.

Una de las principales ventajas de Vue 3 es que es más ligero y rápido que versiones anteriores, lo que permite que las aplicaciones desarrolladas con Vue 3 carguen más rápido y se ejecuten de manera más eficiente en dispositivos móviles y de escritorio.

Otra de las mejoras importantes en Vue 3 es la introducción de la arquitectura Composition API, que permite a los desarrolladores escribir componentes de Vue de manera más clara y organizada. Esto hace que sea más fácil mantener y ampliar las aplicaciones desarrolladas con Vue 3 a medida que crecen en tamaño y complejidad.

Además, Vue 3 también incluye un nuevo sistema de ruteo y un administrador de paquetes más robusto, lo que facilita el desarrollo de aplicaciones de una sola página (SPA) y la creación de aplicaciones de escala más grande.

Si bien Vue 3 es una actualización importante en comparación con versiones anteriores, es compatible con versiones anteriores, lo que significa que los desarrolladores pueden actualizar sus aplicaciones existentes a Vue 3 sin tener que reescribir su código desde cero.

Mejoras en la composition API

Tanto si tenemos un proyecto iniciado como si lo vamos hacer desde cero usando Vue 2 (options API), en ambos casos podremos usar la composition API instalando la siguiente dependencia:

NPM: npm i @vue/composition-api

YARN: yarn add @vue/composition-api

Para comprender las mejoras que ofrece la composition API vamos a ver las novedades, los cambios importantes y algunas recomendaciones.

Novedades

  • Composition API: Con esta nueva feature podemos crear un componente utilizando funciones importadas (Vue 3) en lugar de opciones (options API en Vue 2).
  • SFC Composition API: Se añade <script setup> para usar la composition API dentro de los  componentes de archivo único (SFC).
  • Teleport: Es un nuevo componente que nos permite mover (teletransportar) parte del template de un componente a otra parte del DOM que este fuera del propio componente.
  • Fragments: Con esta nueva características podemos tener componentes con múltiples nodos en la raiz.
    • VUE 2:
      <template>
        <div> <!-- SOLO UN NODO EN LA RAIZ -->
          <header>...</header>
          <main>...</main>
          <footer>...</footer>
        </div>
      </template>
      
      VUE 3:
      <template>
        <!-- MULTIPLES NODOS EN LA RAIZ -->
        <header>...</header>
        <main v-bind="$attrs">...</main>
        <footer>...</footer>
      </template>
  • Variables CSS controladas por el estado de SFC: Ahora podemos usar v-bind dentro de la etiqueta <style>.
    • <script setup>
      const theme = {
        color: 'red'
      }
      </script>
      
      <template>
        <p>hello</p>
      </template>
      
      <style scoped>
      p {
        color: v-bind('theme.color');
      }
      </style>

Cambios importantes (Rompe de Vue 2 a Vue 3).

Habíamos comentado al comienzo del artículo que la versión 3 es aditiva sobre la versión 2, pero existen ciertos cambios que generan algunas incompatibilidades respecto a la versión 2 y que puedes consultar desde aquí.

Recomendaciones para crear proyectos en Vue 3.

Con esta nueva versión de Vue se han añadido nuevas mejoras y por lo tanto las recomendaciones por defecto que deberíamos usar en Vue 3 también han cambiado.

  • Nuevas versiones de Router, Devtools y testing
  • Creación de proyectos: Vue CLI por Vite
  • Gestión de estado: Vuex por Pinia
  • Soporte para el IDE: Vetur por Volar
  • Soporte Typescript en el CLI: vue-tsc
  • SSG: VuePress por VitePress
  • JSX: @vue/babel-preset-jsx por @vue/babel-plugin-jsx

Empezando con el código

A continuación añadiremos una aplicación muy pequeña hecha en Vue 2 y Vue 3 de dos formas diferentes.

Vue 2

<template>
  <div class="app">
    <h1>{{ message }}</h1>
    <button @click="incrementCounter">Incrementar contador</button>
    <p>Contador: {{ counter }}</p>
    <p>Contador doble: {{ doubleCounter }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: "Hola mundo!",
      counter: 0,
    };
  },
  computed: {
    doubleCounter() {
      return this.counter * 2;
    },
  },
  methods: {
    incrementCounter() {
      this.counter++;
    },
  },
  mounted() {
    console.log("La aplicación ha sido montada");
  },
};
</script>

Vue 3

<template>
  <div class="app">
    <h1>{{ message }}</h1>
    <button @click="incrementCounter">Incrementar contador</button>
    <p>Contador: {{ counter }}</p>
    <p>Contador doble: {{ doubleCounter }}</p>
  </div>
</template>

<script>
import { ref, computed, onMounted } from "vue";

export default {
  setup() {
    const message = ref("Hola mundo!");
    const counter = ref(0);
    const incrementCounter = () => {
      counter.value++;
    };
    const doubleCounter = computed(() => {
      return counter.value * 2;
    });
    onMounted(() => {
      console.log("La aplicación ha sido montada");
    });
    return {
      message,
      counter,
      incrementCounter,
      doubleCounter,
    };
  },
};
</script>

Vue 3 con la última feature añadiendo setup en el script

<template>
  <div class="app">
    <h1>{{ message }}</h1>
    <button @click="incrementCounter">Incrementar contador</button>
    <p>Contador: {{ counter }}</p>
    <p>Contador doble: {{ doubleCounter }}</p>
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from "vue";
const message = ref("Hola mundo!");
const counter = ref(0);
const incrementCounter = () => {
  counter.value++;
};
const doubleCounter = computed(() => {
  return counter.value * 2;
});
onMounted(() => {
  console.log("La aplicación ha sido montada");
});
</script>

Conclusión

Como hemos podido ver en los ejemplos anteriores, el código en Vue 2 al trabajar con las options API tenemos muy bien definidas, pero esa misma ventaja acaba siendo su punto debil, ya que podemos acabar con decenas y decenas de líneas de código, mezclando todo.

Esta claro que aplicando buenas practicas en el momento de codificar podemos solucionar algunos problemas, pero seguiremos limitados a lo que ofrece Vue 2.

Por el contrario con Vue 3, usando ambas formas tenemos mayor libertad para hacer las cosas,  ya que es mucho mas cercano a Javascript y por ende a la forma de como se desarrolla tanto en React como en Svelte.

Pero no todo iban a ser buenas noticias en Vue 3, ya que esa misma libertad se acaba convirtiendo en su punto débil, ya que podemos caer en la trampa del «aquí todo vale y todo funciona», y acabar teniendo un Frankenstein de aplicación.