<?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: Leonardo Castillo Lacruz</title>
    <description>The latest articles on DEV Community by Leonardo Castillo Lacruz (@ljcl79).</description>
    <link>https://dev.to/ljcl79</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%2F1276436%2F14059da3-41a6-441a-b16a-d12e4983fbaa.jpeg</url>
      <title>DEV Community: Leonardo Castillo Lacruz</title>
      <link>https://dev.to/ljcl79</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ljcl79"/>
    <language>en</language>
    <item>
      <title>Preparando el Ambiente de Desarrollo para Flutter</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Wed, 04 Dec 2024 15:00:10 +0000</pubDate>
      <link>https://dev.to/ljcl79/preparando-el-ambiente-de-desarrollo-para-flutter-934</link>
      <guid>https://dev.to/ljcl79/preparando-el-ambiente-de-desarrollo-para-flutter-934</guid>
      <description>&lt;p&gt;Comencemos por definir a Flutter, el cual es un framework de desarrollo que permite crear aplicaciones multiplataforma con un único código base, para móvil, web y hasta para desktop.&lt;br&gt;
Para comenzar a trabajar con Flutter debemos ejecutar algunos pasos que nos permitiran compilar y generar aplicaciones. Sigamos con cada paso.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Instalación de los Componentes Necesarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Visual Studio Code
&lt;/h3&gt;

&lt;p&gt;Es el editor de código recomendado por su flexibilidad y compatibilidad con Flutter. Para instalarlo:&lt;br&gt;
Descargue el instalador desde el sitio oficial.&lt;br&gt;
Siga los pasos del asistente, aceptando los términos de la licencia.&lt;br&gt;
Confirme que el editor funcione correctamente tras la instalación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git
&lt;/h3&gt;

&lt;p&gt;Es fundamental para la gestión de versiones y la integración con Flutter:&lt;br&gt;
Descargue el instalador desde el sitio oficial de Git.&lt;br&gt;
Mantenga las opciones predeterminadas durante la instalación.&lt;br&gt;
Asegúrese de que Git funcione correctamente en la línea de comandos.&lt;/p&gt;

&lt;h3&gt;
  
  
  SDK de Flutter
&lt;/h3&gt;

&lt;p&gt;El SDK es esencial para trabajar con Flutter, pero en lugar de instalarlo manualmente, se puede configurar automáticamente al crear un proyecto:&lt;br&gt;
Tras instalar la extensión oficial de Flutter en Visual Studio Code, seleccione Crear nuevo proyecto Flutter desde el menú de comandos.&lt;br&gt;
El sistema detectará si el SDK de Flutter no está instalado y ofrecerá instalarlo automáticamente.&lt;br&gt;
Siga las indicaciones en pantalla para completar el proceso de instalación y configuración.&lt;br&gt;
Verifique la instalación ejecutando flutter doctor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Android Studio
&lt;/h3&gt;

&lt;p&gt;Es necesario para emular dispositivos Android:&lt;br&gt;
Descargue e instale Android Studio.&lt;br&gt;
Configure el SDK de Android y cree un emulador.&lt;br&gt;
Asegúrese de que el emulador funcione correctamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Herramientas de Línea de Comando (Command-Line Tools)
&lt;/h3&gt;

&lt;p&gt;Estas herramientas son necesarias para que Flutter pueda compilar y ejecutar aplicaciones Android:&lt;br&gt;
En Android Studio, abra el menú SDK Manager y seleccione la pestaña SDK Tools.&lt;br&gt;
Active la casilla Android SDK Command-Line Tools.&lt;br&gt;
Instale las herramientas y confirme su configuración.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aceptación de Licencias de Android Studio
&lt;/h3&gt;

&lt;p&gt;Es un paso crucial para evitar errores de compatibilidad:&lt;br&gt;
Ejecute el comando flutter doctor --android-licenses en la terminal.&lt;br&gt;
Acepte cada licencia siguiendo las indicaciones.&lt;br&gt;
Verifique que no haya errores en la salida del comando.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Problemas Comunes y Soluciones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Configuración del PATH
&lt;/h3&gt;

&lt;p&gt;Es común que Flutter no se reconozca debido a una configuración incorrecta del PATH:&lt;br&gt;
Solución: Revise las variables de entorno y asegúrese de incluir la ruta completa al binario de Flutter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Errores en la instalación de Android Studio
&lt;/h3&gt;

&lt;p&gt;Muchos usuarios encuentran problemas con la instalación de componentes SDK o emuladores:&lt;br&gt;
Solución: Actualice Android Studio a la última versión y descargue los SDK faltantes desde la configuración.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compatibilidad de extensiones en Visual Studio Code
&lt;/h3&gt;

&lt;p&gt;Algunas extensiones necesarias para Flutter pueden no instalarse automáticamente:&lt;br&gt;
Solución: Instale manualmente las extensiones de Flutter y Dart desde el marketplace de Visual Studio Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problemas con permisos en Git
&lt;/h3&gt;

&lt;p&gt;En sistemas operativos restringidos, Git puede enfrentar problemas de permisos:&lt;br&gt;
Solución: Ejecute Git como administrador o revise las configuraciones de acceso.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Creación de un Proyecto "Hola Mundo"
&lt;/h2&gt;

&lt;p&gt;Una vez configurado el ambiente, pruebe la instalación creando un proyecto de Flutter:&lt;br&gt;
Abra Visual Studio Code y seleccione "Crear proyecto Flutter".&lt;br&gt;
Ejecute el comando flutter run para ver la aplicación en el emulador.&lt;br&gt;
Verifique que el proyecto funcione correctamente sin errores.&lt;/p&gt;




&lt;p&gt;Configurar un ambiente de desarrollo para Flutter puede ser sencillo si se siguen los pasos correctos. Sin embargo, los problemas técnicos son comunes y pueden retrasar el proceso. Con esta guía y las soluciones a los problemas más frecuentes, estarás listo para desarrollar aplicaciones multiplataforma de manera eficiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=9DsKJyEygos&amp;amp;t=1s" rel="noopener noreferrer"&gt;Paso a paso para instalar el ambiente de Flutter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>ambiente</category>
      <category>android</category>
    </item>
    <item>
      <title>Conociendo a useContext y useReduce</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Sat, 30 Nov 2024 14:11:06 +0000</pubDate>
      <link>https://dev.to/ljcl79/conociendo-a-usecontext-y-usereduce-6l1</link>
      <guid>https://dev.to/ljcl79/conociendo-a-usecontext-y-usereduce-6l1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2F70uplwbxi8903z4tzqp6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F70uplwbxi8903z4tzqp6.jpeg" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React ofrece varias herramientas para manejar el estado de las aplicaciones, algunas más simples, otras más complejas, con lo cual tenemos esa gama de opciones que de acuerdo al tamaño de nuestra aplicación, haremos su selección. Entre ellas destacan useContext y useReducer. Estas dos funciones trabajan excepcionalmente bien juntas, especialmente en escenarios donde se necesita compartir estados entre múltiples componentes y manejar estados complejos.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. ¿Qué es useContext?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definición
&lt;/h3&gt;

&lt;p&gt;useContext es un hook que permite acceder al valor de un contexto creado con React.createContext desde cualquier componente del árbol de React. Esto elimina la necesidad de pasar datos a través de múltiples niveles de componentes (prop drilling).&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo usar useContext?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Cuando varios componentes necesitan acceder al mismo dato.&lt;/li&gt;
&lt;li&gt;  Para evitar pasar props manualmente entre componentes que no los usan directamente.&lt;/li&gt;
&lt;li&gt;  En aplicaciones con un estado global compartido, como una lista de favoritos o un carrito de compras.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cómo funciona
&lt;/h3&gt;

&lt;p&gt;Son 3 pasos, primero, se crea un contexto:&lt;br&gt;
&lt;code&gt;import { createContext } from "react";&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MyContext = createContext();  
export default MyContext;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, un componente proveedor envuelve al árbol de componentes y suministra el valor del contexto, es decir, definimos que vamos a compartir en el estado global:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import MyContext from "./MyContext";

export const MyProvider = ({ children }) =&amp;gt; {  
  const sharedState = { user: "Pedro Pérez" };

  return (  
    &amp;lt;MyContext.Provider value={sharedState}&amp;gt;  
      {children}  
    &amp;lt;/MyContext.Provider&amp;gt;  
  );  
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, se utiliza useContext para consumir cualquier propiedad o función que hemos compartido anteriormente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useContext } from "react";  
import MyContext from "./MyContext";

const MyComponent = () =&amp;gt; {  
  const context = useContext(MyContext);  
  return &amp;lt;div&amp;gt;{`Hello, ${context.user}`}&amp;lt;/div&amp;gt;;  
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. ¿Qué es useReducer?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definición
&lt;/h3&gt;

&lt;p&gt;useReducer es un hook que se utiliza para manejar estados más complejos en React. Es una alternativa a useState y sigue un enfoque similar al de Redux, utilizando un patrón de reducer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo usar useReducer?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Cuando el estado tiene múltiples subvalores o está estructurado en objetos complejos.&lt;/li&gt;
&lt;li&gt;  Cuando las transiciones de estado están determinadas por tipos de acciones.&lt;/li&gt;
&lt;li&gt;  En aplicaciones con lógica de actualización de estado centralizada y predecible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cómo funciona
&lt;/h3&gt;

&lt;p&gt;Un reducer es una función pura que toma el estado actual y una acción, y devuelve un nuevo estado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const reducer = (state, action) =&amp;gt; {  
  switch (action.type) {  
    case "INCREMENT":  
      return { count: state.count + 1 };  
    case "DECREMENT":  
      return { count: state.count - 1 };  
    default:  
      throw new Error("Unknown action");  
  }  
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;useReducer se utiliza junto con el reducer y un estado inicial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useReducer } from "react";

const initialState = { count: 0 };

const Counter = () =&amp;gt; {  
  const [state, dispatch] = useReducer(reducer, initialState);

  return (  
    &amp;lt;div&amp;gt;  
      &amp;lt;p&amp;gt;Count: {state.count}&amp;lt;/p&amp;gt;  
      &amp;lt;button onClick={() =&amp;gt; dispatch({ type: "INCREMENT" })}&amp;gt;+&amp;lt;/button&amp;gt;  
      &amp;lt;button onClick={() =&amp;gt; dispatch({ type: "DECREMENT" })}&amp;gt;-&amp;lt;/button&amp;gt;  
    &amp;lt;/div&amp;gt;  
  );  
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interesante destacar, que la anatomia del useReducer, tiene cierta similitud con useState, salvo que hacemos uso del reducer al iniciar el hook.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Combinando useContext y useReducer
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Por qué combinarlos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  useContext facilita compartir el estado global entre componentes.&lt;/li&gt;
&lt;li&gt;  useReducer organiza y simplifica la lógica de actualización del estado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Juntos, crean una arquitectura sólida para manejar estados compartidos en aplicaciones React.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementación
&lt;/h3&gt;

&lt;p&gt;Primero, definimos el contexto y el reducer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createContext, useReducer } from "react";

const AppContext = createContext();

const initialState = { favorites: [] };

const reducer = (state, action) =&amp;gt; {  
  switch (action.type) {  
    case "ADD_FAVORITE":  
      return { ...state, favorites: [...state.favorites, action.payload] };  
    case "REMOVE_FAVORITE":  
      return {  
        ...state,  
        favorites: state.favorites.filter((id) =&amp;gt; id !== action.payload),  
      };  
    default:  
      return state;  
  }  
};

export const AppProvider = ({ children }) =&amp;gt; {  
  const [state, dispatch] = useReducer(reducer, initialState);

  return (  
    &amp;lt;AppContext.Provider value={{ state, dispatch }}&amp;gt;  
      {children}  
    &amp;lt;/AppContext.Provider&amp;gt;  
  );  
};

export default AppContext;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, consumimos el contexto en los componentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useContext } from "react";  
import AppContext from "./AppContext";

const FavoriteButton = ({ productId }) =&amp;gt; {  
  const { state, dispatch } = useContext(AppContext);

  const isFavorite = state.favorites.includes(productId);

  return (  
    &amp;lt;button  
      onClick={() =&amp;gt;  
        dispatch({  
          type: isFavorite ? "REMOVE_FAVORITE" : "ADD_FAVORITE",  
          payload: productId,  
        })  
      }  
    &amp;gt;  
      {isFavorite ? "❤️" : "🤍"}  
    &amp;lt;/button&amp;gt;  
  );  
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Ejemplo práctico: Gestión de favoritos en ecommerce
&lt;/h2&gt;

&lt;p&gt;Imaginemos una aplicación donde el usuario puede navegar por productos y marcar sus favoritos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estado Global
&lt;/h3&gt;

&lt;p&gt;Definimos el estado inicial y las acciones posibles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const initialState = { products: [], favorites: [] };

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El reducer maneja las actualizaciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const reducer = (state, action) =&amp;gt; {  
  switch (action.type) {  
    case "SET_PRODUCTS":  
      return { ...state, products: action.payload };  
    case "ADD_FAVORITE":  
      return { ...state, favorites: [...state.favorites, action.payload] };  
    case "REMOVE_FAVORITE":  
      return {  
        ...state,  
        favorites: state.favorites.filter((id) =&amp;gt; id !== action.payload),  
      };  
    default:  
      throw new Error("Unknown action type");  
  }  
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Componentes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Vista principal: Consume productos desde una API.&lt;/li&gt;
&lt;li&gt; Botón de favoritos: Permite al usuario marcar o desmarcar productos como favoritos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo del componente Home:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect } from "react";  
import { useContext } from "react";  
import AppContext from "./AppContext";

const Home = () =&amp;gt; {  
  const { state, dispatch } = useContext(AppContext);

  useEffect(() =&amp;gt; {  
    fetch("https://fakestoreapi.com/products")  
      .then((res) =&amp;gt; res.json())  
      .then((data) =&amp;gt; dispatch({ type: "SET_PRODUCTS", payload: data }));  
  }, [dispatch]);

  return (  
    &amp;lt;div&amp;gt;  
      {state.products.map((product) =&amp;gt; (  
        &amp;lt;div key={product.id}&amp;gt;  
          &amp;lt;h2&amp;gt;{product.title}&amp;lt;/h2&amp;gt;  
          &amp;lt;FavoriteButton productId={product.id} /&amp;gt;  
        &amp;lt;/div&amp;gt;  
      ))}  
    &amp;lt;/div&amp;gt;  
  );  
};

export default Home;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Componente FavoriteButton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";  
import { useContext } from "react";  
import AppContext from "./AppContext";

const FavoriteButton = ({ productId }) =&amp;gt; {  
  const { state, dispatch } = useContext(AppContext);  
  const isFavorite = state.favorites.includes(productId);

  return (  
    &amp;lt;button  
      onClick={() =&amp;gt;  
        dispatch({  
          type: isFavorite ? "REMOVE_FAVORITE" : "ADD_FAVORITE",  
          payload: productId,  
        })  
      }  
    &amp;gt;  
      {isFavorite ? "❤️" : "🤍"}  
    &amp;lt;/button&amp;gt;  
  );  
};

export default FavoriteButton;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El ejemplo anterior lo puedes ver desarrollado en el siguiente video:&lt;/p&gt;

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

&lt;p&gt;Combinar useContext y useReducer permite manejar estados globales de manera eficiente y organizada. Este enfoque es ideal para aplicaciones complejas, ya que proporciona un flujo claro de datos y acciones, reduciendo el riesgo de errores y mejorando la mantenibilidad del código.&lt;/p&gt;

&lt;p&gt;Si te gustó el contenido compartelo con tu red.&lt;/p&gt;

&lt;p&gt;Para ver otros contenidos te invito a acceder a mi canal en YouTube:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/leonardocastillo79" rel="noopener noreferrer"&gt;https://www.youtube.com/leonardocastillo79&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Conociendo a React Query</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Sun, 18 Feb 2024 20:15:42 +0000</pubDate>
      <link>https://dev.to/ljcl79/conociendo-a-react-query-2pp8</link>
      <guid>https://dev.to/ljcl79/conociendo-a-react-query-2pp8</guid>
      <description>&lt;p&gt;En este material mostramos como es el uso de React Query, un paquete maravilloso que permite simplificar de forma transparente y fácil el consumo de APIs REST en aplicaciones React.&lt;/p&gt;

&lt;p&gt;Dejamos de lado useState y useEffect, con React Query la operación de consumir APIs se reduce a definirun QueryClient, un QueryClientProvider y un hook llamado useQuery.&lt;/p&gt;

&lt;p&gt;En este video de forma práctica hacemos la demostración.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/OJMat-Buon4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactquery</category>
      <category>api</category>
      <category>query</category>
    </item>
    <item>
      <title>Manipulando el DOM con Javascript</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Mon, 12 Feb 2024 18:52:43 +0000</pubDate>
      <link>https://dev.to/ljcl79/manipulando-el-dom-con-javascript-55cp</link>
      <guid>https://dev.to/ljcl79/manipulando-el-dom-con-javascript-55cp</guid>
      <description>&lt;p&gt;Javascript como lenguaje para la web es fundamental, porque genera la dinámica necesaria para que la usabilidad de la aplicación sea lo mejor posible.&lt;/p&gt;

&lt;p&gt;Crear, actualizar o borrar elementos del HTML es una tarea común, cotidiana y fundamental que todo desarrollador web debe manejar.&lt;/p&gt;

&lt;p&gt;En este contenido realizamos un landing page simple, todo construido con Javascript Vanilla a partir del clic en un botón.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/5BEcb-Kkk-c"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>dom</category>
      <category>javascript</category>
      <category>desarrolloweb</category>
      <category>manipulacion</category>
    </item>
    <item>
      <title>Consumo de APIs con hooks de ReactJS</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Sat, 10 Feb 2024 13:04:51 +0000</pubDate>
      <link>https://dev.to/ljcl79/consumo-de-apis-con-hooks-de-reactjs-1jl2</link>
      <guid>https://dev.to/ljcl79/consumo-de-apis-con-hooks-de-reactjs-1jl2</guid>
      <description>&lt;p&gt;Haciendo uso de los hooks useState y useEffect, funciones maravillosas que nos facilitan la vida en tareas complejas usando ReactJS, realizamos el consumo de una API REST. &lt;/p&gt;

&lt;p&gt;Partiendo desde 0 realizamos la aplicación usando ViteJS + TailwindCSS + DaisyUI.&lt;/p&gt;

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

</description>
      <category>react</category>
      <category>api</category>
      <category>tailwindcss</category>
      <category>vite</category>
    </item>
    <item>
      <title>React + Typescript.</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Fri, 09 Feb 2024 15:14:30 +0000</pubDate>
      <link>https://dev.to/ljcl79/react-typescript-21c7</link>
      <guid>https://dev.to/ljcl79/react-typescript-21c7</guid>
      <description>&lt;p&gt;React + Typescript. Combinación perfecta para trabajar. En este material mostramos la creación de un app desde 0, implementando su código usando Vite + Tailwind + DaisyUI, todo esto usando Typescript para aprovechar sus ventajas.&lt;/p&gt;

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

</description>
      <category>react</category>
      <category>typescript</category>
      <category>vite</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Conociendo a BunJS</title>
      <dc:creator>Leonardo Castillo Lacruz</dc:creator>
      <pubDate>Thu, 08 Feb 2024 22:39:44 +0000</pubDate>
      <link>https://dev.to/ljcl79/conociendo-a-bunjs-15oj</link>
      <guid>https://dev.to/ljcl79/conociendo-a-bunjs-15oj</guid>
      <description>&lt;p&gt;¿Qué es bun y cómo usarlo para ejecutar javascript del lado del backend?&lt;/p&gt;

&lt;p&gt;Bun es un entorno de ejecución de javascript para backend, basado en el motor JavaScriptCore de Apple. Es un nuevo competidor de nuestro querido NodeJS.&lt;/p&gt;

&lt;p&gt;En este video, te voy a explicar qué es bun, cómo instalarlo, cómo escribir código javascript para el servidor. Usar bun con ReactJS es posible? Acá lo hacemos.&lt;/p&gt;

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

</description>
      <category>javascript</category>
      <category>backend</category>
      <category>tutorial</category>
      <category>bunjs</category>
    </item>
  </channel>
</rss>
