<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Constanza Areal - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Constanza Areal - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 19:16:25 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/cotyar/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo llevar a cabo una gran revisión de sprint -consejos accionables para desarrolladores y equipos ]]>
                </title>
                <description>
                    <![CDATA[ En mis veinte años de experiencia como ingeniero de software, he estado en muchas revisiones de sprint. Las he visto hacer bien y he visto que a veces se las usa para que las personas hagan un alto en una sala de reuniones por un par de horas cada sprint. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/how-to-run-a-great-sprint-review-actionable-tips-for-developers-and-teams-como-llevar-a-cabo-un/</link>
                <guid isPermaLink="false">682280711822d2047c6e5812</guid>
                
                    <category>
                        <![CDATA[ Agile Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Fri, 20 Jun 2025 15:12:58 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2025/06/fcc7407a-3b08-493f-a704-661eed12f369.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-run-a-great-sprint-review-actionable-insights/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Run a Great Sprint Review – Actionable Tips for Developers and Teams</a>
      </p><p>En mis veinte años de experiencia como ingeniero de software, he estado en muchas revisiones de sprint. Las he visto hacer bien y he visto que a veces se las usa para que las personas hagan un alto en una sala de reuniones por un par de horas cada sprint.</p><p>Realizada de manera correcta, la revisión de sprint puede ser la clave para mantener al día tu proyecto. Por el contrario, las revisiones de sprint hechas de forma incorrecta son peor que el tiempo malgastado en ellas, ya que disminuyen la confianza de las personas en la metodología Scrum.<br><br>En este artículo, te voy a guiar a través de algunas ideas y el paso a paso para hacer que tu revisión de sprint tenga más valor.</p><h2 id="-qu-es-una-revisi-n-de-sprint"><strong><strong>¿Qué</strong> es una revisión de sprint?</strong></h2><p>Una <strong>revisión de sprint</strong> es una sesión corta que se realiza al final de cada sprint, usualmente cada un par de semanas.</p><p>Esta sesión permite al equipo mostrar el trabajo realizado a través de demos, obtener feedback y decidir qué es lo que sigue.</p><p>Al hacerse de forma correcta, la revisión de sprint muestra progreso y crea confianza a las personas que tienen un interés en el producto y el proyecto.</p><p>Por supuesto, es posible decirles a los interesados que el proyecto está al día, pero si pueden verlo con sus propios ojos durante la revisión de sprint, estarán más contentos.</p><h2 id="-qui-n-deber-a-estar-en-la-revisi-n"><strong>¿Quién debería estar en la revisión?</strong></h2><p>En resumen, cualquier persona que así lo quiera. Cualquier persona que sea parte interesada en cualquier capacidad puede y debería estar presente en estas reuniones.</p><p>El propio equipo scrum se encuentra en el centro de la reunión, pero también pueden estar los de Ventas, los subgerentes generales, otros equipos scrums y project managers.</p><p>Si alguien tiene algo para aportar al proyecto o cree que puede beneficiarse por aprender algo del proyecto, deberían asistir,</p><h2 id="-qu-hacer-antes-de-la-revisi-n-de-sprint"><strong>¿Qué hacer antes de la revisión de sprint?</strong></h2><p>Para que la reunión se lleve a cabo sin ningún problema, es necesario asegurarse que quienes vayan a presentar estén preparados y con una demo lista para mostrar.</p><p>Por experiencia propia, las demos en vivo no funcionan. Algunas sí, pero en su mayoría no.</p><p>Puedes decirles a quienes tengan una demo que al menos se graben mostrando el flujo de trabajo antes de la reunión. De esta manera, si insisten en hacer una demo en vivo, van a tener un video grabado a modo de resguardo si todo sale mal.</p><p>También deberías tener una lista con las personas que van a presentar y en qué orden. Agrúpalas por similitud del tema. No importa quién presenta y cuándo lo hace mientras que las presentaciones estén agrupadas por tema. </p><p>Por ejemplo, si tienes seis ingenieros - dos trabajando en una página de inicio de sesión, dos más trabajando en servicio back-end nuevo y otros dos trabajando en la performance de la base de datos- asegúrate que en tu lista de presentadores estas tres areas distintivas estén juntas.</p><p>Si hay dos demos que son similares, puedes explicar el contexto una sola vez y después correr las demos una seguida de la otra. Se eficiente, ya que tienes a muchas personas en esta reunión y todos saben que <a href="https://calculatorlord.com/meeting-cost-calculator/">las reuniones son costosas</a>.</p><h2 id="durante-la-revisi-n"><strong>Durante la revisión</strong></h2><p>Los ingenieros de software que hayan trabajado en alguna parte del proyecto harán la presentación a los otros miembros del equipo scrum (Producto, QA y otros) y también a los interesados que estén en la reunión.</p><p>Después de la presentación de cada ingeniero, cualquiera de los presentes en la reunión puede hacer preguntas o comentarios sobre el trabajo realizado o la presentación.</p><p>Estas preguntas pueden ir desde detalles sobre el proyecto para quienes no conozcan, lo conozcan en su totalidad o pueden ser preguntas sobre porque se decidió seguir un curso de acción en particular.</p><p>Desde Producto o miembros de la audiencia que estén más enfocados en la parte del negocio pueden dar feedback sobre si lo que fue presentando coincide con la intención de negocio de lo que se pidió entregar.</p><p>Una vez que todas las preguntas y comentarios son respondidos, el próximo ingeniero presentará su trabajo.</p><p>En una revisión de sprint, si bien todos pueden hablar, generalmente solo lo hacen los ingenieros que presentan. Entonces, el ingeniero presenta sobre el trabajo que realizaron y luego Producto, QA, Ba y los demás pueden dar feedback y hacer preguntas específicas sobre lo que el ingeniero presentó.</p><h2 id="revisi-n-de-ejemplo"><strong>Revisión de ejemplo</strong></h2><p>Demos una mirada a una revisión de ejemplo y a lo que podría contener.</p><p>Vamos a usar el ejemplo de los seis ingenieros de más arriba: dos trabajando en la página de inicio de sesión, dos trabajando en un servicio back-end y dos trabajando en la performance de la base de datos. En ese caso, la lista de presentadores se ve así:</p><p>Presentaciones</p><ol><li>Larry: <em>El usuario supera la cantidad máxima de intentos de inicio de sesión y la cuenta se bloquea después del quinto intento incorrecto. El usuario tiene que pedir un nuevo password antes de poder iniciar sesión de nuevo.</em></li><li>David: <em>El usuario hace clic en el enlace de contraseña olvidada y se emvia un enlace a su correo electrónico. El usuario hace clic en el enlace y puede restablecer su contraseña.</em></li><li>Premilla: <em> Un servicio de reporte consume el evento "Usuario excede la cantidad máxima de intentos de inicio de sesión" y lo publica en el tablero de reportes.</em></li><li>Akshat: <em>Un servicio de reporte consume el evento "Usuario hace clic en el enlace de restablecimiento de contraseña" y lo publica en el tablero de reportes.</em></li><li>Olga: <em>Un usuario administrador puede ver el tablero durante un mes y cargar el reporte dentro de los 2 segundos.</em></li><li>Trevor: <em> Un usuario administrar puede ver los eventos de varios usuarios en un mismo tablero y cargar el reporte dentro de los 2 segundos.</em></li></ol><p>Como puedes ver, las dos presentaciones sobre la página de inicio de sesión de usuario se hicieron primero, después las dos presentaciones sobre los servicios de reportes, y por último las dos presentaciones sobre la velocidad de respuesta de la base de datos. Esto requiere un menor cambio de contexto para los miembros de la audiencia y también que es posible dar el contexto en la primera de las dos presentaciones agrupadas (esto es, las presentaciones 1, 3 y 5).</p><p>Después de la presentación 1 (realizada por Larry), Producto puede preguntarle por qué eligió cinco intentos como el número máximo de intentos antes de que se bloquee la cuenta. Larry puede tener o no una respuesta. Producto puede pedirle un seguimiento sobre este tema e investigar cuál es el estándar de la industria y aplicar la misma lógica que Larry o dejarlo así.</p><p>Después de las seis presentaciones, puede haber preguntas, comentarios o pedidos de cambio de cualquier persona de la audiencia. Usualmente, esto va a precipitar una conversación entre los presentes sobre cuál puede ser la mejor manera de realizar estos cambios.</p><p>Por ejemplo, de nuevo en el ejemplo de Larry, algunos podrían sugerir que ni se debería usar un nombre de usuario y contraseña, sino una dirección de correo electrónico y un <a href="https://www.pingidentity.com/en/resources/blog/post/what-is-magic-link-login.html">enlace mágico</a>. Esto es lo bueno de la revisión. Tenemos a un montón de gente inteligente en la habitación contribuyendo con su propia experiencia y sabiduría. </p><h2 id="consejos-accionables"><strong>Consejos accionables</strong></h2><p>Here are some tips for what to show, how to show it, and what actually matters during the meeting itself. &nbsp;Aquí tienes un par de consejos sobre qué mostrar, cómo mostrarlo, y lo que realmente importa durante la reunión en sí.</p><h3 id="1-mostrar-entregables-reales"><strong><strong>1. </strong>Mostrar entregables reales</strong></h3><p>Primero, siempre muestra software en funcionamiento o demos que funcionen en vez de diapositivas estáticas. Por ejemplo, si estuviste trabajando en una nueva función de inicio de sesión, haz una demostración en vivo. Esto hace que la revisión sea más auténtica y muestre avances tangibles.</p><h3 id="2-alienta-el-feedback"><strong><strong>2. </strong>Alienta el feedback</strong></h3><p>Segundo, invita a la audiencia a hacer preguntas. Recuérdale a las partes interesadas que sus ideas pueden ayudar a desarrollar nuevas funcionalidades. Anota sus sugerencias y confírmales si alguno de los cambios irán de inmediato a tu lista de pendientes.</p><h3 id="3-s-claro-y-mantente-enfocado"><strong><strong>3. </strong>Sé claro y mantente enfocado</strong></h3><p>Tercero, mantén un formato simple. Por ejemplo, empieza con un pantallazo general del objetivo del sprint, ve a las demostraciones y termina con un debate corto sobre los próximos pasos.</p><p>Evita entrar en profundidad sobre los detalles técnicos. Si el tema requiere más tiempo, organiza una reunión de seguimiento.</p><h3 id="4-coordina-los-pr-ximos-pasos-"><strong><strong>4. </strong>Coordina los próximos pasos.</strong></h3><p>Seguido de esto, actualiza tu lista de pendientes con base en lo aprendido en la reunión. Si una funcionalidad requiere un ajuste extra, agrega la tarea de manera inmediata.</p><p>Esto ayuda a mantener informado a todo el equipo sobre el plan para el siguiente sprint. </p><h3 id="5-mantenla-corta-y-termina-en-horario"><strong><strong>5. </strong>Mantenla corta y termina en horario</strong></h3><p>En la reunión deberías revisar el trabajo del equipo scrum de un solo sprint (dos o tres semanas)</p><p>Si la reunión se hace demasiado larga, esto puede significar que tu equipo scrum es demasiado grande (en ese caso, deberías pensar en dividir el equipo en <a href="https://namegenerators.online/scrum-team-name-generator/">grupos más pequeños)</a> o que no estás siendo eficiente con tus demostraciones.</p><p>El tiempo y la atención de las personas son costosos y escasos. Mantén las reuniones a un <a href="https://en.wikipedia.org/wiki/Basic_rest%E2%80%93activity_cycle">ciclo ultradriano</a>. Personalmente, trato de limitar todas las reuniones a un máximo de 90 minutos.</p><p>Por último, establece un límite firme para la reunión así los participantes se sienten confiados al dar su feedback sin alargar el debate.</p><p> Terminar a horario significa respetar el calendario de los demás y mantener al equipo descansado y preparado para el próximo sprint.</p><h2 id="en-conclusi-n"><strong>En conclusión</strong></h2><p>Una revisión de sprint les da a las partes interesadas una mirada real sobre el trabajo realizado, las mantiene alineadas sobre los próximos pasos, y permite obtener el feedback que necesitas para hacer crecer tu producto de forma efectiva.</p><p> Si te enfocas en mostrar avances reales, tener un dialogo abierto y mantienes las cosas de forma concisa, verás una mejoría en como tu equipo entrega valor.</p><p><em>En su tiempo libre, Ben escribe su blog de tecnología "</em><a href="https://justanothertechlead.com/"><em>Just Another Tech Lead</em></a><em>" y administra un sitio donde crea calculadoras gratuitas llamado "</em><a href="https://calculatorlord.com/"><em>CalculatorLord.com</em></a><em>".</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de React: Cómo trabajar con múltiples casillas de verificación ]]>
                </title>
                <description>
                    <![CDATA[ Trabajar con múltiples casillas en React es completamente diferente a cómo se usan las casillas de verificación en HTML. Por lo que en este artículo, vamos a ver cómo hacerlo en React. Aprenderás a:  * Cómo usar una casilla de verificación como Input Controlado en React,  * Cómo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/a-continuacion-vamos-a-establecer-que-el-valor-totalprice-al-estado-total-utilizando-settotal-totalprice/</link>
                <guid isPermaLink="false">6743c47f6ab3ae04514079c9</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Fri, 24 Jan 2025 16:19:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2025/01/checkbox_selection.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Trabajar con múltiples casillas en React es completamente diferente a cómo se usan las casillas de verificación en HTML.</p><p>Por lo que en este artículo, vamos a ver cómo hacerlo en React.</p><p>Aprenderás a:</p><ul><li>Cómo usar una casilla de verificación como Input Controlado en React,</li><li>Cómo usar los métodos de arreglo "map" y "reduce" para cálculos complejos,</li><li>Cómo crear un arreglo de un largo específico y con valores pre cargados,</li></ul><p> y mucho más.</p><p>Este artículo es parte de mi curso <em><a href="https://master-redux.yogeshchavan.dev/">Mastering Redux</a>.</em> Aquí tienes un <a href="https://www.youtube.com/watch?v=izSw74H08Bc">adelanto de la aplicación</a> que vamos a crear en el curso.</p><p>Así que empecemos.</p><h2 id="c-mo-trabajar-con-una-sola-casilla-de-verificaci-n"><strong>Cómo trabajar con una sola casilla de verificación</strong></h2><p>Antes de aprender a trabajar con varias casillas, empezaremos programando solo uno.</p><p>En este artículo, para crear componentes voy a estar usando la sintaxis de React Hooks. Si no estás familiarizado con esta sintaxis, puedes darle un vistazo a mi artículo [en inglés] <a href="https://levelup.gitconnected.com/an-introduction-to-react-hooks-50281fd961fe?source=friends_link&amp;sk=89baff89ec8bc637e7c13b7554904e54"><em>Introduction to React Hooks</em></a><em>.</em></p><p>Mira el siguiente código:</p><pre><code class="language-js">&lt;div className="App"&gt;
  Select your pizza topping:
  &lt;div className="topping"&gt;
    &lt;input type="checkbox" id="topping" name="topping" value="Paneer" /&gt;Paneer
  &lt;/div&gt;
&lt;/div&gt;
</code></pre><p> Aquí tienes la <a href="https://codesandbox.io/s/young-snow-lzplh?file=/src/App.js">demo</a>.</p><p>En el código de arriba, declaramos una única casilla.</p><p>Como se muestra abajo, podemos seleccionar y de seleccionarlo de manera muy fácil: </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/05/check_uncheck-1.gif" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Pero para mostrar en pantalla si está seleccionado o no, tenemos que convertirlo a un Input Controlado.</p><p>En React, los Inputs Controlados se manejan mediante el estado, por lo que solamente podemos cambiar el &nbsp;valor del input cambiando su estado.</p><p>Mira el siguiente código:</p><pre><code class="language-js">export default function App() {
  const [isChecked, setIsChecked] = useState(false);

  const handleOnChange = () =&gt; {
    setIsChecked(!isChecked);
  };

  return (
    &lt;div className="App"&gt;
      Select your pizza topping:
      &lt;div className="topping"&gt;
        &lt;input
          type="checkbox"
          id="topping"
          name="topping"
          value="Paneer"
          checked={isChecked}
          onChange={handleOnChange}
        /&gt;
        Paneer
      &lt;/div&gt;
      &lt;div className="result"&gt;
        Above checkbox is {isChecked ? "checked" : "un-checked"}.
      &lt;/div&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>y aquí tienes la <a href="https://codesandbox.io/s/dazzling-oskar-qcil8?file=/src/App.js">demo</a></p><p>En el código de arriba, con el hook <code>useState</code> &nbsp;declaramos el estado <code>isChecked</code> del componente, con el valor inicial <code>false</code>: </p><pre><code class="language-js">const [isChecked, setIsChecked] = useState(false);
</code></pre><p>Después, a la casilla de verificación le damos dos <em>props</em> adicionales, <code>checked</code> y <code>onChange</code>, de la siguiente manera:</p><pre><code class="language-js">&lt;input
  ...
  checked={isChecked}
  onChange={handleOnChange}
/&gt;
</code></pre><p>Cuando hagamos clic en la casilla de verificación, la función <code>handleOnChange</code> será la encargada de cambiar el valor del estado <code>isChecked</code></p><pre><code class="language-js">const handleOnChange = () =&gt; {
  setIsChecked(!isChecked);
};
</code></pre><p>Entonces, si la casilla está seleccionado, el valor de <code>isChecked</code> es <code>false</code>. Pero si no lo está, el valor es<code>true</code> al usar <code>!isChecked</code>.</p><p>De esta manea la casilla se convierte en un input controlado, cuyo valor es manejado mediante el estado del componente.</p><p>Hay que tener en cuenta que en React siempre se recomienda usar inputs controlados para los campos de inputs, aun si el código luce complicado. Esto garantiza que el cambio del input solo ocurra dentro de la función <code>onChange</code>.</p><p>El estado de un input no podrá ser cambiado de otra forma y así siempre tendrás el valor correcto y actual del estado del input.</p><p>Solo en raras ocasiones se puede usar React ref para poder manejar el input de manera no controlada.</p><h2 id="c-mo-manipular-m-ltiples-casillas-de-verificaci-n"><strong>Cómo manipular múltiples casillas de verificación</strong></h2><p>Veamos ahora como trabajar con varias casillas.</p><p>Mira esta <a href="https://codesandbox.io/s/mystifying-tu-xlpgb?file=/src/App.js">demo</a></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/05/multiple_checkboxes-2.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p> Aquí estamos mostrando una lista de aderezos y sus precios. Dependiendo cuantos aderezos sean seleccionados, necesitamos mostrar el monto total.</p><p>Antes, cuando teníamos un solo casilla de verificación, solo teníamos el estado <code>isChecked</code> para cambiar el estado de la casilla de verificación.</p><p>Pero ahora, como tenemos varias casillas de verificación, no es práctico hacer varios llamados <code>useState</code> para cada uno.</p><p>Entonces, declaremos un arreglo dentro del estado e indiquemos el estado de cada una de las casillas de verificación.</p><p>Para crear un arreglo cuyo largo sea igual número de casillas de verificación, Podemos usar el método de arreglo <code>fill</code> de este método:</p><pre><code class="language-js">const [checkedState, setCheckedState] = useState(
    new Array(toppings.length).fill(false)
);
</code></pre><p>Aquí hemos declarado un estado con un valor inicial como un arreglo relleno con el valor <code>false</code>.</p><p>Entonces, si témenos cinco coberturas, el arreglo de estado <code>checkedState</code> tendrá cinco valores <code>false</code>:</p><pre><code class="language-js">[false, false, false, false, false]
</code></pre><p>Y una vez que marquemos / desmarquemos la casilla, cambiaremos el <code>false</code> correspondiente a <code>true</code> y viceversa.</p><p>Aquí está la demo <a href="https://www.freecodecamp.org/espanol/news/ghost/#/editor/post/6743c47f6ab3ae04514079c9:~:text=https%3A/codesandbox.io/s/wild%2Dsilence%2Db8k2j%3Ffile%3D/src/App.js">final</a>.</p><p>Y el código completo de <code>App.js</code> luce de esta manera:</p><pre><code class="language-js">import { useState } from "react";
import { toppings } from "./utils/toppings";
import "./styles.css";

const getFormattedPrice = (price) =&gt; `$${price.toFixed(2)}`;

export default function App() {
  const [checkedState, setCheckedState] = useState(
    new Array(toppings.length).fill(false)
  );

  const [total, setTotal] = useState(0);

  const handleOnChange = (position) =&gt; {
    const updatedCheckedState = checkedState.map((item, index) =&gt;
      index === position ? !item : item
    );

    setCheckedState(updatedCheckedState);

    const totalPrice = updatedCheckedState.reduce(
      (sum, currentState, index) =&gt; {
        if (currentState === true) {
          return sum + toppings[index].price;
        }
        return sum;
      },
      0
    );

    setTotal(totalPrice);
  };

  return (
    &lt;div className="App"&gt;
      &lt;h3&gt;Select Toppings&lt;/h3&gt;
      &lt;ul className="toppings-list"&gt;
        {toppings.map(({ name, price }, index) =&gt; {
          return (
            &lt;li key={index}&gt;
              &lt;div className="toppings-list-item"&gt;
                &lt;div className="left-section"&gt;
                  &lt;input
                    type="checkbox"
                    id={`custom-checkbox-${index}`}
                    name={name}
                    value={name}
                    checked={checkedState[index]}
                    onChange={() =&gt; handleOnChange(index)}
                  /&gt;
                  &lt;label htmlFor={`custom-checkbox-${index}`}&gt;{name}&lt;/label&gt;
                &lt;/div&gt;
                &lt;div className="right-section"&gt;{getFormattedPrice(price)}&lt;/div&gt;
              &lt;/div&gt;
            &lt;/li&gt;
          );
        })}
        &lt;li&gt;
          &lt;div className="toppings-list-item"&gt;
            &lt;div className="left-section"&gt;Total:&lt;/div&gt;
            &lt;div className="right-section"&gt;{getFormattedPrice(total)}&lt;/div&gt;
          &lt;/div&gt;
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>Veamos que estamos haciendo aquí.</p><p>Como se muestra aquí abajo, hemos declarado la casilla de verificación de entrada como se muestra a continuación:</p><pre><code class="language-js">&lt;input
  type="checkbox"
  id={`custom-checkbox-${index}`}
  name={name}
  value={name}
  checked={checkedState[index]}
  onChange={() =&gt; handleOnChange(index)}
/&gt;
</code></pre><p>Aquí, agregamos el atributo <code>checked</code> con el valor del estado <code>checkedState</code>, <code>true</code> o <code>false</code>, según corresponda.</p><p>También añadimos un manejador <code>onChange</code> y le pasamos el <code>index</code> de la casilla que está marcada/desmarcada al método &nbsp;<code>handleOnChange</code>.</p><p>El método manejador <code>handleOnChange</code> debe verse así:</p><pre><code class="language-js">const handleOnChange = (position) =&gt; {
  const updatedCheckedState = checkedState.map((item, index) =&gt;
    index === position ? !item : item
  );

  setCheckedState(updatedCheckedState);

  const totalPrice = updatedCheckedState.reduce(
    (sum, currentState, index) =&gt; {
      if (currentState === true) {
        return sum + toppings[index].price;
      }
      return sum;
    },
    0
  );

  setTotal(totalPrice);
};
</code></pre><p>Aquí, primero recorremos el array <code>checkedState</code> utilizando el método arreglo <code>map</code>. Si el valor del parámetro <code>position</code> pasado coincide con el <code>index</code> actual, entonces invertimos su valor. Entonces, si el valor es <code>true</code> se convertirá en <code>false</code> usando <code>!item</code> y si el valor es <code>false</code>, entonces se convertirá en <code>true</code></p><p>Si el <code>index</code> no coincide con el parámetro <code>position</code> proporcionado, entonces no estamos invirtiendo su valor, sino que simplemente devolvemos el valor tal cual.</p><pre><code class="language-js">const updatedCheckedState = checkedState.map((item, index) =&gt;
  index === position ? !item : item
);

// the above code is the same as the below code

const updatedCheckedState = checkedState.map((item, index) =&gt; {
  if (index === position) {
    return !item;
  } else {
    return item;
  }
});
</code></pre><p>He utilizado el operador ternario <code>?:</code> porque hace el código más corto, pero puedes utilizar cualquier método de arreglo.</p><p>Si no estás familiarizado como &nbsp;funcionan los métodos <code>map</code> o<code>reduce</code>, puedes echarle un vistazo a este artículo que <a href="https://www.freecodecamp.org/news/complete-introduction-to-the-most-useful-javascript-array-methods/">escribí</a>.</p><p>Luego, establecemos el arreglo <code>checkedState</code> en el &nbsp;arreglo <code>updatedCheckedState</code>. Esto es importante porque si no actualizamos el estado <code>checkedState</code> dentro del manejador &nbsp;<code>handleOnChange</code>, entonces no podrás marcar/desmarcar la casilla de verificación.</p><p>Esto es porque estamos usando el valor de <code>checkedState</code> de la casilla para determinar si este está o no marcada (ya que es una entrada controlada como se muestra abajo):</p><pre><code class="language-js">&lt;input
  type="checkbox"
  ...
  checked={checkedState[index]}
  onChange={() =&gt; handleOnChange(index)}
/&gt;
</code></pre><p>Ten en cuenta que creamos una variable <code>updatedCheckedState</code> separada, y a su vez, esta se la pasamos a la función <code>updatedCheckedState</code> y no al arreglo original <code>checkedState</code>.</p><p>Esto es porque, por default, la función <code>setCheckedState</code> &nbsp;usada para actualizar el estado es asincrónica.</p><p>Llamar a la función <code>setCheckedState</code> no garantiza que obtendrás el valor actualizado del arreglo <code>checkedState</code> en la siguiente línea.</p><p>Por lo que creamos una variable separada y usamos esa en el método <code>reduce</code>.<br></p><p>Entonces, para calcular el precio total, usamos el método de arreglo &nbsp;<code>reduce</code>:</p><pre><code class="language-js">const totalPrice = updatedCheckedState.reduce(
  (sum, currentState, index) =&gt; {
    if (currentState === true) {
      return sum + toppings[index].price;
    }
    return sum;
  },
  0
);
</code></pre><p>El método de arreglo &nbsp;<code>reduce</code> recibe cuatro parámetros, de los cuales usaremos solamente tres: <code>sum</code>, <code>currentState</code> e <code>index</code>. Puedes usar nombres distintos, ya que son solo parámetros.</p><p>También estamos pasando el valor <code>0</code> como valor inicial, que también se lo conoce como el valor <code>accumulator</code> del parámetro <code>sum</code>.</p><p>Luego, dentro de la función reduce, chequeamos si el valor actual del array <code>checkedState</code> es <code>true</code> o no. </p><p>Si lo es <code>true</code>, esto significa que la casilla está marcada, por lo que añadiremos el valor correspondiente de <code>price</code> correspondiente utilizando <code>sum + toppings[index].price</code></p><p>Si el valor del arreglo <code>checkedState</code> es <code>false</code>, entonces no estamos añadiendo su precio, sino que solo estamos devolviendo el valor anterior calculado de <code>sum</code>.</p><p>Luego, vamos a establecer que el valor <code>totalPrice</code> al estado <code>total</code> utilizando <code>setTotal(totalPrice)</code></p><p>De esta forma, podemos calcular correctamente el precio total de los aderezos seleccionados como pueden ver debajo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/05/toppings-1.gif" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Aquí tiene el <a href="https://b8k2j.csb.app/">link</a> de la demo de arriba, así pueden probarla ustedes mismos.</p><h3 id="-gracias-por-leer-"><strong>¡Gracias por leer!</strong></h3><p>A muchos desarrolladores se les dificulta entender como funciona Redux, pero todo desarrollador especializado en React debe saber como trabajar con Redux, ya que muchos proyectos dentro de la industria usa Redux para gestionar proyectos de gran escala.</p><p>Para hacerlo fácil para ti, he creado el curso <em><a href="https://master-redux.yogeshchavan.dev/">Mastering Redux</a></em>.</p><p>En este curso, aprenderás Redux desde cero y también crearás un aplicación de pedido de comida, desde el inicio y con Redux.</p><p>Dale clic a la imagen de abajo para unirte al curso y obtener un descuento especial por tiempo limitado, además de también obtener mi libro más popular "<em>Mastering Modern JavaScript</em>", gratis.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/c3e4265df4396d639a7938a83bffd570130483b1/banner.jpg" class="kg-image" alt="banner" width="600" height="400" loading="lazy"></figure><p><strong>Si quieres mantenerte actualizado con contenidos sobre JavaScript, React y Node.js, <a href="https://www.linkedin.com/in/yogesh-chavan97/">sigueme en LinkedIn</a>.</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Certificaciones Gratuitas para Desarrolladores ]]>
                </title>
                <description>
                    <![CDATA[ [Nota de la traductora: Todos los links a los cursos mencionados en este artículo están en su mayoría en inglés] ¿Sabías que organizaciones como freeCodeCamp, Google y Harvard ofrecen cursos en línea para que puedas aprender desarrollo de software? ¿Y que muchos de estos cursos ofrecen certificaciones gratuitas e insignias? ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/1000-certificaciones-gratis-para-desarrolladores/</link>
                <guid isPermaLink="false">671aab02408801043e04b9b3</guid>
                
                    <category>
                        <![CDATA[ Curso ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Desarrollo de Software ]]>
                    </category>
                
                    <category>
                        <![CDATA[ freeCodecamp curriculum ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Mon, 25 Nov 2024 17:23:59 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/11/free-developer-certificates-banner.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>[<strong>Nota de la traductora</strong>: Todos los links a los cursos mencionados en este artículo están en su mayoría en inglés]</p><p>¿Sabías que organizaciones como freeCodeCamp, Google y Harvard ofrecen cursos en línea para que puedas aprender desarrollo de software? ¿Y que muchos de estos cursos ofrecen certificaciones gratuitas e insignias?</p><p>Para ayudarte a elegir cuál es el mejor para ti, he creado una lista completa.</p><p>Como ávidos estudiantes de cursos en línea, mis compañeros de <a href="https://www.classcentral.com/">Class Central</a> y yo hemos realizado, a través de los años, centenares de cursos en línea, muchos de ellos con certificados gratuitos.</p><p>En 2023, los certificados gratuitos ya no son tan frecuentes. Pero si sabes dónde buscar, todavía existe en línea una gran cantidad de certificaciones gratuitas para aprender desarrollo de software.</p><p><em>Algunas de las certificaciones gratuitas logradas por el equipo de Class Central</em></p><p>Como seguramente sabes, freeCodeCamp ofrece <a href="https://www.classcentral.com/provider/freecodecamp?certificate=true">certificaciones gratuitas</a>, pero también lo hacen gigantes tecnológicos e instituciones como Google, Microsoft y Harvard.</p><p>En este artículo, reunimos todas las certificaciones gratuitas e insignias existentes en Internet. En total, las plataformas detalladas abajo ofrecen más de mil de cursos gratuitos con certificado para aprender desarrollo de <em>software</em>.</p><p>Creé <a href="https://www.classcentral.com/">Class Central</a> en el 2011, cuando universidades como Stanford empezaron a dictar sus cursos en línea de forma gratuita. Desde entonces, la base de datos de Class Central ha crecido hasta contener más de <a href="https://www.classcentral.com/subjects">100K cursos en línea</a>.</p><p>Al haber escrito sobre educación en línea por más de una década, recuerdo cuando plataformas como Coursera y edX ofrecían certificaciones gratuitas. Luego, las certificaciones gratuitas <a href="https://www.classcentral.com/report/death-of-free-certificates/">casi que desaparecieron de forma abrupta</a>.</p><p>Esto nos inspiró a escribir <a href="https://www.classcentral.com/report/free-certificates/">un artículo recopilando todas las certificaciones gratuitas e insignias existentes</a>. Para nuestra sorpresa, descubrimos que todavía existían miles de certificaciones gratuitas en línea disponibles. Hasta la fecha, ese artículo tiene alrededor de 2M de visitas.</p><p>Con este objetivo, este artículo busca destacar a aquellas empresas que todavía sigue apoyando la educación libre ofreciendo cursos sobre desarrollo de software, &nbsp;con certificados gratuitos. Estas son:</p><ul><li><strong>Plataformas de aprendizaje</strong> — como por ejemplo freeCodeCamp, LinkedIn Learning y FutureLearn.</li><li><strong>Universidades líderes</strong> — como por ejemplo, Harvard, la Universidad de Helsinki y el HPI [Instituto Hasso Plattner].</li><li><strong>Gigantes tecnológicos</strong> — como por ejemplo Google, Microsoft e IBM.</li></ul><p>Sin más, aquí tienes las plataformas en donde puedes encontrar más de mil certificaciones gratuitas para desarrolladores</p><h2 id="certificaciones-gratuitas-de-freecodecamp"><strong>Certificaciones gratuitas de freeCodeCamp</strong></h2><p>Empecemos por el punto de partida más obvio: <a href="https://www.classcentral.com/provider/freecodecamp">freeCodeCamp</a>, el sitio web en el que estás ahora, donde puedes aprender a programar de forma gratuita.</p><p>La plataforma ofrece miles de horas de contenido didáctico, dividido en certificaciones en temas como desarrollo web o ciencia de datos.</p><p>Estas son las certificaciones actualmente ofrecidas:</p><ul><li><a href="https://www.classcentral.com/course/freecodecamp-responsive-web-design-34059">Responsive Web Design</a> ★★★★★(77)</li><li><a href="https://www.classcentral.com/course/freecodecamp-javascript-algorithms-and-data-struc-34060">JavaScript Algorithms and Data Structures</a> ★★★★★(31)</li><li><a href="https://www.classcentral.com/course/freecodecamp-front-end-libraries-34061">Front End Development Libraries</a> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/freecodecamp-data-analysis-with-python-34066">Data Analysis with Python</a> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/freecodecamp-quality-assurance-34064">Quality Assurance</a> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/freecodecamp-machine-learning-with-python-34068">Machine Learning with Python</a> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/freecodecamp-scientific-computing-with-python-34065">Scientific Computing with Python</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/freecodecamp-data-visualization-34062">Data Visualization</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/freecodecamp-back-end-development-and-apis-34063">Back End Development and APIs</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/freecodecamp-relational-database-91574">Relational Database (Beta)</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/freecodecamp-information-security-34067">Information Security</a> ★★★★☆(6)</li></ul><h2 id="certificaciones-gratuitas-de-google"><strong>Certificaciones gratuitas de Google</strong></h2><p><a href="https://www.classcentral.com/institution/google">Google</a> ha lanzado varias iniciativas para enseñarle a las personas habilidades como programación, marketing digital y análisis de datos. En nuestro <a href="https://www.classcentral.com/report/free-google-certifications/">artículo</a> puedes encontrar la lista completa. Algunos de los más de 600 cursos que ofrece Google son:</p><ul><li><a href="https://www.classcentral.com/course/google-analytics-for-beginners-98262">Google Analytics for Beginners</a> ★★★★★(38)</li><li><a href="https://www.classcentral.com/course/google-get-started-with-google-maps-platform-web-98567">Get started with Google Maps Platform - web</a> ★★★★★(4)</li><li><a href="https://www.classcentral.com/course/google-ads-search-certification-98564">Google Ads Search Certification</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/google-analytics-for-power-users-98264">Google Analytics for Power Users</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/qwiklabs-23-66122">Google Cloud Essentials</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/qwiklabs-41-66212">Application Development - Python</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/skillshop-youtube-music-certification-86203">YouTube Music Certification</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/skillshop-shopping-ads-certification-86245">Shopping ads Certification</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/qwiklabs-103-66190">Creating with Google Maps</a> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/qwiklabs-82-66200">Intro to ML: Language Processing</a> ★★★★☆(1)</li></ul><h2 id="cursos-gratuitos-y-certificados-de-harvard"><strong>Cursos gratuitos y certificados de Harvard</strong></h2><p><a href="https://www.classcentral.com/university/harvard">Harvard</a> ofrece cursos académicos en línea que exploran las distintas facetas de las Ciencias de la Computación, como los fundamentos de la programación o la inteligencia artificial. Puedes encontrar todos los detalles en nuestro <a href="https://www.classcentral.com/report/harvard-cs50-guide/">artículo</a>.</p><p>Aquí tienes una lista de las certificaciones gratuitas ofrecidas por Harvard actualmente:</p><ul><li><a href="https://www.classcentral.com/course/edx-cs50-s-introduction-to-computer-science-442">Introduction to Computer Science</a> ★★★★★(140)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-computer-science-for-business-professionals-10143">Computer Science for Business Professionals</a> ★★★★★(14)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-introduction-to-artificial-intelligence-with-python-18122">Introduction to Artificial Intelligence with Python</a> ★★★★★(11)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-web-programming-with-python-and-javascript-11506">Web Programming with Python and JavaScript</a> ★★★★★(22)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-computer-science-for-lawyers-16857">Computer Science for Lawyers</a> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-understanding-technology-10142">Understanding Technology</a> ★★★★★(10)</li><li><a href="https://www.classcentral.com/course/cs50s-introduction-to-programming-with-python-58275">Introduction to Programming with Python</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/cs50s-introduction-to-programming-with-scratch-39309">Introduction to Programming with Scratch</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/edx-cs50-s-introduction-to-game-development-11504">Introduction to Game Development</a> ★★★★☆(3)</li></ul><h2 id="medallas-gratuitas-de-microsoft"><strong>Medallas gratuitas de Microsoft</strong></h2><p><a href="https://www.classcentral.com/institution/microsoft">Microsoft</a> ofrece miles de <a href="https://learn.microsoft.com/en-us/training/browse/?resource_type=module">módulos</a> y cientos de <a href="https://learn.microsoft.com/en-us/training/browse/?resource_type=learning%20path">caminos de aprendizaje</a> para explorar los productos de la empresa, como Office 365, Visual Studio y Azure. Una vez que terminas un curso, obtienes una medalla en tu perfil de alumno.</p><p>Estos son algunos de los cursos ofrecidos por Microsoft:</p><ul><li><a href="https://www.classcentral.com/course/microsoft-learn-create-use-analytics-reports-power-bi-62184">Create and use analytics reports with Power BI</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/microsoft-learn-az-104-manage-virtual-networks-62194">AZ-104: Configure and manage virtual networks for Azure administrators</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/microsoft-learn-implement-windows-server-hybrid-c-62510">Implement a Windows Server hybrid cloud infrastructure</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/microsoft-learn-explore-microsoft-dynamics-365-marketing-62239">Microsoft Dynamics 365 Fundamentals (CRM): Explore Dynamics 365 Marketing</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/microsoft-learn-create-no-code-predictive-models-azure-machine-learning-62187">Microsoft Azure AI Fundamentals: Explore visual tools for machine learning</a> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/microsoft-learn-getting-started-with-microsoft-powershell-116853">Getting Started with Microsoft PowerShell</a></li><li><a href="https://www.classcentral.com/course/microsoft-learn-classify-space-rocks-artificial-i-62668">Classify space rocks by using Python and artificial intelligence</a></li><li><a href="https://www.classcentral.com/course/microsoft-learn-az-900-describe-cloud-concepts-62165">Microsoft Azure Fundamentals: Describe cloud concepts</a></li><li><a href="https://www.classcentral.com/course/microsoft-learn-get-started-with-artificial-intelligence-on-azure-62174">Microsoft Azure AI Fundamentals: Get started with AI</a></li></ul><h2 id="cursos-de-linkedin-learning-con-certificaci-n-gratuita"><strong>Cursos de LinkedIn Learning con certificación gratuita</strong></h2><p><a href="https://www.classcentral.com/provider/linkedin-learning">LinkedIn Learning</a>, la plataforma de aprendizaje en línea dentro de la red social de profesionales LinkedIn, ofrece miles de cursos en línea y caminos de aprendizaje que incluyen certificación gratuita. También puedes ver la lista completa de estos cursos en <a href="https://www.classcentral.com/report/linkedin-learning-free-learning-paths/">nuestro artículo</a>.</p><p>Aquí tienes un selección de cursos con certificación gratuita de LinkedIn Learning:</p><ul><li><a href="https://www.classcentral.com/course/linkedin-learning-communication-foundations-29764">Communication Foundations</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-prepare-for-the-comptia-a-plus--63517">Prepare for the CompTIA A+ Certification (220-1001 and 220-1002)</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-entrepreneurship-foundations-29992">Entrepreneurship Foundations</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-prepare-for-the-comptia-network-63521">Prepare for the CompTIA Network+ (N10-007) Certification</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-agile-requirements-foundations-39612">Agile Requirements Foundations</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-finding-a-job-during-challenging-economic-times-101075">Finding a Job during Challenging Economic Times</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-administrative-professional-tips-29364">Administrative Professional Tips</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-professional-soft-skills-learning-pathway-101219">Professional Soft Skills Learning Pathway</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-video-interview-tips-31560">Video Interview Tips</a></li><li><a href="https://www.classcentral.com/course/linkedin-learning-recovering-from-a-layoff-60933">Recovering from a Layoff</a></li></ul><h2 id="certificaciones-gratuitas-de-la-universidad-de-helsinki-"><strong>Certificaciones gratuitas de la Universidad de Helsinki.</strong></h2><p>La <a href="https://www.classcentral.com/university/helsinki">Universidad de Helsinki</a> ofrece cursos académicos en línea a través de su plataforma de cursos independiente, MOOC.fi. En esta plataforma están incluidos lo siguiente cursos que otorgan un certificado gratuito al completarlos:</p><ul><li><a href="https://www.classcentral.com/course/independent-elements-of-ai-12469">Elements of AI</a> ★★★★★(715)</li><li><a href="https://www.classcentral.com/course/fullstackopen-deep-dive-into-modern-web-development-66418">Full Stack open 2022</a> ★★★★★(5)</li><li><a href="https://www.classcentral.com/course/mooc-fi-java-programming-89476">Java Programming</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/helsinki-cyber-security-base-2022-98595">Cyber Security Base 2022</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/independent-building-ai-22112">Building AI</a> ★★★★☆(13)</li><li><a href="https://www.classcentral.com/course/helsinki-devops-with-kubernetes-98594">DevOps with Kubernetes</a></li><li><a href="https://www.classcentral.com/course/helsinki-ethics-of-ai-98596">Ethics of AI</a></li><li><a href="https://www.classcentral.com/course/helsinki-devops-with-docker-98598">DevOps with Docker</a></li><li><a href="https://www.classcentral.com/course/helsinki-python-programming-mooc-2022-98599">Python Programming MOOC 2022</a></li><li><a href="https://www.classcentral.com/course/independent-functional-programming-with-clojure-118953">Functional programming with Clojure</a></li></ul><h2 id="medallas-gratuitas-de-salesforce"><strong>Medallas gratuitas de Salesforce</strong></h2><p><a href="https://www.classcentral.com/institution/salesforce">Salesforce</a>, el proveedor de software basado en la nube, ofrece miles de cursos en línea a través de su plataforma, <a href="https://www.classcentral.com/provider/trailhead">Trailhead</a>. Si bien puedes aprender habilidades relacionadas con sus productos, también puedes encontrar cursos en otros temas como blockchain o desarrollo para IOS,</p><p>Hay más de <a href="https://www.freecodecamp.org/espanol/news/ghost/#/editor/post/671aab02408801043e04b9b3:~:text=https%3A/trailhead.salesforce.com/modules">1300 módulos</a> y más de <a href="https://trailhead.salesforce.com/projects">100 ejercicios prácticos</a> gratuitos disponibles en la plataforma. Una vez que terminas un modulo, obtienes un medalla gratuita para tu perfil.</p><ul><li><a href="https://www.classcentral.com/course/force_com_dev_beginner-70991">Developer Beginner</a></li><li><a href="https://www.classcentral.com/course/force_com_dev_intermediate-70980">Developer Intermediate</a></li><li><a href="https://www.classcentral.com/course/force_com_dev_advanced-70973">Developer Advanced</a></li><li><a href="https://www.classcentral.com/course/build-lightning-web-components-70898">Build Lightning Web Components</a></li><li><a href="https://www.classcentral.com/course/aws-cloud-for-technical-professionals-70811">AWS Cloud for Technical Professionals</a></li><li><a href="https://www.classcentral.com/course/mobile_sdk_intro-70984">Develop with Mobile SDK</a></li><li><a href="https://www.classcentral.com/course/manage_the_salesforce_way-70977">Manage the Salesforce Way</a></li><li><a href="https://www.classcentral.com/course/start-ios-appdev-70910">Get Started with iOS App Development</a></li><li><a href="https://www.classcentral.com/course/discover-trailhead-sample-apps-70830">Discover Trailhead Sample Apps</a></li><li><a href="https://www.classcentral.com/course/build-your-career-with-salesforce-skills-71010">Build Your Career in the Salesforce Ecosystem</a></li></ul><h2 id="mongodb-free-certificates-certificados-gratuitos-de-mongodb"><strong><strong>MongoDB Free Certificates</strong> Certificados gratuitos de MongoDB</strong></h2><p>MongoDB, la popular base de datos NoSQL, ofrece cursos con certificaciones gratuitas a través de su plataforma de aprendizaje, Universidad MongoDB. Con estos cursos, aprenderás los fundamentos de bases de datos y cómo interactuar con ellas usando distintos lenguajes de programación.</p><p>Aquí tienes algunos de los cursos certificado[en inglés] que ofrece MongoDB:</p><ul><li><a href="https://www.classcentral.com/course/mongodb-university-mongodb-for-java-developers-599">MongoDB for Java Developers</a> ★★★★★(18)</li><li><a href="https://www.classcentral.com/course/mongodb-university-mongodb-for-javascript-developers-12630">MongoDB for Javascript Developers</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/mongodb-university-m001-mongodb-basics-8824">MongoDB Basics</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/mongodb-university-mongodb-for-net-developers-3273">MongoDB for .NET Developers</a> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/mongodb-university-basic-cluster-administration-10517">Basic Cluster Administration</a></li><li><a href="https://www.classcentral.com/course/mongodb-university-mongodb-for-python-developers-12631">MongoDB for Python Developers</a></li><li><a href="https://www.classcentral.com/course/mongodb-university-m201-mongodb-performance-8830">MongoDB Performance</a></li><li><a href="https://www.classcentral.com/course/mongodb-university-diagnostics-and-debugging-8832">Diagnostics and Debugging</a></li><li><a href="https://www.classcentral.com/course/mongodb-university-mongodb-for-sql-pros-21017">MongoDB for SQL Pros</a></li><li><a href="https://www.classcentral.com/course/mongodb-university-m320-data-modeling-13815">Data Modeling</a></li></ul><h2 id="certificados-gratuitos-de-redis"><strong>Certificados gratuitos de Redis</strong></h2><p><a href="https://www.classcentral.com/institution/redis">Redis</a> es una solución flexible de almacenamiento de datos, similar a una base de datos más liviana, que se usa bastante en desarrollo web. Redis también tiene una plataforma de aprendizaje en línea, <a href="https://www.classcentral.com/institution/redis">Universidad Redis</a>, que ofrece cursos certificados gratuitos para aprender a usar la herramienta.</p><ul><li><a href="https://www.classcentral.com/course/independent-redis-for-javascript-developers-20295">Redis for JavaScript Developers</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/independent-introduction-to-redis-data-structures-20293">Introduction to Redis Data Structures</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/independent-querying-indexing-and-full-text-search-22342">Querying, Indexing, and Full-Text Search</a> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/independent-redisearch-20297">RediSearch</a></li><li><a href="https://www.classcentral.com/course/independent-redis-for-java-developers-20294">Redis for Java Developers</a></li><li><a href="https://www.classcentral.com/course/independent-redis-for-python-developers-20296">Redis for Python Developers</a></li><li><a href="https://www.classcentral.com/course/independent-redis-streams-20298">Redis Streams</a></li><li><a href="https://www.classcentral.com/course/independent-redis-security-20299">Redis Security</a></li><li><a href="https://www.classcentral.com/course/independent-running-redis-at-scale-46063">Running Redis at Scale</a></li></ul><h2 id="certificaciones-gratuitas-de-cisco"><strong>Certificaciones gratuitas de Cisco</strong></h2><p><a href="https://www.classcentral.com/institution/cisco">Cisco</a>, el gigante tecnológico, ofrece una serie de cursos [en inglés] autogestionados y en línea a través de su plataforma Academia Networking, que incluyen un certificado gratuito al completarlos. </p><ul><li><a href="https://www.classcentral.com/course/cisco-introduction-to-cybersecurity-97415">Introduction to Cybersecurity</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/networking-academy-cpa-programming-essentials-in-c-plus-plus-97422">CPA: Programming Essentials in C++</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/cisco-packet-tracer-98721">Cisco Packet Tracer</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/networking-academy-cybersecurity-essentials-97416">Cybersecurity Essentials</a> ★★★★☆(3)</li><li><a href="https://www.classcentral.com/course/networking-academy-networking-essentials-97414">Networking Essentials</a></li><li><a href="https://www.classcentral.com/course/networking-academy-introduction-to-iot-97417">Introduction to IoT</a></li><li><a href="https://www.classcentral.com/course/networking-academy-ndg-linux-essentials-97420">NDG Linux Essentials</a></li><li><a href="https://www.classcentral.com/course/networking-academy-pcap-programming-essentials-in-python-97421">PCAP: Programming Essentials in Python</a></li><li><a href="https://www.classcentral.com/course/cisco-entrepreneurship-97423">Entrepreneurship</a></li><li><a href="https://www.classcentral.com/course/networking-academy-javascript-essentials-1-jse-97424">JavaScript Essentials 1 (JSE)</a></li></ul><h2 id="certificados-gratuitos-de-ibm"><strong>Certificados gratuitos de IBM</strong></h2><p>La plataforma de IBM, CognitiveClass.ai ofrece <a href="https://cognitiveclass.ai/courses?type%5B%5D=course&amp;sort%5B%5D=most_popular">90 cursos</a> y <a href="https://cognitiveclass.ai/group/all">10 caminos de aprendizaje</a> en ciencia de datos, inteligencia artificial, cloud computing y blockchain.</p><p>La plataforma también ofrece un entorno virtual de laboratorio para que los usuarios puedan practicar lo que aprendieron en los cursos. Para obtener una insignia o el certificado de finalización, es necesario obtener al menos un 70% en cualquiera de los cursos.</p><p>Aquí tienes una selección de sus cursos certificados gratuitos:</p><ul><li><a href="https://www.classcentral.com/course/cognitive-class-deep-learning-with-tensorflow-118531">Deep Learning with TensorFlow</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-build-swift-mobile-apps-with-watson-ai-services-118533">Build Swift Mobile Apps with Watson AI Services</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-accelerating-deep-learning-with-gpus-118534">Accelerating Deep Learning with GPUs</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-data-visualization-with-r-118536">Data Visualization with R</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-introduction-to-open-source-118537">Introduction to Open Source</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-using-r-with-databases-118539">Using R with Databases</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-machine-learning-dimensionality-reduction-118541">Machine Learning - Dimensionality Reduction</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-predictive-modeling-fundamentals-i-118542">Predictive Modeling Fundamentals</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-text-analytics-101-118546">Text Analytics 101</a></li><li><a href="https://www.classcentral.com/course/cognitive-class-mathematical-optimization-for-business-problems-118547">Mathematical Optimization for Business Problems</a></li></ul><h2 id="certificados-gratuitos-de-kaggle"><strong>Certificados gratuitos de Kaggle</strong></h2><p><a href="https://www.classcentral.com/provider/kaggle">Kaggle</a> es una comunidad para científicos de datos y para quienes aspiren a convertirse en uno.</p><p>Esta comunidad ofrece más de 50K en <em>datasets</em> públicos para que puedas crear tus propios proyectos de ciencia de datos a través de cuadernos Jupyter y participar en competencias. </p><p>Además, la plataforma también ofrece cursos [en inglés] para aprender los fundamentos de la ciencia de datos. Cada uno ofrece un certificado de finalización.</p><ul><li><a href="https://www.classcentral.com/course/python-74248">Python</a> ★★★★★(3)</li><li><a href="https://www.classcentral.com/course/intro-to-sql-74254">Intro to SQL</a> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/computer-vision-74257">Computer Vision</a> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/intro-to-machine-learning-74249">Intro to Machine Learning</a></li><li><a href="https://www.classcentral.com/course/pandas-74250">Pandas</a></li><li><a href="https://www.classcentral.com/course/data-visualization-74252">Data Visualization</a></li><li><a href="https://www.classcentral.com/course/intro-to-deep-learning-74256">Intro to Deep Learning</a></li><li><a href="https://www.classcentral.com/course/data-cleaning-74259">Data Cleaning</a></li><li><a href="https://www.classcentral.com/course/intro-to-ai-ethics-74260">Intro to AI Ethics</a></li><li><a href="https://www.classcentral.com/course/machine-learning-explainability-74262">Machine Learning Explainability</a></li></ul><h2 id="certificados-gratuitos-de-hackerrank"><strong>Certificados gratuitos de HackerRank</strong></h2><p><a href="https://www.hackerrank.com/skills-verification">HackerRank</a>, una plataforma para aprender algoritmos, estructuras de datos y prepararse para entrevistas técnicas, ofrece exámenes de certificación de habilidades en temas como resolución de problemas, Python y JavaScript.</p><p>Aquí tienes algunos de lo <a href="https://www.hackerrank.com/skills-verification">exámenes</a> que puedes hacer para obtener un certificado:</p><ul><li><a href="https://www.hackerrank.com/skills-verification/problem_solving_basic">Problem Solving (Basic)</a></li><li><a href="https://www.hackerrank.com/skills-verification/python_basic">Python (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/java_basic">Java (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/c_sharp_basic">C# (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/javascript_basic">JavaScript (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/sql_basic">SQL (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/golang_basic">Go (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/r_basic">R (Basic) Skills Certification</a></li><li><a href="https://www.hackerrank.com/skills-verification/nodejs_basic">Node (Basic) Skills Certification</a></li></ul><h2 id="certificados-gratuitos-de-datacamp"><strong>Certificados gratuitos de DataCamp</strong></h2><p><a href="https://www.freecodecamp.org/espanol/news/ghost/#/editor/post/671aab02408801043e04b9b3:~:text=https%3A/www.classcentral.com/provider/datacamp">DataCamp</a> es una popular plataforma en línea para - seguro lo adivinaste - aprender no solo sobre ciencia de datos, sino también sobre programación en general. La plataforma ofrece una serie de cursos que al completarlos otorgan una declaración del logro obtenido. Aquí tienes una selección:</p><ul><li><a href="https://www.classcentral.com/course/datacamp-oc-beginning-bayes-in-r-121384">Beginning Bayes in R</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-basic-statistics-121395">Basic Statistics</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-kaggle-python-tutorial-on-machine-lea-121401">Kaggle Python Tutorial on Machine Learning</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-sql-tutorial-for-marketers-121386">SQL Tutorial for Marketers</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-introduction-to-python-machine-learni-121397">Introduction to Python &amp; Machine Learning</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-inferential-statistics-121410">Inferential Statistics</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-plotly-tutorial-plotly-and-r-121405">Plotly Tutorial: Plotly and R</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-tidy-data-in-python-mini-course-121396">Tidy Data in Python Mini-Course</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-introduccion-a-python-121383">Introducción a Python (en español)</a></li><li><a href="https://www.classcentral.com/course/datacamp-oc-introduccion-a-r-121388">Introducción a R(en español)</a></li></ul><h2 id="certificados-gratuitos-de-great-learning"><strong>Certificados gratuitos de Great Learning</strong></h2><p><a href="https://www.classcentral.com/institution/great-learning">Great Learning</a> ofrece más de cien cursos certificados gratuitos en una gran variedad de temas como IA, ciencia de datos, programación, <em>cloud computing</em> y marketing digital. Aquí tienes una selección:</p><ul><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/azure-course">Microsoft Azure Essentials</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/data-analytics-using-excel1">Data Analytics using Excel</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/introduction-to-machine-learning2">Introduction to Machine Learning</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/introduction-to-cyber-security">Introduction to Cyber Security</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/cloud-computing-foundations">Cloud Computing Foundations</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/foundation-of-artificial-intelligence">Introduction to Deep Learning</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/introduction-to-nosql">Introduction to NoSQL</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/introduction-to-design-thinking">Introduction to Design Thinking</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/python-foundations">Python Foundations</a></li><li><a href="https://www.mygreatlearning.com/academy/learn-for-free/courses/python-fundamentals-for-beginners">Python Fundamentals for Beginners</a></li></ul><h2 id="certificados-gratuitos-de-upgrad"><strong>Certificados gratuitos de upGrad</strong></h2><p><a href="https://www.upgrad.com/">upGrad</a> es una plataforma de aprendizaje en línea que ofrece más de <a href="https://www.upgrad.com/cn/free-courses/">60 programas gratuitos</a> sobre temas como ciencia de dato, métricas de negocio y tecnología. </p><p>Una vez que completes todos los módulos del programa, obtienes un certificado de finalización.</p><p>Estos son algunos de los programas gratuitos ofrecidos por upGrad:</p><ul><li><a href="https://www.upgrad.com/be/data-science-free-course/">Programming with Python: Introduction for Beginners</a></li><li><a href="https://www.upgrad.com/be/data-science-free-course/">Introduction to Natural Language Processing</a></li><li><a href="https://www.upgrad.com/be/data-science-free-course/">Introduction to Data Analysis using Excel</a></li><li><a href="https://www.upgrad.com/be/data-science-free-course/">Introduction to Database Design with MySQL</a></li><li><a href="https://www.upgrad.com/be/data-science-free-course/">Data Science in E-commerce</a></li><li><a href="https://www.upgrad.com/cn/free-courses/">Introduction to Cryptocurrency</a></li><li><a href="https://www.upgrad.com/cn/free-courses/">React.js For Beginners</a></li><li><a href="https://www.upgrad.com/cn/free-courses/">Node.js For Beginners</a></li><li><a href="https://www.upgrad.com/cn/free-courses/">Core Java Basics</a></li><li><a href="https://www.upgrad.com/cn/free-courses/">Introduction to Blockchain Technology</a></li></ul><h2 id="certificados-gratuitos-de-futurelearn"><strong>Certificados gratuitos de FutureLearn</strong></h2><p><a href="https://www.classcentral.com/provider/futurelearn">FutureLearn</a>, la versión europea de Coursera y edX, ofrece centenares de cursos de "actualización digital" y que, entre otras cosas, implica un certificado gratuito de finalización. De nuevo, puedes encontrar más detalles en nuestro <a href="https://www.classcentral.com/report/futurelearn-free-certificates/">artículo.</a></p><p>Aquí tienes una lista de algunos de los cursos gratuitos de FutureLearn:</p><ul><li><a href="https://www.classcentral.com/course/digital-skills-for-work-and-life-9776">Digital Skills: Digital Skills for Work and Life</a> ★★★★★(2)</li><li><a href="https://www.classcentral.com/course/digital-skills-digital-marketing-9778">Digital Skills: Digital Marketing</a> ★★★★☆(7)</li><li><a href="https://www.classcentral.com/course/digital-skills-web-analytics-9779">Digital Skills: Web Analytics</a> ★★★★★(1)</li><li><a href="https://www.classcentral.com/course/digital-skills-social-media-9777">Digital Skills: Social Media</a> ★★★★☆(6)</li><li><a href="https://www.classcentral.com/course/artificial-intelligence-16995">Digital Skills: Artificial Intelligence</a> ★★★★☆(2)</li><li><a href="https://www.classcentral.com/course/digital-skills-user-experience-9780">Digital Skills: User Experience</a> ★★★★☆(1)</li><li><a href="https://www.classcentral.com/course/introduction-to-virtual-reality-20088">Introduction to Virtual, Augmented and Mixed Reality</a></li><li><a href="https://www.classcentral.com/course/digital-skills-reimagine-your-career-55982">Digital Skills: Reimagine Your Career</a></li><li><a href="https://www.classcentral.com/course/measuring-what-matters-98981">Transforming Assessment and Recognition of Complex Learning Competencies</a></li><li><a href="https://www.classcentral.com/course/digital-skills-mobile-9782">Digital Skills: Mobile</a></li></ul><h2 id="certificados-gratuitos-de-jovian"><strong>Certificados gratuitos de Jovian</strong></h2><p>Jovian es un <em>bootcamp </em>en línea sobre ciencia de datos que ofrece algunos cursos gratuitos con certificado. Aquí tienes una lista:</p><ul><li><a href="https://www.classcentral.com/course/jovian-deep-learning-with-pytorch-zero-to-gans-80399">Deep Learning with PyTorch: Zero to GANs</a></li><li><a href="https://www.classcentral.com/course/jovian-data-analysis-with-python-zero-to-pandas-80422">Data Analysis with Python: Zero to Pandas</a></li><li><a href="https://www.classcentral.com/course/jovian-machine-learning-with-python-zero-to-gbms-80423">Machine Learning with Python: Zero to GBMs</a></li><li><a href="https://www.classcentral.com/course/jovian-data-structures-and-algorithms-in-python-80424">Data Structures and Algorithms in Python</a></li><li><a href="https://jovian.com/learn/nautral-language-processing-zero-to-nlp">Natural Language Processing: Zero to NLP</a></li></ul><h2 id="certificados-gratuitos-de-gitlab"><strong>Certificados gratuitos de GitLab</strong></h2><p><a href="https://www.classcentral.com/institution/gitlab">GitLab,</a> el sitio web de control de versión más popular para alojar tus repositorios, también ofrece cursos en línea gratuitos para desarrollar tus habilidades profesionales.</p><p>Aquí tienes las certificaciones gratuitas que ofrece la plataforma:</p><ul><li><a href="https://about.gitlab.com/handbook/people-group/learning-and-development/gitlab-101/">GitLab 101 Tool Certification</a></li><li><a href="https://about.gitlab.com/handbook/people-group/learning-and-development/gitlab-201/">GitLab 201 Tool Certification</a></li><li><a href="https://www.classcentral.com/course/independent-gitlab-all-remote-certification-remote-work-foundation-98216">GitLab All-Remote Certification</a></li><li><a href="https://about.gitlab.com/handbook/people-group/learning-and-development/manager-challenge/">GitLab Manager Challenge</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo filtrar un arreglo en JavaScript – Filtrado de Arreglos y Objetos en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Cuando estamos creando un programa dinámico e interactivo, puede ser que necesitemos agregar interacción. Por ejemplo, cuando un usuario hace clic en un botón para filtrar una lista larga de elementos. También puede ser que necesitemos manipular una gran cantidad de información para poder mostrar solo aquellos elementos que coinciden ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/untitled-4/</link>
                <guid isPermaLink="false">67324db3296a1703fde9bce2</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Fri, 22 Nov 2024 07:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/11/cover-template--2-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Cuando estamos creando un programa dinámico e interactivo, puede ser que necesitemos agregar interacción. Por ejemplo, cuando un usuario hace clic en un botón para filtrar una lista larga de elementos.<br><br>También puede ser que necesitemos manipular una gran cantidad de información para poder mostrar solo aquellos elementos que coinciden con lo especificado por el usuario.<br><br>En este artículo, aprenderás a filtrar un <em>arreglo</em> en JavaScript de dos formas distintas. También aprenderás a filtrar un <em>arreglo </em>de objetos y devolver un arreglo compuesto por los elementos filtrados.</p><h2 id="c-mo-filtrar-un-arreglo-con-un-bucle-for">Cómo filtrar un arreglo con un <code>bucle for</code></h2><p>Antes del lanzamiento de ES6 en 2015, muchos desarrolladores dependían del método del <code>bucle for</code> para hacer todas las manipulaciones de <em>arreglos</em>. Pero como el código se volvía demasiado largo y difícil de entender, esto condujo a la creación de muchos métodos individuales de JavaScript como el método <code>filter()</code> (sobre el cual aprenderás más adelante).</p><p>Pero para empezar, y entender todo el panorama, vamos a aprender cómo hacerlo usando bucles.</p><p>Supongamos que tenemos un <em>arreglos </em>de objetos que contiene todos los datos de los usuarios como nombre, edad, ocupación, etc. y quieres filtrar aquellos usuarios cuya edad cumplan una determinada condición.</p><pre><code class="language-js">let users = [
    { name: 'John', age: 25, occupation: 'gardener' },
    { name: 'Lenny', age: 51, occupation: 'programmer' },
    { name: 'Andrew', age: 43, occupation: 'teacher' },
    { name: 'Peter', age: 81, occupation: 'teacher' },
    { name: 'Anna', age: 47, occupation: 'programmer' },
    { name: 'Albert', age: 76, occupation: 'programmer' },
]
</code></pre><p>También puedes querer filtrar el <em>arreglo </em>de objetos usando la edad para devolver un nuevo <em>arreglo </em>con aquellos usuarios cuya edad es mayor a 40 y cuya ocupación es igual a <code>programmer</code>:</p><pre><code class="language-js">let filteredUsers = [];
for (let i= 0; i&lt;users.length; i++) {
    if (users[i].age &gt; 40 &amp;&amp; users[i].occupation === 'programmer' ) {
        filteredUsers = [...filteredUsers, users[i]];
    }
}
console.log(filteredUsers);
</code></pre><p>Este código va a devolver un <em>arreglo </em>de tres usuarios que cumplen con esa condición:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropboxusercontent.com/s_A2A56A7C05733A13745945CF4C6950EBC758CD93042A33CBFFD44710AB9E7883_1676527392206_image.png" class="kg-image" alt="s_A2A56A7C05733A13745945CF4C6950EBC758CD93042A33CBFFD44710AB9E7883_1676527392206_image" width="1562" height="244" loading="lazy"></figure><p>Si bien esto funciona bastante bien, una mejor manera de filtrar un <em>arreglo</em> es usando el método <code>filter()</code> de ES6.</p><h2 id="c-mo-filtrar-un-arreglo-con-el-m-todo-filter-filter-">Cómo filtrar un arreglo con el método filter<strong><strong> <code>filter()</code> </strong></strong></h2><p>El método <code>filter()</code> es un método ES6 con un sintaxis más prolija para filtrar un <em>arreglo.</em> Este método devuelve un nuevo arreglo con nuevos elementos, sin modificar el <em>arreglo </em>original.</p><pre><code class="language-js">// Sintaxis
myArray.filter(callbackFn)
</code></pre><p>En la función <em>callback</em>, hay que acceder a cada elemento, el índice y hasta el <em>arreglo </em>original:</p><pre><code class="language-js">myArray.filter((element, index, array) =&gt; { /* ... */ })
</code></pre><p>Ahora hagamos el mismo ejemplo, pero filtrando al usuario por su edad y ocupación:</p><pre><code class="language-js">let filteredUsers = users.filter((user) =&gt; {
    return user.age &gt; 40 &amp;&amp; user.occupation === 'programmer';
});

console.log(filteredUsers);
</code></pre><p>Esto devolverá el mismo resultado, pero seguro notarás que tu código queda más prolijo. También es importante que sepas que puedes reescribir este código en una sola línea, sin el <code>return</code>: </p><pre><code class="language-js">let filteredUsers = users.filter(user =&gt; user.age &gt; 40 &amp;&amp; user.occupation === 'programmer');
console.log(filteredUsers);
</code></pre><p>Ambos ejemplos de código van a retornar los usuarios filtrados:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropboxusercontent.com/s_A2A56A7C05733A13745945CF4C6950EBC758CD93042A33CBFFD44710AB9E7883_1676527392206_image.png" class="kg-image" alt="s_A2A56A7C05733A13745945CF4C6950EBC758CD93042A33CBFFD44710AB9E7883_1676527392206_image" width="1562" height="244" loading="lazy"></figure><p>El método <code>filter()</code> hace que sea más fácil ejecutar más operaciones directas, sin crear demasiadas variables porque se encadena a otros métodos.</p><p>Por ejemplo, puedes filtrar el nuevo <em>arreglo</em> y devolver otro arreglo que contenga solo los nombres:</p><pre><code class="language-js">let filteredUserNames = users.filter(user =&gt; user.age &gt; 40 &amp;&amp; user.occupation === 'programmer')
    .sort((a, b) =&gt; a.age - b.age)
    .map(user =&gt; user.name);

console.log(filteredUserNames); // ['Anna', 'Lenny', 'Albert']
</code></pre><p>Para aprender más sobre cómo filtrar <em>arreglos</em> en JavaScript con el método <code>filter()</code>, puedes leer este artículo <a href="https://www.freecodecamp.org/espanol/news/tutorial-de-arrayfilter-de-javascript-como-iterar-a-traves-de-los-elementos-en-un-arreglo/">Tutorial de Array.filter() de JavaScript</a><a href="https://www.freecodecamp.org/news/javascript-array-filter-tutorial-how-to-iterate-through-elements-in-an-array/"> </a>y aprender <a href="https://www.freecodecamp.org/espanol/news/find-vs-filter-en-javascript-las-diferencias-a-traves-de-ejemplos/">aquí</a> sobre la diferencia entre los métodos <code>find()</code> y <code>filter()</code> de JavaScript.</p><h2 id="c-mo-filtrar-un-objeto-en-javascript">Cómo filtrar un objeto en JavaScript</h2><p>Los objetos de JavaScript no son iterables como los <em>arreglos</em> o las cadenas de texto. Esto significa que no pueden ser recorridos con un bucle <code>for</code>, el método <code>filter()</code> o cualquier otro método parecido a estos. Entonces ¿cómo se puede filtrar un objeto en JavaScript?</p><p>Esto se puede hacer convirtiendo el objeto en un <em>arreglo</em> mediante cualquier método de objeto como <code>Object.keys()</code>, <code>Object.values()</code> o <code>Object.entries()</code>. Luego, puedes usar el método <code>filter()</code> para filtrar a través del <em>arreglo </em>y devolver uno nuevo con los elementos filtrados.</p><p>Por ejemplo, si tenemos un objeto con datos de los usuarios como nombre, edad y ocupación. Estos métodos estáticos de objeto van a devolver las claves, valores o cada par clave-valor como un <em>arreglo</em>:</p><pre><code class="language-js">const userDetails = {
    firstName: "Jane",
    lastName: "Daniels",
    userName: "jane.daniels",
    email: "jane.daniels@example.com",
    comapny: "Example Inc.",
    address: "1234 Example Street",
    age : 25,
    hobby: "Singing"
};

let keysArray = Object.keys(userDetails);

console.log(keysArray);
</code></pre><p>Esto va a devolver un <em>arreglo</em> de las claves del objeto:</p><pre><code class="language-js">['firstName', 'lastName', 'userName', 'email', 'comapny', 'address', 'age', 'hobby']
</code></pre><p>Entonces, ahora, puedes usar el método <code>filter()</code> para recorrer el <em>arreglo </em>y devolver uno nuevo con los elementos filtrados:</p><pre><code class="language-js">let filteredKeys = keysArray.filter(key =&gt; key.length &gt; 5);

console.log(filteredKeys);
</code></pre><p>Esto va a devolver un<em> arreglo</em> con las claves que tengan un largo mayor a 5:</p><pre><code class="language-js">['firstName', 'lastName', 'userName', 'comapny', 'address', 'hobby']
</code></pre><p>Pero como seguro querrás utilizar un mejor método de filtrado, puedes, por ejemplo, filtrar el par clave-valor de nuestro objeto que incluya un nombre de un objeto mayor. Luego puedes obtener primeros las claves, filtrarlas y luego usar el método <code>reduce()</code> para reducir las claves filtradas a un objeto compuesto por estas claves y sus valores:</p><pre><code class="language-js">const userDetails = {
    firstName: "Jane",
    lastName: "Daniels",
    userName: "jane.daniels",
    email: "jane.daniels@example.com",
    comapny: "Example Inc.",
    address: "1234 Example Street",
    age : 25,
    hobby: "Singing"
};

const userNames = Object.keys(userDetails)
    .filter((key) =&gt; key.includes("Name"))
    .reduce((object, key) =&gt; {
        return Object.assign(object, {
          [key]: userDetails[key]
        });
  }, {});

console.log(userNames);
</code></pre><p>Esto devolverá un objeto con las claves filtradas y sus valores:</p><pre><code class="language-js">{
    firstName: "Jane",
    lastName: "Daniels",
    userName: "jane.daniels"
}
</code></pre><h2 id="conclusi-n">Conclusión</h2><p>En este artículo has aprendido a como filtrar un <em>arreglo </em>en JavaScript usando el bucle <code>for</code> y el método <code>filter()</code>, que tiene una mejor sintaxis para poder filtrar <em>arreglos</em> en JavaScript.</p><p>También has aprendido a filtrar un objeto en JavaScript, convirtiéndolo en un arreglo y luego usando el método <code>filter()</code>.</p><p>¡Gracias por leer y diviértete programando!</p><p>Puedes acceder a más de 188 de mis artículos visitando mi <a href="https://joelolawanle.com/contents">sitio web</a>. También puedes usar la barra de búsqueda para buscar si he escrito un artículo específico.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear un Carrusel de imágenes con React y Framer Motion ]]>
                </title>
                <description>
                    <![CDATA[ Seguramente has visto muchos carruseles en aplicaciones actuales. Conocidos por muchos nombres como sliders o rotators, estos elementos web muestran contenido de manera visualmente atractiva, ya sea deslizándolo o rotándolo. Los carruseles sirven tanto para destacar tu Interfaz de Usuario como para ahorrar espacio y así ofrecer una buena experiencia ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-un-carrusel-de-imagenes-con-react-y-framer-motion/</link>
                <guid isPermaLink="false">66f4465c7985df0457eb175c</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Framer Motion ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Fri, 18 Oct 2024 16:54:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/10/Screenshot-2023-06-26-at-10.45.34.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Seguramente has visto muchos carruseles en aplicaciones actuales. Conocidos por muchos nombres como <em>sliders</em> o <em>rotators</em>, estos elementos web muestran contenido de manera visualmente atractiva, ya sea deslizándolo o rotándolo.</p><p>Los carruseles sirven tanto para destacar tu Interfaz de Usuario como para ahorrar espacio y así ofrecer una buena experiencia de usuario.</p><p>Los carruseles se han convertido en un elemento fundamental en el diseño UI, frecuentemente usados para mostrar imágenes, testimonios de clientes, entre otros. Son indispensables al momento de crear una interfaz llamativa y dinámica.</p><p>En este artículo, nos sumergiremos en el proceso de crear un carrusel de imágenes con React y Framer Motion, guiándote por cada paso para crear un componente visual llamativo e interactivo para tu aplicación.</p><h2 id="-qu-es-framer-motion"><strong>¿Qué es Framer Motion?</strong></h2><p>Es una librería de animación de código abierto para aplicaciones React, que se utiliza para crear animaciones <em>responsive</em> y dinámicas para nuestra aplicación web. </p><p>Framer motion tiene muchas funcionalidades útiles, como por ejemplo:</p><ol><li> <em>Animation</em>: Esto permite hacer transiciones fluidas para tus componentes.</li><li><em>Gestures</em>: La librería ofrece soporte para movimientos táctiles y con el ratón. Esto permite dar cuenta de ciertos eventos.</li><li><em>Variants</em>: Framer motion permite declarar componentes de forma declarativa y así mantener tu código ordenado y reutilizable.</li></ol><p>Todas estas funcionalidades son muy útiles y pronto veremos cómo utilizarlas.</p><p>Para poder entender mejor cómo utilizar Framer Motion, se puede explorar su <a href="https://www.framer.com/motion/">documentación y recursos [en inglés]</a> aunque en este artículo nos vamos a concentrar en sus elementos fundamentales. Mientras los guío a través de los conceptos básicos de Framer Motion, mi objetivo principal es crear un carrusel atractivo e interactivo.</p><h2 id="c-mo-preparar-tu-entorno-de-desarrollo"><strong>Cómo preparar tu entorno de desarrollo</strong></h2><p>Lo primero que vamos a hacer es preparar nuestro entorno de desarrollo. Esto incluye instalar los paquetes necesarios para poder crear tu aplicación, como <a href="https://nodejs.dev/en/download/">Node.js</a> y <a href="https://www.npmjs.com/package/download">npm</a>. Si ya los tienes instalados, no es necesario que lo hagas de nuevo.</p><h3 id="crear-una-aplicaci-n-react"><strong>Crear una aplicación React</strong></h3><p>A esta altura, voy a asumir que ya tienes instalados Node y npm. Para crear una aplicación React, solo debes ir a tu terminal e ir a la ubicación donde quieras alojar tu aplicación. </p><p>Luego, ejecuta este comando:</p><pre><code class="language-bash">npx create-react-app react-image-carousel
</code></pre><p>Puedes elegir cualquier nombre para tu aplicación, pero a los fines de este artículo yo le pondré <code>react-image-carousel</code>.</p><p>Una vez que hayas creado exitosamente tu aplicación, abre la carpeta en tu editor de código. Deberías tener algunos archivos y estilos por defecto, además de verse así:</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/rC9qt5N.png" class="kg-image" alt="Image" width="1149" height="462" loading="lazy"></figure><p>Como no vamos a necesitar los siguientes archivos, puedes borrarlos: <code>app.test.js</code>, y <code>logo.svg</code>, and <code>reportWebVitals.js</code>, <code>setupTest.js</code>. También puedes borrar los estilos que vienen por defecto en <code>App.css</code>.</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/3en8Ssk.png" class="kg-image" alt="Image" width="1032" height="359" loading="lazy"></figure><p>Ahora que tu aplicación React ya está creada y preparada, el último paso para terminar de preparar tu entorno de desarrollo es instalar Framer Motion. </p><p>Para hacer esto, simplemente ve a tu terminal y asegúrate que estés en la carpeta de tu proyecto, y luego ejecuta este comando:</p><pre><code class="language-bash"> npm install framer-motion
</code></pre><p>Esto debería instalar la última versión de Framer Motion. Con esto ya estarás listo. Solo ejecuta el comando <code>npm run start</code> e inicia el entorno de desarrollo en tu navegador.</p><h2 id="c-mo-dise-ar-el-componente-image-carousel">Cómo diseñar el componente Image Carousel</h2><p>Para empezar con el diseño, vamos a crear primero el componente <code>Carousel.js</code>. Dentro del componente Carousel, vamos a importar el <em>hook</em> <code>useState</code> de React, y luego las propiedades <code>motion</code> y <code>AnimatePresence</code> desde Framer Motion</p><pre><code class="language-javascript">import { useState } from "react";
import { motion, AnimatePresence } from "framer-motion";
</code></pre><p>Luego creamos nuestra función Carousel que lleva la <em>prop</em> <code>images</code>, un <em>arreglo</em> con los enlaces de las imágenes:</p><pre><code class="language-javascript">const Carousel = ({ images }) =&gt; {};
</code></pre><p>En nuestra función Carousel, vamos a inicializar un variable de estado con <code>useState</code>. Para hacer un seguimiento del índice de imagen actual, usamos <code>setCurrentIndex</code>, que es la función para actualizar el índice.</p><p>Luego, creamos tres funciones <em>helper</em> que serán las encargadas de manejar las interacciones de usuario. Estas incluyen:</p><ul><li><code>handleNext</code>: Esto actualiza el <em><code>currentIndex</code></em> al siguiente índice y así poder cambiar la foto. Cuando llega al fin del <em>arreglo, </em>comienza de nuevo. </li><li><code>handlePrevious</code>: Hace lo mismo que <code>handleNext</code>, pero en orden inverso, lo que nos permite volver a una imagen.</li><li><code>handleDotClick</code>: Esta función lleva un índice como parámetro y actualiza <em><code>currentIndex</code></em>. Con esto podemos movernos entre las distintas imágenes solo haciendo clic en los puntos.</li></ul><pre><code class="language-javascript">const Carousel = ({ images }) =&gt; {
  const [currentIndex, setCurrentIndex] = useState(0);

  const handleNext = () =&gt; {
    setCurrentIndex((prevIndex) =&gt;
      prevIndex + 1 === images.length ? 0 : prevIndex + 1
    );
  };
  const handlePrevious = () =&gt; {
    setCurrentIndex((prevIndex) =&gt;
      prevIndex - 1 &lt; 0 ? images.length - 1 : prevIndex - 1
    );
  };
  const handleDotClick = (index) =&gt; {
    setCurrentIndex(index);
  };
</code></pre><p>Estas son las funciones <em>helper</em> que vamos a necesitar para nuestro componente.</p><h3 id="c-mo-crear-nuestra-plantilla"><strong>Cómo crear nuestra plantilla</strong></h3><p>Nuestra plantilla es bastante simple y consiste de nuestra imagen, el deslizador [slide_directon] y los puntos [indicator]</p><pre><code class="language-jsx">  return (
    &lt;div className="carousel"&gt;
        &lt;img
          key={currentIndex}
          src={images[currentIndex]}
        /&gt;&lt;div className="slide_direction"&gt;
        &lt;div className="left" onClick={handlePrevious}&gt;
          &lt;svg
            xmlns="http://www.w3.org/2000/svg"
            height="20"
            viewBox="0 96 960 960"
            width="20"
          &gt;
            &lt;path d="M400 976 0 576l400-400 56 57-343 343 343 343-56 57Z" /&gt;
          &lt;/svg&gt;
        &lt;/div&gt;
        &lt;div className="right" onClick={handleNext}&gt;
          &lt;svg
            xmlns="http://www.w3.org/2000/svg"
            height="20"
            viewBox="0 96 960 960"
            width="20"
          &gt;
            &lt;path d="m304 974-56-57 343-343-343-343 56-57 400 400-400 400Z" /&gt;
          &lt;/svg&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div className="indicator"&gt;
        {images.map((_, index) =&gt; (
          &lt;div
            key={index}
            className={`dot ${currentIndex === index ? "active" : ""}`}
            onClick={() =&gt; handleDotClick(index)}
          &gt;&lt;/div&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
</code></pre><p>Como pueden ver en esta plantilla, se muestra la imagen del índice actual. Luego, tenemos un <em><code>div</code></em> con la clase <code>slider_direction</code> que contiene otros dos <em><code>divs</code></em> con las clases <code>left</code> y <code>right</code>. Ambos serán los botones de navegación del carrusel y usan SVGs para mostrar los iconos de flechas. Sus funciones <em><code>onClick</code></em> están parametrizados con las funciones <code>handlePrevious</code> y <code>handleNext</code>, respectivamente.</p><p>También tenemos un <em><code>div indicator</code></em> que creamos para mostrar una serie de círculos que representan cada imagen del carrusel. La función recorre el <em>arreglo</em> de imágenes y crea un círculo para cada imagen. De esta forma, se parametriza la clase <code>active</code> para cada círculo al que le corresponda <code>currentIndex</code>.</p><p>Después agregamos un <code>onClick</code> para cada círculo que está parametrizado para hacer correr <code>handleDotClick</code> con el índice del círculo.</p><p>Por ahora, con esto ya armamos nuestra plantilla. Lo único que falta es exportar el componente Carousel, importarlo en el componente <code>App.js</code> y luego agregar algo de CSS. Luego de esto estaremos listos para empezar a animar.</p><p>Por eso, vamos a exportar nuestra función Carousel para nuestro componente <code>Carousel.js</code>.</p><pre><code class="language-jsx">export default Carousel;
</code></pre><h2 id="como-usar-el-component-carousel"><strong>Como usar el component Carousel</strong></h2><p>Ya hemos creado nuestro componente Carousel, pero para poder usarlo tenemos que importarlo dentro de nuestro componente <code>Apps.js</code>:</p><pre><code class="language-jsx">import Carousel from "./Carousel";
</code></pre><p>Después de hacer esto, ya podemos crear nuestro <em>arreglo </em>de imágenes en el que van a estar todos los enlaces a las imágenes:</p><pre><code class="language-js">const images = [
  "https://images.pexels.com/photos/169647/pexels-photo-169647.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=600",
  "https://images.pexels.com/photos/313782/pexels-photo-313782.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=1260&amp;h=750&amp;dpr=1",
  "https://images.pexels.com/photos/773471/pexels-photo-773471.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=1260&amp;h=750&amp;dpr=1",
  "https://images.pexels.com/photos/672532/pexels-photo-672532.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=1260&amp;h=750&amp;dpr=1",
  "https://images.pexels.com/photos/632522/pexels-photo-632522.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=1260&amp;h=750&amp;dpr=1",
  "https://images.pexels.com/photos/777059/pexels-photo-777059.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=1260&amp;h=750&amp;dpr=1",
];
</code></pre><p>Todas estas son imágenes que obtuve de <a href="https://www.pexels.com/">pexels</a> y las que vamos a usar en este &nbsp;proyecto.</p><p>Luego, agregamos nuestra función App que es donde va a estar la plantilla de nuestra aplicación:</p><pre><code class="language-jsx">function App() {
  return (
    &lt;div className="App"&gt;
      &lt;header className="App-header"&gt;
        &lt;h1&gt;Carrusel de imagenes usando React y Framer Motion&lt;/h1&gt;
      &lt;/header&gt;
      &lt;main&gt;
        &lt;Carousel images={images} /&gt;
      &lt;/main&gt;
    &lt;/div&gt;
  );
}
export default App;
</code></pre><p>Como puedes ver, en nuestro encabezado tenemos una descripción de lo que hace nuestra aplicación.</p><p>Luego, en la sección <code><em>main</em></code><em> </em>está nuestro componente, Carousel que lleva una <em>prop</em> del <em>arreglo</em> de imágenes. Si recuerdas, esta es la <em>prop </em> que usamos en ese componente para mostrar la imágenes.</p><p>Por último, exportamos nuestro componente <code>App</code> así lo podemos usar en nuestro archivo <code>index.js</code>.</p><p>Para verla sin estilos, ejecuta el comando <code>npm run start</code> y la aplicación debería verse así:</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/xN2meFY.gif" class="kg-image" alt="Image" width="600" height="411" loading="lazy"></figure><p>Horrible ¿verdad? Estoy de acuerdo contigo, pero con algunas pocas líneas de CSS vamos a transformarlo. Así que vamos.</p><h3 id="c-mo-agregar-css"><strong>Cómo agregar CSS</strong></h3><p>Como no quiero crear una hoja de estilo separada para el componente Carousel, voy a hacer todo el CSS en el archivo <code>App.css</code>. No te olvides de luego importar tu hoja de estilo.</p><pre><code class="language-jsx">import "./App.css"
</code></pre><p>Este es nuestro CSS:</p><pre><code class="language-css">@import url("https://fonts.googleapis.com/css2?family=Oswald:wght@600&amp;display=swap");
.App-header {
  font-size: 1rem;
  text-align: center;
  font-family: "Oswald", sans-serif;
  padding-bottom: 2rem;
}
.carousel-images {
  position: relative;
  border-radius: 10px;
  height: 400px;
  max-width: 650px;
  margin: auto;
  overflow: hidden;
}
.carousel-images img {
  width: 99%;
  height: 99%;
  border-radius: 8px;
  border: #ff00008e solid 2px;
}
.slide_direction {
  display: flex;
  justify-content: space-between;
}
.left,
.right {
  background-color: #fb666675;
  color: #fff;
  padding: 10px 8px 8px 13px;
  margin: 0 20px;
  border-radius: 50%;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto 10px;
  height: 25px;
  width: 25px;
}
.left {
  left: 0;
}
.right {
  right: 0;
}
.carousel-indicator {
  margin-top: 20px;
  display: flex;
  justify-content: center;
  gap: 20px;
}
.dot {
  background-color: #333;
  width: 15px;
  height: 15px;
  border-radius: 50%;
}
.active {
  background-color: #fa2020;
}
</code></pre><p>Y este el resultado con nuestro CSS aplicado:</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/0CfxWn4.gif" class="kg-image" alt="Image" width="600" height="425" loading="lazy"></figure><p>Seguramente coincidirás conmigo que así luce mucho mejor, además de ya ser completamente funcional.</p><p>Pasemos ahora a agregar animación con Framer Motion así le agregamos un lindo efecto de deslizador.</p><h2 id="c-mo-agregar-animaci-n-al-componente-carousel"><strong>Cómo agregar animación al componente Carousel</strong></h2><p>Antes de empezar a animar con Framer Motion, hay algunos conceptos con los que deberás estar familiarizado porque los vamos a usar bastante dentro de esta sección. Estos conceptos incluyen:</p><ul><li><em>Variants</em> son un grupo de propiedades cuyo propósito es definir cómo un elemento debería aparecer o animarse. Es posible crear distintos <em>variants </em>que representen diferentes estados visuales o animaciones para un elemento, como por ejemplo <code>open</code>, <code>closed</code>, <code>hover</code> y del estilo</li><li><em>Initial</em> es el estado que tu objeto tendrá antes de que la animación empiece.</li><li><em>Animate</em> es el estado animado de tu objeto. Es tan simple como eso.</li></ul><p>Volviendo al proyecto, añadiremos nuestras animaciones al componente Carousel. Ya hemos importado las dos propiedades que vamos a necesitar – <code>motion</code> y <code>AnimatePresence</code>.</p><p>Voy a dividir esta sección en tres partes porque la animación la añadiremos a las tres partes de nuestro código: la imagen, la dirección del deslizador y el círculo que se usa como indicador.</p><h3 id="animaci-n-de-la-imagen"><strong>Animación de la imagen</strong></h3><p>Para animar la entrada y salida de una imagen, necesitamos envolver nuestro elemento <code>img</code> con un componente <code>AnimationPresence</code>. Esto nos permite agregar animación cuando una imagen entra o sale. Luego añadimos un <code>motion.</code> a nuestra etiqueta:</p><pre><code class="language-jsx"> &lt;AnimatePresence&gt;
  &lt;motion.img key={currentIndex} src={images[currentIndex]} /&gt;
&lt;/AnimatePresence&gt;;
</code></pre><p>Luego nos posicionamos fuera de nuestra plantilla y declaramos nuestras <em>variants</em>:</p><pre><code class="language-jsx">  const slideVariants = {
    hiddenRight: {
      x: "100%",
      opacity: 0,
    },
    hiddenLeft: {
      x: "-100%",
      opacity: 0,
    },
    visible: {
      x: "0",
      opacity: 1,
      transition: {
        duration: 1,
      },
    },
    exit: {
      opacity: 0,
      scale: 0.8,
      transition: {
        duration: 0.5,
      },
    },
  };
</code></pre><p>Como puedes ver, los <code>sliderVariants</code> tienen cuatro propiedades:</p><ul><li><em><code>hiddenRight</code></em>: esto parametriza la opacidad de la imagen en 0 y la ubica del lado derecho del contenedor.</li><li><em><code>hiddenLeft</code></em>: hace lo mismo que <em><code>hiddenRight</code></em> pero la ubica del lado izquierdo.</li><li><em><code>visible</code></em>: esta es la propiedad que dispara la animación desde donde esté la imagen al centro del contenedor.</li><li><em><code>exit</code>:</em> esta propiedad controla la salida de una imagen de la pantalla al mismo tiempo que otra imagen entra. </li></ul><p>Ahora que ya declaramos nuestros <code><em>variants</em></code><em>, </em>¿cómo podemos prever desde dónde la imagen va a entrar? Para esto necesitamos parametrizar un estado de dirección y que ese estado se actualice de acuerdo con cuál de los <code>slide_direction</code> hizo clic el usuario.</p><pre><code class="language-jsx">const [direction, setDirection] = useState('left');
</code></pre><p>Entonces, vamos a establecer que la imagen entre desde la izquierda. Es lo lógico dado que la primera imagen que se mostrará es la primera de la lista. Luego, en nuestra función <em><code>helper</code></em>, vamos a establecer la dirección de acuerdo con la dirección clikeada:</p><pre><code class="language-jsx">  const handleNext = () =&gt; {
    setDirection("right");
    setCurrentIndex((prevIndex) =&gt;
      prevIndex + 1 === images.length ? 0 : prevIndex + 1
    );
  };

  const handlePrevious = () =&gt; {
    setDirection("left");

    setCurrentIndex((prevIndex) =&gt;
      prevIndex - 1 &lt; 0 ? images.length - 1 : prevIndex - 1
    );
  };

  const handleDotClick = (index) =&gt; {
    setDirection(index &gt; currentIndex ? "right" : "left");
    setCurrentIndex(index);
  };
</code></pre><p>Quizás hayas notado que no solo parametrizamos el estado para &nbsp;<code>handleNext</code> y <code>handlePrevious</code>. También lo hicimos para <code>handleDotClick</code>. Así cuando se clickea un círculo anterior o siguiente, la dirección se actualizará correctamente.</p><p>Pero recuerda: la función de <em>direction</em> es la de establecer el estado inicial de la imagen para que el deslizador funcione correctamente.</p><p>Ya parametrizado <em>direction</em>, vamos a usar nuestros <em><code>variants</code></em> con nuestro elemento <code>img</code>:</p><pre><code class="language-jsx">&lt;AnimatePresence&gt;
          &lt;motion.img
            key={currentIndex}
            src={images[currentIndex]}
            variants={slideVariants}
            initial={direction === "right" ? "hiddenRight" : "hiddenLeft"}
            animate="visible"
            exit="exit"
          /&gt;
        &lt;/AnimatePresence&gt;
</code></pre><p>Agregamos la <em>prop </em><code>variants</code> y la parametrizamos igual que a los <code>slideVariants</code> que creamos. Luego, agregamos la <em>prop </em><code>initial</code>, con la misma sintaxis que un operador ternario. Esto establece que el estado inicial de la imagen sea <code>hiddenRight</code> o <code>hiddenLeft</code> cuando el usuario hace clic en el círculo indicador de la imagen o en el <code>slider_direction</code>.</p><p>Después de esto, agregamos la propiedad <em><code>animate</code></em> que se encarga de animar la imagen desde su posición inicial hasta la posición establecida en la propiedad <code>visible</code>.</p><p>Por último, agregamos nuestra propiedad <em><code>exit</code></em> y la establecemos en <em><code>exit</code>.</em> Esto va a animar la imagen para que salga de la nueva pantalla cuando entra una nueva.</p><p>Hay muchas <em>props</em> que puede usar con Framer Motion. Puedes leer la <a href="https://www.framer.com/motion/component/#props">documentación [en inglés] </a>para aprender más sobre ellas. </p><p>Ya con esto, nuestra carrusel de imágenes debería funcionar correctamente.</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/4VNWzsq.gif" class="kg-image" alt="Image" width="600" height="425" loading="lazy"></figure><h3 id="animaci-n-del-deslizador-y-de-los-c-rculos-indicadores-de-la-imagen"><strong>Animación del deslizador y de los círculos indicadores de la imagen</strong></h3><p>Podríamos detenernos aquí, pero quiero agregar un poco de animación a las direcciones del deslizador y a los los círculos indicadores de la imagen.</p><pre><code class="language-jsx">  const slidersVariants = {
    hover: {
      scale: 1.2,
      backgroundColor: "#ff00008e",
    },
  }; 
const dotsVariants = {
    initial: {
      y: 0,
    },
    animate: {
      y: -10,
      scale: 1.3,
      transition: { type: "spring", stiffness: 1000, damping: "10" },
    },
    hover: {
      scale: 1.1,
      transition: { duration: 0.2 },
    },
  };
</code></pre><p>Empezamos creando nuestros <em>variants. </em>Para los <code>slidersVariants</code>, una propiedad <em>hover</em>. Para los <code>dotsVariants</code> tenemos tres propiedades: <em><code>initial</code></em>, <em><code>animate</code> </em>y <em><code>hover</code>.</em></p><p>Así como lo hicimos como en el elemento <code>img</code>, para poder usar Framer Motion vamos a agregar <code>motion.</code> como prefijo al nombre del elemento.</p><pre><code class="language-jsx">&lt;div className="slide_direction"&gt;
  &lt;motion.div
    variants={slidersVariants}
    whileHover="hover"
    className="left"
    onClick={handlePrevious}
  &gt;
    &lt;svg
      xmlns="http://www.w3.org/2000/svg"
      height="20"
      viewBox="0 96 960 960"
      width="20"
    &gt;
      &lt;path d="M400 976 0 576l400-400 56 57-343 343 343 343-56 57Z" /&gt;
    &lt;/svg&gt;
  &lt;/motion.div&gt;
  &lt;motion.div
    variants={slidersVariants}
    whileHover="hover"
    className="right"
    onClick={handleNext}
  &gt;
    &lt;svg
      xmlns="http://www.w3.org/2000/svg"
      height="20"
      viewBox="0 96 960 960"
      width="20"
    &gt;
      &lt;path d="m304 974-56-57 343-343-343-343 56-57 400 400-400 400Z" /&gt;
    &lt;/svg&gt;
  &lt;/motion.div&gt;
&lt;/div&gt;;
</code></pre><p>Como pueden ver, hemos añadido nuestros <em><code>variants</code></em> y los hemos parametrizados igual a <code>slidersVariants</code>. Luego, usamos una nueva propiedad <code>whileHover</code> y la parametrizamos igual que a la propiedad <em><code>over</code></em> que especificamos en nuestro objeto <code>slidersVariants</code>.</p><pre><code class="language-jsx">&lt;motion.div
  key={index}
  className={`dot ${currentIndex === index ? "active" : ""}`}
  onClick={() =&gt; handleDotClick(index)}
  initial="initial"
  animate={currentIndex === index ? "animate" : ""}
  whileHover="hover"
  variants={dotsVariants}
&gt;&lt;/motion.div&gt;;
</code></pre><p>Aquí no solo agregamos una propiedad <em><code>whileHover</code></em>. También agregamos la propiedad <code>initial</code> y la propiedad <code>animate</code> que anima el círculo de la imagen seleccionada así se destaca.</p><p>En nuestro objeto <code>slidersVariants</code>, hemos agregado una transición a la animación que hace que haya un pequeño salto cuando ocurre la transición. </p><p>Con todo esto junto, nos queda un carrusel de imágenes prolijo. Aquí el resultado final:</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/Bgghl7M.gif" class="kg-image" alt="Image" width="600" height="425" loading="lazy"></figure><p>Para referencia, aquí tienes el código completo del componente carrusel:</p><pre><code class="language-jsx">import { useState } from "react";
import { motion, AnimatePresence } from "framer-motion";

const Carousel = ({ images }) =&gt; {
  const [currentIndex, setCurrentIndex] = useState(0);
  const [direction, setDirection] = useState(null);

  const slideVariants = {
    hiddenRight: {
      x: "100%",
      opacity: 0,
    },
    hiddenLeft: {
      x: "-100%",
      opacity: 0,
    },
    visible: {
      x: "0",
      opacity: 1,
      transition: {
        duration: 1,
      },
    },
    exit: {
      opacity: 0,
      scale: 0.8,
      transition: {
        duration: 0.5,
      },
    },
  };
  const slidersVariants = {
    hover: {
      scale: 1.2,
      backgroundColor: "#ff00008e",
    },
  };
  const dotsVariants = {
    initial: {
      y: 0,
    },
    animate: {
      y: -10,
      scale: 1.2,
      transition: { type: "spring", stiffness: 1000, damping: "10" },
    },
    hover: {
      scale: 1.1,
      transition: { duration: 0.2 },
    },
  };

  const handleNext = () =&gt; {
    setDirection("right");
    setCurrentIndex((prevIndex) =&gt;
      prevIndex + 1 === images.length ? 0 : prevIndex + 1
    );
  };

  const handlePrevious = () =&gt; {
    setDirection("left");

    setCurrentIndex((prevIndex) =&gt;
      prevIndex - 1 &lt; 0 ? images.length - 1 : prevIndex - 1
    );
  };

  const handleDotClick = (index) =&gt; {
    setDirection(index &gt; currentIndex ? "right" : "left");
    setCurrentIndex(index);
  };

  return (
    &lt;div className="carousel"&gt;
        &lt;div className="carousel-images"&gt;
        &lt;AnimatePresence&gt;
          &lt;motion.img
            key={currentIndex}
            src={images[currentIndex]}
            initial={direction === "right" ? "hiddenRight" : "hiddenLeft"}
            animate="visible"
            exit="exit"
            variants={slideVariants}
          /&gt;
        &lt;/AnimatePresence&gt;
        &lt;div className="slide_direction"&gt;
          &lt;motion.div
            variants={slidersVariants}
            whileHover="hover"
            className="left"
            onClick={handlePrevious}
          &gt;
            &lt;svg
              xmlns="http://www.w3.org/2000/svg"
              height="20"
              viewBox="0 96 960 960"
              width="20"
            &gt;
              &lt;path d="M400 976 0 576l400-400 56 57-343 343 343 343-56 57Z" /&gt;
            &lt;/svg&gt;
          &lt;/motion.div&gt;
          &lt;motion.div
            variants={slidersVariants}
            whileHover="hover"
            className="right"
            onClick={handleNext}
          &gt;
            &lt;svg
              xmlns="http://www.w3.org/2000/svg"
              height="20"
              viewBox="0 96 960 960"
              width="20"
            &gt;
              &lt;path d="m304 974-56-57 343-343-343-343 56-57 400 400-400 400Z" /&gt;
            &lt;/svg&gt;
          &lt;/motion.div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div className="carousel-indicator"&gt;
        {images.map((_, index) =&gt; (
          &lt;motion.div
            key={index}
            className={`dot ${currentIndex === index ? "active" : ""}`}
            onClick={() =&gt; handleDotClick(index)}
            initial="initial"
            animate={currentIndex === index ? "animate" : ""}
            whileHover="hover"
            variants={dotsVariants}
          &gt;&lt;/motion.div&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
};
export default Carousel;
</code></pre><p>Dale una mirada al repositorio en <a href="https://github.com/Cejay101/ImageCarousel">GitHub</a>.</p><p>Aquí está el sitio en <a href="https://image-carousel-cj.netlify.app/">Netlify</a>.</p><p><em>Solo para que estén al tanto, este código tiene algunos problemas de accesibilidad por lo que no debería ser usado en un ambiente de producción.</em></p><h2 id="recursos"><strong>Recursos</strong></h2><p>Entiendo que puede haber algunos términos o sintaxis que no estén del todo claro, sobretodo si eres nuevo a React o usando Framer Motion. Por eso, aquí tienes algunos recursos que recomiendo si quieres aprender más:</p><ul><li><a href="https://es.react.dev/">Documentación de React</a> </li><li><a href="https://www.framer.com/motion/">Framer Motion Documentation</a> [en inglés]</li><li><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9iHDnQfTHEVVceOEBsOf07i">Framer Motion Course</a> [en inglés]</li></ul><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>En este artículo, vimos el proceso de diseñar un carrusel de imágenes <em>responsive </em>e interactivo, combinando React y Framer Motion, una librería de animación.</p><p>Al incorporar componentes como <code>motion</code> y <code>AnimationPresence</code>, fuimos paso a paso costruyendo un carrusel visualmente atractivo, que muestra nuestras imagenes y con transiciones impecables y animaciones interesantes para una experiencia de usuario enriquecedora.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear una aplicación Fullstack con Next.js 13 y Firebase ]]>
                </title>
                <description>
                    <![CDATA[ > Nota: Al momento de escribir este artículo (17 de Febrero de 2023), la versión 13 de Next.js fue lanzado, el 25 de Octubre de 2022 para ser exacto.  El equipo detrás de Next.js ha lanzado recientemente Next.js 13 [https://nextjs.org/blog/next-13], que tiene un montón de características nuevas como un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-una-aplicacion-full-stack-con-next-js-13-y-firebase/</link>
                <guid isPermaLink="false">66c75e5ca244b004a5d60a64</guid>
                
                    <category>
                        <![CDATA[ next.js ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                    <category>
                        <![CDATA[ full stack ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Thu, 19 Sep 2024 21:32:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/09/pexels-sevenstorm-juhaszimrus-443383--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <blockquote><strong>Nota</strong>: Al momento de escribir este artículo (17 de Febrero de 2023), la versión 13 de Next.js fue lanzado, el 25 de Octubre de 2022 para ser exacto. </blockquote><p>El equipo detrás de Next.js <a href="https://nextjs.org/blog/next-13">ha lanzado recientemente Next.js 13</a>, que tiene un montón de características nuevas como un nuevo directorio <code>app</code>, componentes para el lado del servidor y del cliente, entre otros.</p><p>En este artículo, aprenderás cómo usar el nuevo Next.js 13 y la Base de Datos Firebase para crear una aplicación <em>full stack.</em></p><p>Antes de continuar, para poder seguir el artículo necesitas tener un conocimiento básico de JavaScript, React y Next.js. Si necesitas repasar alguno de esos conceptos, aquí tienes algún recursos para principiantes:</p><ul><li><a href="https://www.freecodecamp.org/news/learn-javascript-interactive-course/">Aprende JavaScript - contenidos y curso interactivo [en inglés]</a></li><li><a href="https://www.freecodecamp.org/news/learn-react-js-in-this-free-7-hour-course/">Aprende React - curso completo [en inglés]</a></li><li><a href="https://www.freecodecamp.org/news/the-next-js-handbook/">Aprende Next.js - cuadernillo completo [en inglés]</a></li></ul><p>Si estás listo, empecemos.</p><h2 id="c-mo-crear-un-nuevo-proyecto-de-next-js-13"><strong>Cómo crear un nuevo proyecto de Next.js 13</strong></h2><p>Para instalar Next.js, necesitas tener instalado Node.js y npm/yarn instalado en tu computadora. Si no los tienes, puedes bajarlos desde sus sitios oficiales: <a href="https://nodejs.org/en/">Node.js website</a> y <a href="https://www.npmjs.com/">npm website</a> (aunque npm está incluido al instalar Node).</p><ol><li>En el directorio que quieras, inicia la terminal de tu computadora y ejecuta el siguiente comando: <code>npx create-next-app@13 --experimental-app</code>.</li><li>Elige el nombre de tu proyecto y presiona enter para crearlo y esperar a que lo instale.</li><li>Se creará un nuevo directorio con el nombre de tu proyecto con todos archivos necesarios.</li><li>Ejecuta el comando cd para cambiar al directorio nuevo: <br><code>cd my-project-name</code></li><li>Y para iniciar el servidor de desarrollo<strong>, </strong>ejecuta el siguiente comando:</li></ol><pre><code class="language-bash">// si estás usando yarn
yarn run dev

// si estás usando npm
npm run dev</code></pre><p>6. Ejecutar este comando iniciará el servidor de desarrollo para que puedas ver tu aplicación en tiempo real en <a href="http://localhost:3000/">http://localhost:3000</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-5.33.52-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-5.33.52-PM" width="600" height="400" loading="lazy"></figure><p><strong>Cómo instalar Firebase en Next.js</strong></p><p>Firebase es una plataforma Baas -<em> Backend-as-a-Service</em>, por su sigla en inglés- que ofrece servicios como autenticación, bases de datos en tiempo real, almacenamiento en la nube, análisis de datos, entre otros.</p><p>En este tutorial, usaremos Firebase como nuestra base de datos. Sigue estos pasos para crear una aplicación Firebase:</p><ol><li>En <a href="https://console.firebase.google.com/">https://console.firebase.google.com/</a>, inicia sesión con tu cuenta de Google.</li><li>Haz click en <strong>Crear proyecto</strong> y ponle un nombre. Luego, haz clic en <strong>Continuar</strong>.</li><li>En la pantalla siguiente puedes elegir si quieres habilitar métodos de análisis de datos para tu proyecto.</li><li>Haz clic en <strong>Crear proyecto.</strong></li></ol><p>Luego, necesitas crear una aplicación web. En la página de inicio, haz clic en el ícono de web para crear la aplicación:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-5.40.33-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-5.40.33-PM" width="600" height="400" loading="lazy"></figure><p>Ponle un nombre a tu aplicación y haz clic en <strong>Registrar app:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-5.40.48-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-5.40.48-PM" width="600" height="400" loading="lazy"></figure><p>Copia el archivo de configuración ya que vamos a necesitarlo luego. Haz clic en continuar hasta que termines.</p><p>Una vez que estés de vuelta en la página de inicio de tu proyecto, elige un producto que quieras agregar en tu aplicación. Para este tutorial, sólo agrega <strong>Authentication</strong> y <strong>Cloud Firestore</strong>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/Screenshot-2023-02-15-at-6.33.34-PM.png" class="kg-image" alt="Screenshot-2023-02-15-at-6.33.34-PM" width="600" height="400" loading="lazy"></figure><p>Para <strong>Authentication</strong><em>, </em>elige <strong>Método de acceso </strong>y agrega <strong>Correo electrónico/contraseña</strong>.</p><p>Después de instalar exitosamente Firebase, ya lo podemos usar como back-end en tu aplicación de Next.js 13.</p><p>Para usar Firebase con Next.js, sigue estos pasos.</p><p>Instala la última versión del SDK de Firebase en tu proyecto Next.js ejecutando el siguiente comando en tu terminal: </p><pre><code class="language-js">yarn add firebase

// o si estás usando npm
npm install firebase
</code></pre><p>Crea un archivo <code>.env</code> en el directorio raíz de tu proyecto Next.js y copia tus archivos de configuración de Firebase (los que habías copiado antes). Debería verse así:</p><pre><code class="language-js">NEXT_PUBLIC_FIREBASE_API_KEY=api-key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=auth-domain
NEXT_PUBLIC_FIREBASE_PROJECT_ID=project-id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=storage-bucket
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=sender-id
NEXT_PUBLIC_FIREBASE_APP_ID=app-id
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=analytic-id
</code></pre><p>Luego, para que se vea todo más prolijo, en tu directorio <strong>src</strong> crea una carpeta con el nombre <strong>firebase</strong> y crea un archivo <code>config.js</code> con el siguiente código;</p><pre><code class="language-js">// Importa las funciones que necesites de los SDKs 
import { initializeApp, getApps } from "firebase/app";

const firebaseConfig = {
    apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
    authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
    projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
    storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
    appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
    measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
};

// Inicializa Firebase
let firebase_app = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0];

export default firebase_app;
</code></pre><p>Con esto ya listo, ya puedes utilizar Firebase como base de datos en tu aplicación Next.js.</p><h2 id="c-mo-instalar-authentication">Cómo instalar Authentication</h2><p>Al querer construir aplicaciones <em>fullstack</em>, lo primero en lo que pensamos es la autenticación de usuarios. Con Firebase, podemos crear una forma de registrar usuarios o de que inicien sesión muy fácilmente.</p><p>En tu directorio <strong>src &gt; firebase</strong>, crea una nueva carpeta con el nombre <strong>auth</strong>. Todo el código relacionado con la autenticación de firebase lo guardaremos aquí.</p><p>Luego, crea un archivo <code>signup.js</code> &nbsp;dentro del directorio <strong>src &gt; firebase &gt; auth </strong>con el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { createUserWithEmailAndPassword, getAuth } from "firebase/auth";

const auth = getAuth(firebase_app);


export default async function signUp(email, password) {
    let result = null,
        error = null;
    try {
        result = await createUserWithEmailAndPassword(auth, email, password);
    } catch (e) {
        error = e;
    }

    return { result, error };
}

</code></pre><p>Vamos a descrifrar este código. Lo que estamos haciendo aquí es exportando la función <code>signUp()</code> que usa el método <strong>createUserWithEmailAndPassword() </strong>de Firebase para poder registrar nuevos usuarios. Luego de hacer esto, vamos a poder usar la función <code>signUp()</code> en cualquier lado de nuestra app.</p><p>En la misma carpeta, agreguemos nuestra función <code>signIn()</code>. Para hacer esto, crea un archivo <code>signin.js</code> con el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { signInWithEmailAndPassword, getAuth } from "firebase/auth";

const auth = getAuth(firebase_app);

export default async function signIn(email, password) {
    let result = null,
        error = null;
    try {
        result = await signInWithEmailAndPassword(auth, email, password);
    } catch (e) {
        error = e;
    }

    return { result, error };
}
</code></pre><h3 id="c-mo-crear-las-p-ginas-para-el-inicio-de-sesi-n-y-el-registro-de-usuarios-en-next-js">Cómo crear las páginas para el inicio de sesión y el registro de usuarios en Next.js</h3><p>En Next.js 13 se puede crear nuevas páginas dentro del directorio <code>app</code>. Cada página es una carpeta con un archivo <code>page.js</code>. Para aprender más sobre cómo crear páginas, puedes leer la <a href="https://beta.nextjs.org/docs/routing/pages-and-layouts">documentación de Next.js al respecto [en inglés]</a>.</p><p>Para crear un página de registro de usuarios un nuevo archivo <code>page.js</code> en <strong>signup</strong>, dentro de tu directorio <strong>app</strong>. Luego, agrega el siguiente código: </p><pre><code class="language-jsx">'use client'
import React from "react";
import signUp from "@/firebase/auth/signup";
import { useRouter } from 'next/navigation'

function Page() {
    const [email, setEmail] = React.useState('')
    const [password, setPassword] = React.useState('')
    const router = useRouter()

    const handleForm = async (event) =&gt; {
        event.preventDefault()

        const { result, error } = await signUp(email, password);

        if (error) {
            return console.log(error)
        }

        // else successful
        console.log(result)
        return router.push("/admin")
    }
    return (&lt;div className="wrapper"&gt;
        &lt;div className="form-wrapper"&gt;
            &lt;h1 className="mt-60 mb-30"&gt;Sign up&lt;/h1&gt;
            &lt;form onSubmit={handleForm} className="form"&gt;
                &lt;label htmlFor="email"&gt;
                    &lt;p&gt;Email&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setEmail(e.target.value)} required type="email" name="email" id="email" placeholder="example@mail.com" /&gt;
                &lt;/label&gt;
                &lt;label htmlFor="password"&gt;
                    &lt;p&gt;Password&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setPassword(e.target.value)} required type="password" name="password" id="password" placeholder="password" /&gt;
                &lt;/label&gt;
                &lt;button type="submit"&gt;Sign up&lt;/button&gt;
            &lt;/form&gt;
        &lt;/div&gt;
    &lt;/div&gt;);
}

export default Page;`
</code></pre><p>Por defecto, cada página que se agrega al directorio <code>page.js</code> es un <a href="https://beta.nextjs.org/docs/rendering/server-and-client-components">componente del servidor [enlace a la documentación en inglés]</a> y por lo tanto no permite agregar interactividad de lado del servidor como un <code>onSubmit()</code> a elementos de formulario. Para poder agregar esta interactividad, tenemos que decirle a Next.js que queremos un componente Cliente. Para hacer esto, añadimos lo siguiente al comienzo del archivo y antes de importar cualquier otro elemento:</p><pre><code class="language-js">'use client'

// código del componente
</code></pre><p>Del mismo modo vamos a crear nuestra página de inicio de sesión. Para crear esta página, crea un archivo <strong>page.js</strong> en <strong>signin</strong>, dentro de tu directorio <strong>app</strong>, y agrega el siguiente código:</p><pre><code class="language-jsx">'use client'
import React from "react";
import signIn from "@/firebase/auth/signin";
import { useRouter } from 'next/navigation'

function Page() {
    const [email, setEmail] = React.useState('')
    const [password, setPassword] = React.useState('')
    const router = useRouter()

    const handleForm = async (event) =&gt; {
        event.preventDefault()

        const { result, error } = await signIn(email, password);

        if (error) {
            return console.log(error)
        }

        // sino exitoso
        console.log(result)
        return router.push("/admin")
    }
    return (&lt;div className="wrapper"&gt;
        &lt;div className="form-wrapper"&gt;
            &lt;h1 className="mt-60 mb-30"&gt;Sign up&lt;/h1&gt;
            &lt;form onSubmit={handleForm} className="form"&gt;
                &lt;label htmlFor="email"&gt;
                    &lt;p&gt;Email&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setEmail(e.target.value)} required type="email" name="email" id="email" placeholder="example@mail.com" /&gt;
                &lt;/label&gt;
                &lt;label htmlFor="password"&gt;
                    &lt;p&gt;Password&lt;/p&gt;
                    &lt;input onChange={(e) =&gt; setPassword(e.target.value)} required type="password" name="password" id="password" placeholder="password" /&gt;
                &lt;/label&gt;
                &lt;button type="submit"&gt;Sign up&lt;/button&gt;
            &lt;/form&gt;
        &lt;/div&gt;

    &lt;/div&gt;);
}

export default Page;
</code></pre><h3 id="c-mo-saber-si-hubo-alg-n-cambio-de-autenticaci-n">Cómo saber si hubo algún cambio de autenticación</h3><p>Mientras estás usando la aplicación, siempre vamos a querer saber si el usuario ha iniciado sesión o no. Si el usuario ha iniciado sesión, es posible crear páginas protegidas y mostrarle ciertos contenidos sólo a él. Firebase tiene el método <code>onAuthStateChanged()</code> para poder saber si hubo cambios.</p><p>Para que la información del usuario obtenida con el método mencionado arriba pueda ser usada en todo la aplicación, vamos a usar la API React Context. Crea un carpeta con el nombre <strong>context</strong> en tu directorio <strong>src. </strong>Dentro del directorio <strong>directory</strong>, crea un archivo con el nombre <code>AuthContext.js</code> y agrega el siguiente código:</p><pre><code class="language-jsx">import React from 'react';
import {
    onAuthStateChanged,
    getAuth,
} from 'firebase/auth';
import firebase_app from '@/firebase/config';

const auth = getAuth(firebase_app);

export const AuthContext = React.createContext({});

export const useAuthContext = () =&gt; React.useContext(AuthContext);

export const AuthContextProvider = ({
    children,
}) =&gt; {
    const [user, setUser] = React.useState(null);
    const [loading, setLoading] = React.useState(true);

    React.useEffect(() =&gt; {
        const unsubscribe = onAuthStateChanged(auth, (user) =&gt; {
            if (user) {
                setUser(user);
            } else {
                setUser(null);
            }
            setLoading(false);
        });

        return () =&gt; unsubscribe();
    }, []);

    return (
        &lt;AuthContext.Provider value={{ user }}&gt;
            {loading ? &lt;div&gt;Loading...&lt;/div&gt; : children}
        &lt;/AuthContext.Provider&gt;
    );
};
</code></pre><p>Con el código de arriba simplemente creamos un Provider que devuelve el objeto usuario si el usuario inició sesión. De lo contrario, sólo devolverá <code>null</code>.</p><p>Para poder usar el valor que se le pasó a <code>&lt;AuthContext.Provider&gt;</code> &nbsp;vamos a exportar <code>useAuthContext</code> desde el archivo y así usar el valor de <code>user</code>.</p><p>Antes de poder usar este contexto, necesitamos envolver todos los componentes con <code>AuthContextProvider</code>. Para hacer esto, abrimos el archivo <strong>layout.js</strong> dentro del directorio <strong>src &gt; app</strong> y editamos el código con lo siguiente:</p><pre><code class="language-jsx">'use client'
import './globals.css'
import { AuthContextProvider } from '@/context/AuthContext'

export default function RootLayout({ children }) {
  return (
    &lt;html lang="en"&gt;
      {/*
        &lt;head /&gt; contendrá los componentes devueltos por el padre más cercano
        head.js. Encuentra más información en https://beta.nextjs.org/docs/api-reference/file-conventions/head
      */}
      &lt;head /&gt;
      &lt;body&gt;
        &lt;AuthContextProvider&gt;
          {children}
        &lt;/AuthContextProvider&gt;
      &lt;/body&gt;
    &lt;/html&gt;
  )
}

</code></pre><p>Ahora ya podemos crear páginas protegidas y mostrar contenido específico a usuarios distintos.</p><h3 id="c-mo-crear-p-ginas-protegidas">Cómo crear páginas protegidas</h3><p>Dentro del directorio <strong>app, </strong>crea el directorio <strong>admin &gt; page.js </strong> y agrega el siguiente código:</p><pre><code class="language-jsx">'use client'
import React from "react";
import { useAuthContext } from "@/context/AuthContext";
import { useRouter } from "next/navigation";
function Page() {
    const { user } = useAuthContext()
    const router = useRouter()

    React.useEffect(() =&gt; {
        if (user == null) router.push("/")
    }, [user])

    return (&lt;h1&gt;Solamente los usuarios que iniciaron sesión pueden ver esta página&lt;/h1&gt;);
}

export default Page;
</code></pre><p>Si el usuario es <code>null</code>, lo redireccionamos a la página inicial. De lo contrario, si no es <code>null</code>, le mostramos la página protegida.</p><h2 id="c-mo-comunicarse-con-nuestra-base-de-datos">Cómo comunicarse con nuestra base de datos</h2><p>Ahora que ya lidiamos con la parte de autenticación, podemos enfocarnos en la comunicación con nuestra base de datos. Como base de datos vamos a usar <strong>Firestore.</strong></p><p>Para seguir haciendo todo ordenado, vamos a crear un nuevo directorio llamado <strong>firebase &gt; firestore</strong>. Dentro de este directorio vamos a guardar todo el código relacionado con Firestore.</p><h3 id="c-mo-agregar-documentos-a-firestore">Cómo agregar documentos a Firestore</h3><p>Dentro del directorio <strong>firestore</strong>, crea un archivo con el nombre <code>addData.js</code> y agrega el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { getFirestore, doc, setDoc } from "firebase/firestore";

const db = getFirestore(firebase_app)
export default async function addData(colllection, id, data) {
    let result = null;
    let error = null;

    try {
        result = await setDoc(doc(db, colllection, id), data, {
            merge: true,
        });
    } catch (e) {
        error = e;
    }

    return { result, error };
}
</code></pre><p>Este código ya debería serte familiar: estamos exportando una función que permite agregar información a nuestra base de datos firestore.</p><p>Ahora ya podemos usar esta función <code>addData()</code> desde cualquier componente para agregar información a nuestra base de datos:</p><pre><code class="language-js">'use client'
import addData from "@/firebase/firestore/addData";

export default function Home() {

  const handleForm = async () =&gt; {
    const data = {
      name: 'John snow',
      house: 'Stark'
    }
    const { result, error } = await addData('users', 'user-id', data)

    if (error) {
      return console.log(error)
    }
  }
  
  return (
    ...
  )
}

</code></pre><h3 id="c-mo-podemos-obtener-un-documento-desde-firestore">Cómo podemos obtener un documento desde Firestore</h3><p>Usando un método similar, podemos obtener un documento desde nuestra base de datos Firebase.</p><p>Crea un archivo <code>getData.js</code> dentro del directorio <strong>Firestore </strong>y agrega el siguiente código:</p><pre><code class="language-js">import firebase_app from "../config";
import { getFirestore, doc, getDoc } from "firebase/firestore";

const db = getFirestore(firebase_app)
export default async function getDoument(collection, id) {
    let docRef = doc(db, collection, id);

    let result = null;
    let error = null;

    try {
        result = await getDoc(docRef);
    } catch (e) {
        error = e;
    }

    return { result, error };
}

</code></pre><p>También podemos usar está función en cualquier componente que quieras.</p><h2 id="conclusi-n">Conclusión</h2><p>En este artículo, aprendimos cómo construir una aplicación <em>fullstack</em> usando Firebase y Next.js 13 para agregar autenticación e interacción con nuestra base de datos.</p><p>¡Feliz codificación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo acceder a las propiedades de un arreglo de objetos en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Al trabajar con aplicaciones de JavaScript, es común hacerlo con arreglos,  arreglos anidados, y con arreglos de objetos. Sin embargo, muchos principiantes no saben cómo acceder a las propiedades de estas estructuras de datos. En este artículo, vamos a hablar sobre cómo acceder a las propiedades de una variedad ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-acceder-a-las-propiedades-de-un-arreglo-de-objetos-en-javascript/</link>
                <guid isPermaLink="false">6643b40b66e68c03ffefd7e5</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Tue, 30 Jul 2024 12:55:14 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/07/david-rangel-4m7gmLNr3M0-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Al trabajar con aplicaciones de JavaScript, es común hacerlo con <em>arreglos</em>,<em> arreglos</em> anidados, y con arreglos de objetos. Sin embargo, muchos principiantes no saben cómo acceder a las propiedades de estas estructuras de datos.</p><p>En este artículo, vamos a hablar sobre cómo acceder a las propiedades de una variedad de arreglos y ver algunos ejemplos de código. </p><h2 id="-qu-es-un-arreglo-en-javascript"><strong>¿Qué es un arreglo en JavaScript?</strong></h2><p>Un arreglo<em> </em>es un tipo de estructura de datos de JavaScript que se usa para almacenar una colección de elementos de distintas clases.</p><p>Es posible tener un arreglo de cadenas de texto, como este:</p><pre><code class="language-js">const fruits = ["apple", "banana", "mango", "orange"];
</code></pre><p>O un arreglo de números:</p><pre><code class="language-js">const numbers = [1, 2, 3, 4, 5];
</code></pre><p>y hasta un arreglo anidado de arreglos como este:</p><pre><code class="language-js">const nestedArray = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];
</code></pre><p>También es posible tener un arreglo<em> </em>de distintas clases de datos:</p><pre><code class="language-js">const mixedArray = ["apple", 1, "banana", 2, "mango", 3];
</code></pre><h2 id="c-mo-acceder-a-los-elementos-de-un-arreglo-en-javascript-"><strong>Cómo acceder a los elementos de un </strong>arreglo<strong> en JavaScript:</strong></h2><p>Para acceder a un elemento de un arreglo, hay que referenciar el nombre del arreglo<em>,</em> seguido del número de índice del elemento que queremos acceder, entre corchetes.</p><p>Este es un ejemplo de cómo acceder al primer elemento del arreglo <code>fruits</code>:</p><pre><code class="language-js">const fruits = ["apple", "banana", "mango", "orange"];
console.log(fruits[0]); // apple
</code></pre><p>Los arreglos siempre comienzan en cero. Esto significa que el primer elemento tiene el índice 0, el segundo tiene el 1 y así los siguientes elementos.<br><br>Para acceder al último elemento del arreglo, se puede usar la longitud (<em>length</em>) del arreglo menos 1.</p><pre><code class="language-js">const fruits = ["apple", "banana", "mango", "orange"];
console.log(fruits[fruits.length - 1]); // orange
</code></pre><p>A veces puede ser confuso cuando se está trabajando con un arreglo anidado de arreglos, pero la sintaxis es la misma que usamos cuando queremos acceder a un elemento de un arreglo anidado. Por ejemplo, si queremos acceder al primer elemento de <code>nestedArray</code>: </p><pre><code class="language-js">const nestedNumberArray = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];
console.log(nestedNumberArray[0][0]); // 1
</code></pre><p><code>nestedNumberArray[0]</code> apunta a este arreglo:</p><pre><code class="language-js">[1, 2, 3];
</code></pre><p>Para acceder al primer elemento de este arreglo, hay que usar otro para de corchetes con el número de índice que se quiere acceder:</p><pre><code class="language-js">nestedNumberArray[0][0];
</code></pre><h2 id="c-mo-acceder-a-las-propiedades-de-un-arreglo-de-objetos-en-javascript"><strong>Cómo acceder a las propiedades de un arreglo de objetos en JavaScript</strong></h2><p>Muchas veces vamos a encontrar arreglos de objetos en JavaScript.</p><p>En este ejemplo, dentro del <em>arreglo</em> <code>developers</code>, cada desarrollador tiene las siguientes propiedades: <em>name</em>, <em>age</em> y la propiedad <em>languages </em>que es un <em>arreglo </em>con los lenguajes de programación que conocen.</p><pre><code class="language-js">const developers = [
  { name: "John", age: 25, languages: ["JavaScript", "Python"] },
  { name: "Kelly", age: 37, languages: ["Ruby", "Python", "C", "C++"] },
  { name: "Zack", age: 45, languages: ["Go", "C#"] },
];</code></pre><p>Si queremos acceder a la propiedad <em>name </em>del primer desarrollador, usamos la siguiente sintaxis:</p><pre><code class="language-js">console.log(developers[0].name); // John
</code></pre><p>Aquí estamos usando una combinación de anotación de punto y corchetes para acceder a la primera propiedad del objeto del primer desarrollador en el <em>arreglo</em> <code>developers</code>.</p><p><code>developers[0]</code> es el objeto del primer desarrollador.</p><pre><code class="language-js">{ name: "John", age: 25, languages: ["JavaScript", "Python"] }
</code></pre><p>Luego usamos la notación de punto (<code>developers[0].name</code>) para acceder a la propiedad <code>name</code> de este objeto.</p><h2 id="c-mo-encontrar-un-valor-espec-fico-de-un-arreglo-de-objetos-en-javascript"><strong>Cómo encontrar un valor específico de un arreglo de objetos en JavaScript</strong></h2><p>Para buscar un objeto en particular dentro de un <em>arreglo </em>de objetos, es posible usar el método <code>find</code>. Este método devuelve el primer elemento en el <em>arreglo</em> que cumple con los parámetros de la función. Si ningún elemento los cumple, devuelve <code>undefined</code>.</p><p>Este es un ejemplo usando el método <code>find</code> con un <em>arreglo</em> de números:</p><pre><code class="language-js">const numbers = [1, 2, 3, 4, 5];

const foundNumber = numbers.find((number) =&gt; number &gt; 3); // 4
</code></pre><p>En el ejemplo anterior, el método <code>find</code> busca entre los números del <em>arreglo</em> y devuelve el primer número mayor a 3. En este caso, <code>find</code> devuelve el número 4.</p><p>También podemos usar el mismo razonamiento para encontrar un objeto específico dentro de un <em>arreglo</em> de objetos.</p><p>En el siguiente ejemplo, vamos a buscar el objeto con el valor "Kelly" en la propiedad <code>name</code> dentro del arreglo <code>developers</code>.</p><pre><code class="language-js">const developers = [
  { name: "John", age: 25, languages: ["JavaScript", "Python"] },
  { name: "Kelly", age: 37, languages: ["Ruby", "Python", "C", "C++"] },
  { name: "Zack", age: 45, languages: ["Go", "C#"] },
];

developers.find((developer) =&gt; developer.name === "Kelly");
</code></pre><p>En este ejemplo, <code>developer</code> representa cada objeto del <em>arreglo</em>. El método <code>find</code> va a recorrer el <em>arreglo</em> <code>developers</code> y devolver el primer objeto <code>developer</code> que tenga el valor "Kelly" en la propiedad <code>name</code>.</p><pre><code class="language-js">{ name: "Kelly", age: 37, languages: ["Ruby", "Python", "C", "C++"] }
</code></pre><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Espero que este artículo te haya resultado útil para aprender sobre <em>arreglos </em>y cómo acceder a sus propiedades.</p><p>Vimos un par de ejemplos de <em>arreglos</em> y también vimos cómo acceder a sus elementos desde <em>arreglos </em>anidados y de un <em>arreglo</em> de objetos.</p><p>También aprendimos el método <code>find</code> y cómo usarlo para encontrar un objeto específico dentro de un <em>arreglo</em> de objetos.</p><p>Ahora deberías poder entender mejor sobre cómo trabajar con <em>arreglos</em> y objetos en JavaScript.</p><p>¡Feliz codificación! 🚀</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo hacer un menú acordeón en React, desde cero y sin librerías externas ]]>
                </title>
                <description>
                    <![CDATA[ Los menús acordeón tienen varios usos como, por ejemplo, mostrar una lista de preguntas frecuentes, o menús y sub-menús, o también las distintas sucursales de un empresa, etc. En este artículo, veremos cómo hacer un menú acordeón en React, completamente desde cero, paso por paso y sin usar librerías externas. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-hacer-un-menu-acordion/</link>
                <guid isPermaLink="false">669daca52bfc9803fe184649</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Tue, 30 Jul 2024 11:59:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/07/604df0d628094f59be2558d6.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los menús acordeón tienen varios usos como, por ejemplo, mostrar una lista de preguntas frecuentes, o menús y sub-menús, o también las distintas sucursales de un empresa, etc.</p><p>En este artículo, veremos cómo hacer un menú acordeón en React, completamente desde cero, paso por paso y sin usar librerías externas.</p><p>Usaremos la sintaxis de React Hooks para hacer esta aplicación en React. Por lo que si no estás muy familiarizado con React Hooks, puedes dar un vistazo a mi artículo <a href="https://levelup.gitconnected.com/an-introduction-to-react-hooks-50281fd961fe?source=friends_link&amp;sk=89baff89ec8bc637e7c13b7554904e54">Introducción a React Hooks</a> [en inglés] para aprender los fundamentos de Hooks.</p><p><strong>Puedes ver la demo de la aplicación <a href="https://react-accordion-demo.netlify.app/">aquí</a>.</strong></p><p>Empecemos.</p><h2 id="configuraci-n-inicial-del-proyecto"><strong>Configuración inicial del proyecto</strong></h2><p>Crea un nuevo proyecto <code>create-react-app</code>.</p><pre><code class="language-javascript">npx create-react-app react-accordion-demo
</code></pre><p>Una vez que el proyecto está creado, borra todos los archivos de la carpeta <code>src</code> y crea los archivos <code>index.js</code>, <code>App.js</code> y <code>styles.css</code> dentro de ella. También crea aquí una nueva carpeta llamada <code>utils</code>.</p><p> Abre el archivo <code>styles.css</code> y copia <a href="https://github.com/myogeshchavan97/react-accordion-demo/blob/master/src/styles.css">este código</a> en ese archivo.</p><h2 id="c-mo-crear-las-primeras-p-ginas"><strong>Cómo crear las primeras páginas</strong></h2><p>Abre el archivo <code>src/App.js</code> y añade el siguiente código dentro de él:</p><pre><code class="language-jsx">import React from 'react';

const App = () =&gt; {
  const accordionData = {
    title: 'Section 1',
    content: `Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quis sapiente
      laborum cupiditate possimus labore, hic temporibus velit dicta earum
      suscipit commodi eum enim atque at? Et perspiciatis dolore iure
      voluptatem.`
  };

  const { title, content } = accordionData;

  return (
    &lt;React.Fragment&gt;
      &lt;h1&gt;React Accordion Demo&lt;/h1&gt;
      &lt;div className="accordion"&gt;
        &lt;div className="accordion-item"&gt;
          &lt;div className="accordion-title"&gt;
            &lt;div&gt;{title}&lt;/div&gt;
            &lt;div&gt;+&lt;/div&gt;
          &lt;/div&gt;
          &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/React.Fragment&gt;
  );
};

export default App;
</code></pre><p>Aquí usamos las propiedades del objeto <code>accordionData</code> para mostrar el contenido del acordeón.</p><p>Para la propiedad <code>content</code>, usamos la sintaxis de la plantilla literal de <strong>ES6</strong> (``) así podemos escribir en varias líneas. También usamos un texto <em>lorem ipsum </em>de ejemplo.</p><p> Luego, abre el archivo <code>src/index.js</code> y añade el siguiente contenido:</p><pre><code class="language-jsx">import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './styles.css';

ReactDOM.render(&lt;App /&gt;, document.getElementById('root'));
</code></pre><p>Si ejecutas la aplicación usando el comando <code>yarn start</code> desde la terminal, verás la siguiente pantalla:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/92ab4961521a20180285b6fdf5179b6d17fbcdff/accordion_initial.png" class="kg-image" alt="Initial Accordion" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-abrir-y-cerrar-el-men-acorde-n"><strong>Cómo abrir y cerrar el menú acordeón</strong></h2><p>Como has podido ver arriba, pudimos mostrar un única sección como parte del menú acordeón. Por defecto el acordeón está abierta, pero no podemos cerrarlo. Así que vamos a agregar esa funcionalidad para abrirlo y cerrarlo.</p><p>Añade un nuevo estado dentro del componente como se muestra a continuación:</p><pre><code class="language-js">const [isActive, setIsActive] = useState(false);
</code></pre><p> Aquí hemos definido el estado <code>isActive</code>. Con esto, ocultaremos o mostraremos el contenido del acordeón.</p><p>También importa el <em>hook</em> <code>useState</code> al comienzo del archivo:</p><pre><code class="language-js">import React, { useState } from 'react';
</code></pre><p>Luego, para el <code>div</code> con la clase <code>accordion-title</code>, añade el <em>handler </em><code>onClick</code> de la siguiente manera:</p><pre><code class="language-jsx">&lt;div className="accordion"&gt;
  &lt;div className="accordion-item"&gt;
    &lt;div
      className="accordion-title"
      onClick={() =&gt; setIsActive(!isActive)}
    &gt;
      &lt;div&gt;{title}&lt;/div&gt;
      &lt;div&gt;{isActive ? '-' : '+'}&lt;/div&gt;
    &lt;/div&gt;
    {isActive &amp;&amp; &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;}
  &lt;/div&gt;
&lt;/div&gt;
</code></pre><p>Aquí estamos invirtiendo el valor del estado <code>isActive</code> cuando hacemos clic en el div <code>accordion-title</code>. Si el valor de <code>isActive</code> es <code>false</code>, lo ponemos en <code>true</code> y al revés. </p><p>Mostramos el signo <code>+</code> o <code>-</code> de acuerdo con el valor de <code>isActive</code> a través de un operador ternario.</p><p>Y si el valor del estado <code>isActive</code> es <code>true</code> entonces sólo vamos a mostrar el contenido del acordeón como en el ejemplo de abajo:</p><pre><code class="language-jsx">{isActive &amp;&amp; &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;}
</code></pre><p>Si actualizas la aplicación, verás la siguiente pantalla:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/92ab4961521a20180285b6fdf5179b6d17fbcdff/open_close.gif" class="kg-image" alt="Open and close accordion" width="600" height="400" loading="lazy"></figure><p>Al hacer clic en el título, el acordeón se abre y podemos volver a hacer clic sobre él para cerrarlo.</p><h2 id="c-mo-a-adir-varias-secciones-a-un-men-acorde-n"><strong>Cómo añadir varias secciones a un menú acordeón</strong></h2><p>Si tenemos varias secciones, copiar y pegar una y otra vez el mismo código JSX no funcionará tan bien como si tenemos un solo una sección.</p><p>Entonces, lo que vamos a hacer es crear un componente separado solamente para mostrar el acordeón. Luego, de acuerdo con la cantidad de secciones que tengamos, vamos a usar un bucle para recorrer el componente y así hacer que muestre varias secciones.</p><p>Crea un nuevo archivo llamado <code>Accordion.js</code> dentro de la carpeta <code>src</code> y luego añade el siguiente código dentro de este:</p><pre><code class="language-jsx">import React, { useState } from 'react';

const Accordion = ({ title, content }) =&gt; {
  const [isActive, setIsActive] = useState(false);

  return (
    &lt;div className="accordion-item"&gt;
      &lt;div className="accordion-title" onClick={() =&gt; setIsActive(!isActive)}&gt;
        &lt;div&gt;{title}&lt;/div&gt;
        &lt;div&gt;{isActive ? '-' : '+'}&lt;/div&gt;
      &lt;/div&gt;
      {isActive &amp;&amp; &lt;div className="accordion-content"&gt;{content}&lt;/div&gt;}
    &lt;/div&gt;
  );
};

export default Accordion;
</code></pre><p>Aquí, lo que hemos hecho es mover el estado y el div <code>accordion-item</code> del archivo <code>App.js</code> al archivo <code>Accordion.js</code>. Luego, pasamos las propiedades dinámicas <code>title</code> y <code>content</code> usando la sintaxis de desestructuración de ES6: </p><pre><code class="language-js">const Accordion = ({ title, content }) =&gt; {
</code></pre><p>Ahora, abrimos el archivo <code>App.js</code> y reemplazamos el código con este:</p><pre><code class="language-jsx">import React from 'react';
import Accordion from './Accordion';

const App = () =&gt; {
  const accordionData = [
    {
      title: 'Section 1',
      content: `Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quis sapiente
      laborum cupiditate possimus labore, hic temporibus velit dicta earum
      suscipit commodi eum enim atque at? Et perspiciatis dolore iure
      voluptatem.`
    },
    {
      title: 'Section 2',
      content: `Lorem ipsum, dolor sit amet consectetur adipisicing elit. Mollitia veniam
      reprehenderit nam assumenda voluptatem ut. Ipsum eius dicta, officiis
      quaerat iure quos dolorum accusantium ducimus in illum vero commodi
      pariatur? Impedit autem esse nostrum quasi, fugiat a aut error cumque
      quidem maiores doloremque est numquam praesentium eos voluptatem amet!
      Repudiandae, mollitia id reprehenderit a ab odit!`
    },
    {
      title: 'Section 3',
      content: `Sapiente expedita hic obcaecati, laboriosam similique omnis architecto ducimus magnam accusantium corrupti
      quam sint dolore pariatur perspiciatis, necessitatibus rem vel dignissimos
      dolor ut sequi minus iste? Quas?`
    }
  ];

  return (
    &lt;div&gt;
      &lt;h1&gt;React Accordion Demo&lt;/h1&gt;
      &lt;div className="accordion"&gt;
        {accordionData.map(({ title, content }) =&gt; (
          &lt;Accordion title={title} content={content} /&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;
</code></pre><p>Lo que hicimos fue convertir el objeto <code>accordionData</code> en un arreglo de objetos. Luego, lo recorremos con un bucle usando el método <code>map</code>, además de pasarle las propiedades <code>title</code> y <code>content</code> al componente <code>Accordion</code>.</p><p>Si actualizas la aplicación, verás que se muestran las tres secciones y que podemos abrir y cerrar cada una de ellas:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/92ab4961521a20180285b6fdf5179b6d17fbcdff/final_working.gif" class="kg-image" alt="final working accordion" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-refactorizar-el-c-digo"><strong>Cómo refactorizar el código</strong></h2><p>Como has visto, con solo mover la sección del acordeón a un componente separado y pasar el contenido dinámico mediante <em>props</em>, pudimos crear un acordeón desde cero y que funciona.</p><p>Como es una buena práctica dejar la información estática en un archivo separado, vamos a mover el <em>arreglo </em><code>accordionData</code> a un archivo distinto y luego importarlos desde <code>App.js</code></p><p>Crea un nuevo archivo llamado <code>content.js</code> dentro de la carpeta <code>utils</code> y copia el siguiente código dentro de este:</p><pre><code class="language-js">export const accordionData = [
  {
    title: 'Section 1',
    content: `Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quis sapiente
    laborum cupiditate possimus labore, hic temporibus velit dicta earum
    suscipit commodi eum enim atque at? Et perspiciatis dolore iure
    voluptatem.`
  },
  {
    title: 'Section 2',
    content: `Lorem ipsum, dolor sit amet consectetur adipisicing elit. Mollitia veniam
    reprehenderit nam assumenda voluptatem ut. Ipsum eius dicta, officiis
    quaerat iure quos dolorum accusantium ducimus in illum vero commodi
    pariatur? Impedit autem esse nostrum quasi, fugiat a aut error cumque
    quidem maiores doloremque est numquam praesentium eos voluptatem amet!
    Repudiandae, mollitia id reprehenderit a ab odit!`
  },
  {
    title: 'Section 3',
    content: `Sapiente expedita hic obcaecati, laboriosam similique omnis architecto ducimus magnam accusantium corrupti
    quam sint dolore pariatur perspiciatis, necessitatibus rem vel dignissimos
    dolor ut sequi minus iste? Quas?`
  }
];
</code></pre><p>Ahora, abre <code>App.js</code> y reemplaza el código de ese archivo con este:</p><pre><code class="language-jsx">import React from 'react';
import Accordion from './Accordion';
import { accordionData } from './utils/content';

const App = () =&gt; {
  return (
    &lt;div&gt;
      &lt;h1&gt;React Accordion Demo&lt;/h1&gt;
      &lt;div className="accordion"&gt;
        {accordionData.map(({ title, content }) =&gt; (
          &lt;Accordion title={title} content={content} /&gt;
        ))}
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;
</code></pre><p>Con esto hemos importado la información estática desde un archivo externo y luego lo borramos del archivo <code>App.js</code>.</p><p>Entonces ahora el código se ve prolijo y fácil de leer, además de que continúa funcionando:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/92ab4961521a20180285b6fdf5179b6d17fbcdff/final_working.gif" class="kg-image" alt="final working accordion" width="600" height="400" loading="lazy"></figure><h2 id="cierre"><strong>Cierre</strong></h2><p>Con esto, hemos terminado de hacer nuestra app.</p><p><strong>Puedes encontrar el código completo de esta aplicación en este <a href="https://github.com/myogeshchavan97/react-accordion-demo">repositorio de GitHub</a>.</strong></p><h3 id="-gracias-por-leer-"><strong>¡Gracias por leer!</strong></h3><p>Si quieres aprender en detalle todo lo nuevo de ES6+, incluyendo <em>let</em> y <em>const</em>, promesas, distintos métodos de promesas, desestructuración de objetos y <em>arreglos</em>, funciones flecha, <em>async/await</em>, importar y exportar, y mucho más desde cero, dale un vistazo a mi libro <a href="https://modernjavascript.yogeshchavan.dev/"><em>Mastering Modern JavaScript</em></a>. Este libro cubre todo lo necesario para aprender React y ayudarte a mejorar tanto en JavaScript como en React.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/92ab4961521a20180285b6fdf5179b6d17fbcdff/freecodecamp_image.jpeg" class="kg-image" alt="Mastering Modern JavaScript" width="600" height="400" loading="lazy"></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo hacer un menú desplegable con JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Si usas internet, es probable que ya hayas te hayas cruzado con un menú desplegable. Los menús desplegables tienen dos usos: recolectar la información ingresada por el usuario en los formularios web e implementar menús de acciones o navegación en aplicaciones web. Los menús desplegables son una de las mejores ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-hacer-un-menu-desplegable/</link>
                <guid isPermaLink="false">66913863b99552046f705ccc</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Mon, 29 Jul 2024 21:03:50 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/07/how-to-build-a-dropdown-menu-with-javascript.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-build-a-dropdown-menu-with-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build a Dropdown Menu with JavaScript</a>
      </p><p>Si usas internet, es probable que ya hayas te hayas cruzado con un menú desplegable. Los menús desplegables tienen dos usos: recolectar la información ingresada por el usuario en los formularios web e implementar menús de acciones o navegación en aplicaciones web.</p><p>Los menús desplegables son una de las mejores maneras de ofrecer distintas opciones dentro de una colección de elementos sin comprometer el flujo de una aplicación. Además de aplicaciones web, también se los utiliza en software, sistemas operativos, etc.</p><p>En esta guía, vamos a aprender a hacer un menu desplegable de navegación usando HTML, CSS y JavaScript.</p><p>Al final de esta guía, voy a incluir el archivo de codepen para que puedas jugar con él.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/dropdown-menu-with-css.png" class="kg-image" alt="dropdown-menu-with-css" width="600" height="400" loading="lazy"><figcaption>Resultado final del menú desplegable</figcaption></figure><p>Habiendo cubierto lo fundamental de los menús desplegables, vayamos paso por paso para hacer uno.</p><h2 id="paso-1-agregar-el-markup-para-el-menu-desplegable-"><strong>Paso 1: Agregar el markup para el menu desplegable.</strong></h2><p>Dado que vamos a usar iconos en esta guía, lo primero que debemos hacer es importarlos. Para hacerlo más simple, vamos a usar la librería gratuita, <a href="https://boxicons.com/">Boxicons</a>. Siéntete libre de elegir el ícono que prefieras.</p><p>Si bien hay distintas maneras de instalar Boxicons dentro de nuestro sitio, la manera más simple es la de fijar el script dentro de la etiqueta &nbsp;<code>head</code> de nuestro archivo HTML de este modo:</p><pre><code class="language-html">&lt;head&gt;
   &lt;link 
     href="https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css" 
     rel="stylesheet"
    /&gt;
 &lt;/head&gt;</code></pre><p>Una vez que importamos los íconos, creamos un elemento <code>div</code> con la clase <code>container</code>. Este elemento contendrá otro elemento llamado <code>button</code> y el menú desplegable. </p><p>Dentro de este contenedor, creamos el elemento <code>button</code> y le damos la clase y el id <code>btn</code>. &nbsp;Al botón le vamos a agregar el texto y el ícono de una flecha.</p><p>Este es el código para el botón:</p><pre><code class="language-html">&lt;button class="btn" id="btn"&gt;
  Dropdown
  &lt;i class="bx bx-chevron-down" id="arrow"&gt;&lt;/i&gt;
&lt;/button&gt;</code></pre><p>Luego, vamos a agregar el código del menú desplegable propiamente dicho. Debajo de la etiqueta<code>button</code>, vamos a crear un elemento <code>div</code> con la clase y el id <code>dropdown</code>. Dentro del elemento div, creamos una etiqueta <code>a</code> para cada elemento del menú, con su texto e ícono respectivo.</p><p>Así es cómo debería verse el código:</p><pre><code class="language-html">&lt;div class="dropdown" id="dropdown"&gt;
  &lt;a href="#create"&gt;
    &lt;i class="bx bx-plus-circle"&gt;&lt;/i&gt;
    Create New
  &lt;/a&gt;
  &lt;a href="#draft"&gt;
    &lt;i class="bx bx-book"&gt;&lt;/i&gt;
    All Drafts
  &lt;/a&gt;
  &lt;a href="#move"&gt;
    &lt;i class="bx bx-folder"&gt;&lt;/i&gt;
    Move To
  &lt;/a&gt;
  &lt;a href="#profile"&gt;
    &lt;i class="bx bx-user"&gt;&lt;/i&gt;
    Profile Settings
  &lt;/a&gt;
  &lt;a href="#notification"&gt;
    &lt;i class="bx bx-bell"&gt;&lt;/i&gt;
    Notification
  &lt;/a&gt;
  &lt;a href="#settings"&gt;
    &lt;i class="bx bx-cog"&gt;&lt;/i&gt;
    Settings
  &lt;/a&gt;
&lt;/div&gt;</code></pre><p>Y este es el resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/dropdown-menu-markup.png" class="kg-image" alt="dropdown-menu-markup" width="600" height="400" loading="lazy"><figcaption>Resultado del código del menú desplegable</figcaption></figure><p>Todavía no luce bien, así que vamos a darle estilos al menú.</p><h2 id="paso-2-d-ndole-estilos-al-men-desplegable"><strong>Paso 2: Dándole estilos al menú desplegable</strong></h2><p>Primero vamos a resetear los márgenes y el padding de cada elemento de la página y guardar alguno de los valores en variables reusables para poder utilizarlos en nuestro archivo CSS. Luego, le daremos al elemento body un estilo global.</p><pre><code class="language-css">@import url(https://fonts.googleapis.com/css?family=Inter:100,200,300,regular,500,600,700,800,900);

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Inter", sans-serif;
  --shadow: rgba(0, 0, 0, 0.05) 0px 6px 10px 0px,
    rgba(0, 0, 0, 0.1) 0px 0px 0px 1px;
  --color: #166e67;
  --gap: 0.5rem;
  --radius: 5px;
}

body {
  margin: 2rem;
  background-color: #b3e6f4;
  font-size: 0.9rem;
  color: black;
}</code></pre><p>El próximo paso es darle estilo al botón y al contenedor del menú desplegable. Para agilizar las cosas, solo voy a explicar lo más importante sobre cómo dar estilo.<br><br>Copia este código y pégalo en tu archivo CSS:</p><pre><code class="language-css">.btn {
  background-color: white;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  column-gap: var(--gap);
  padding: 0.6rem;
  cursor: pointer;
  border-radius: var(--radius);
  border: none;
  box-shadow: var(--shadow);
  position: relative;
}

.bx {
  font-size: 1.1rem;
}

.dropdown {
  position: absolute;
  width: 250px;
  box-shadow: var(--shadow);
  border-radius: var(--radius);
  margin-top: 0.3rem;
  background: white;
}

.dropdown a {
  display: flex;
  align-items: center;
  column-gap: var(--gap);
  padding: 0.8rem 1rem;
  text-decoration: none;
  color: black;
}

.dropdown a:hover {
  background-color: var(--color);
  color: white;
}</code></pre><p>Dado que los menús desplegables suelen ubicarse por sobre los elementos, el botón tiene posición relative y el menú desplegable, absolute. Esto permite que ambos elementos estén cerca uno del otro y que el menú desplegable se ubicará por arriba de otros elementos. De esta manera, al desplegarlo, no afectará el flujo de la página.</p><p>Este es el resultado:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/11/dropdown-menu-with-css.png" class="kg-image" alt="dropdown-menu-with-css" width="600" height="400" loading="lazy"><figcaption>Dropdown menu styling&nbsp;</figcaption></figure><p>Ahora que ya le dimos estilo al menú desplegable, queremos que solo aparezca al apretar un botón en vez de hacerlo cuando pasamos con el puntero sobre él. </p><p>En un artículo anterior que escribí sobre <a href="https://freecodecamp.org/news/how-to-build-a-modal-with-javascript">cómo hacer un modal con JavaScript</a> [en inglés], usé <code>display: none</code> para inicialmente ocultar el elemento modal de la pantalla. Pero lo malo de utilizar esta propiedad es que, de acuerdo con <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties">MDN Docs</a> [en inglés], la propiedad no es animable.</p><p>Por esto, en esta guía usaremos una manera distinta para ocultar el menú desplegable. Esto lo haremos combinando las propiedades <code>visibility</code> y <code>opacity</code>. Esta es la manera que <a href="https://github.com/">GitHub</a> utiliza para ocultar sus menús desplegables.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/11/github-dropdown-menu.png" class="kg-image" alt="github-dropdown-menu" width="600" height="400" loading="lazy"><figcaption>Menú desplegable en GitHub</figcaption></figure><p>Dentro de la clase <code>dropdown</code> que creamos anteriormente, agregamos la propiedad <code>visibility </code> con el valor hidden y la opacidad establecida en 0. Al hacer esto, el menú desplegable aparecerá escondido al cargar la página.</p><p>Para mostrar el modal, &nbsp;vamos a crear una clase separada llamada <code>show</code>. Esta clase va a tener la propiedad <code>visibility </code> con el valor visible y una opacidad de 1. A esta clase la vamos a insertar usando JavaScript.</p><p>Este es el código:</p><pre><code class="language-css">.dropdown {
  position: absolute;
  width: 250px;
  box-shadow: var(--shadow);
  border-radius: var(--radius);
  margin-top: 0.3rem;
  background: white;
  transition: all 0.1s cubic-bezier(0.16, 1, 0.5, 1);
    
  transform: translateY(0.5rem);
  visibility: hidden;
  opacity: 0;
}

.show {
  transform: translateY(0rem);
  visibility: visible;
  opacity: 1;
}

.arrow {
  transform: rotate(180deg);
  transition: 0.2s ease;
}</code></pre><p>Sumado al código para ocultar el elemento modal, añadimos otra clase para rotar el icono de flecha cuando se aprieta el botón del menú.</p><h2 id="paso-3-agregando-funcionalidad-al-men-desplegable"><strong>Paso 3: Agregando funcionalidad al menú desplegable</strong></h2><p>Primero, vamos a guardar los distintos elementos en variables para poder reutilizarlos.</p><pre><code class="language-js">const dropdownBtn = document.getElementById("btn");
const dropdownMenu = document.getElementById("dropdown");
const toggleArrow = document.getElementById("arrow");</code></pre><p>El próximo paso es crear una función para insertar la clase <code>show</code> del elemento desplegable y rotar la flecha del menú al apretar el botón. A esta función la llamaremos <code>toggleDropdown</code>. </p><pre><code class="language-js">const toggleDropdown = function () {
  dropdownMenu.classList.toggle("show");
  toggleArrow.classList.toggle("arrow");
};</code></pre><p>Luego vamos a agregar esta función en el botón del menú desplegable con el método <code>addEventListener</code> para que cada vez que el botón se apriete, active la función que controla que el menú desplegable se oculte o despliegue. </p><pre><code class="language-js">dropdownBtn.addEventListener("click", function (e) {
  e.stopPropagation();
  toggleDropdown();
});</code></pre><p>Si no te diste cuenta, añadimos ell método <code>stopPropagation()</code>dentro de la función del menú desplegable. Esto hace que la función del elemento botón no la herede el elemento padre y se ejecute dos veces. Esto lo entenderás más en la próxima sección.</p><p>Este es el resultado:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/11/toggle-dropdown-menu-.gif" class="kg-image" alt="toggle-dropdown-menu-" width="600" height="400" loading="lazy"><figcaption>Despliegue del menú</figcaption></figure><h2 id="c-mo-cerrar-un-men-desplegable-cuando-un-elemento-del-dom-se-aprieta"><strong>Cómo cerrar un menú desplegable cuando un elemento del DOM se aprieta</strong></h2><p>Es posible cerrar un menú desplegable de cuatro formas distintas:</p><ul><li>Al apretar el botón que lo activa</li><li>Al hacer clic sobre cualquiera de sus elementos individuales</li><li>Al hacer clic fuera del menú (en el body de la página)</li><li>Al apretar el botón Escape o el botón de flecha hacia abajo del teclado.</li></ul><p>Pero en esta guía nos vamos a concentrar en los primeros tres.</p><p>Primero, vamos a seleccionar el elemento raíz <code>&lt;html&gt;</code> con <code>document.documentElement</code>. Y como hicimos anteriormente, vamos a insertar la función <code>toggleDropdown()</code> dentro de él.</p><p>Pero esta vez queremos poner una condición que chequee si el menú desplegable contiene o no la clase <code>show</code>. Solo cuando la tenga vamos a querer que se active la función para ocultar el menú.</p><pre><code class="language-js">document.documentElement.addEventListener("click", function () {
  if (dropdownMenu.classList.contains("show")) {
    toggleDropdown();
  }
});</code></pre><p>Este es el resultado final:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/close-dropdown-when-dom-element-is-clicked.gif" class="kg-image" alt="close-dropdown-when-dom-element-is-clicked" width="600" height="400" loading="lazy"><figcaption>Menú desplegable cerrado cuando se hace clic sobre un elemento del DOM</figcaption></figure><p>Y así es como se hace un menú desplegable con JavaScript. Abajo está el archivo de codepen para ver el menú desplegable en acción.</p><figure class="kg-card kg-embed-card"><iframe height="400" scrolling="no" title="Dropdown menu" src="https://codepen.io/evavic44/embed/eYKQJjJ?default-tab=html%2Cresult&amp;theme-id=light" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; width: 720px;"></iframe></figure><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Espero, de corazón, que este post te haya resultado útil o interesante. Si fue así, te pido que lo compartas con tus amigos o suscríbete a mi blog así no te pierdes ningún post. Gracias por leer.</p><p><a href="https://github.com/evavic44">GitHub</a> | <a href="https://twitter.com/victorekea">Twitter</a> | <a href="https://eke.hashnode.dev/">Blog</a> | <a href="https://victoreke.com/">Portfolio</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo usar LocalStorage en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ En estos tiempos del desarrollo web, tener una forma de que la información persista ayuda a que los desarrolladores puedan mejorar el rendimiento y de esta manera crear una mejor experiencia de usuario. Y usar el local storage es una manera eficaz de que la información persista en una aplicación. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-localstorage-en-javascript/</link>
                <guid isPermaLink="false">6615d2b10c8ae40402184556</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Tue, 07 May 2024 15:28:19 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/05/JavaScript-localStorage-freeCodeCamp-Benjamin-Semah.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/use-local-storage-in-modern-applications/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use LocalStorage in JavaScript</a>
      </p><p>En estos tiempos del desarrollo web, tener una forma de que la información persista ayuda a que los desarrolladores puedan mejorar el rendimiento y de esta manera crear una mejor experiencia de usuario. Y usar el <em>local storage </em>es una manera eficaz de que la información persista en una aplicación.</p><p>En este artículo, vas a aprender que es el <em>local storage</em> y como usarlo en aplicaciones web modernas. También aprenderás tanto las ventajas de usarlo, como sus desventajas.</p><h2 id="contenidos"><strong>Contenidos</strong></h2><ul><li>¿<a href="#que-es">Qué es el <em>Local Storage</em>?</a></li><li><a href="#diferencias">Diferencias entre <em>Local Storage</em> y <em>Session Storage</em></a></li><li> <a href="#como-usar">Cómo usar el <em>Local Storage</em></a></li><li><a href="#ejemplo">Un ejemplo práctico</a></li><li><a href="#devtools">Cómo ver el <em>Local Storage</em> con DevTools</a></li><li><a href="#beneficios">Beneficios de usar el <em>Local Storage</em></a></li><li><a href="#limitaciones">Limitaciones del<em> Local Storage</em></a></li><li> <a href="#conclusion">Conclusión</a></li></ul><!--kg-card-begin: html--><h2 id="que-es">¿Qué es el Local Storage?</h2><!--kg-card-end: html--><p>El <em>local storage </em>es una funcionalidad de los navegadores que permite a los desarrolladores guardar información en el navegador del usuario. Es parte de <em>Web Storage API</em> [API de Almacenamiento Web] junto a <em>session storage</em>.</p><p>El l<em>ocal storage</em> funciona tomando información en formato de pares clave-valor y la conserva aun cuando el usuario actualiza la página o cierra la pestaña o el navegador.</p><!--kg-card-begin: html--><h2 id="diferencias">Diferencias entre Local Storage y Session Storage</h2><!--kg-card-end: html--><p>Como mencioné anteriormente, <em>Web Storage API</em> provee a los navegadores actuales de dos funcionalidades importantes para almacenamiento de información: <em>local storage </em>y <em>session storage.</em></p><p>Las principales diferencias entre ambos son la persistencia de la información almacenada y su alcance. <br><br>En el <em>local storage</em> la información permanece disponible aun cuando la pestaña o la ventana del navegador se cierra, pero la borra cuando la información está almacenada en <em>session storage.</em></p><p>Además, es posible acceder a la información almacenada en el <em>local storage</em> desde múltiples pestañas o ventanas del navegador, mientras que solo se puede acceder a la información almacenada en<em> session storage </em>desde pestañas o ventanas específicas del navegador porque no se comparte.</p><!--kg-card-begin: html--><h2 id="como-usar">Cómo usar el Local Storage</h2><!--kg-card-end: html--><p>El objeto <em>local storage</em> viene con varios métodos diferentes para poder interactuar con él. Con estos métodos es posible agregar, leer, y borrar información ubicada en el l<em>ocal storage</em>.</p><h3 id="c-mo-almacenar-informaci-n-en-el-local-storage"><strong>Cómo almacenar información en el<em> Local Storage</em></strong></h3><p>Para almacenar información en el <em>local storage, </em>se usa en el método <code>setItem()</code>. Este método lleva dos argumentos, un clave y un valor.</p><pre><code class="language-javascript">localStorage.setItem(key, value)</code></pre><p>Si la clave no existe en el local storage, el método <code>setItem()</code> va a crear una nueva clave y asignarle el valor dado. Pero si en el <em>local storage</em> ya existe una clave con el mismo nombre, el valor va a ser reemplazado con el nuevo valor.</p><h3 id="c-mo-leer-informaci-n-almacenada-en-el-local-storage"><strong>Cómo leer información almacenada en el <em>Local Storage</em></strong></h3><p>Para recuperar y usar la información del local storage, puedes utilizar el método <code>getItem()</code>. Este método lleva una clave como argumento.</p><pre><code class="language-javascript">localStorage.getItem(key)</code></pre><p>Si la clave existe en el local storage, el método devuelve el valor de esa clave. Caso contrario, devuelve <code>null</code></p><h3 id="c-mo-almacenar-y-leer-valores-de-informaci-n-complejos-en-el-local-storage"><strong>Cómo almacenar y leer valores de información complejos en el </strong><em><strong>Local Storage</strong></em></h3><p>El<em> local storage</em> solo puede almacenar cadenas de texto. Esto significa que si necesitas almacenar valores como objetos o <em>arrays,</em> lo primero que tienes que hacer es transformar ese valor en una cadena de texto. Esto lo puedes hacer usando el método JSON.stringify().</p><p>Ejemplo:</p><pre><code class="language-javascript">const userObj = {
  username = "Maria",
  email: "maria@mail.com"
}

localStorage.setItem('user', JSON.stringify(userObj))
</code></pre><p>El método JSON.stringify() convierte al objeto <code>userObj</code> en una cadena de texto antes de enviarlo al l<em>ocal storage.</em></p><p>Si quisieras acceder a la información del <em>local storage</em>, es necesario devolverla a su forma original. Esto lo haces usando el método <code>JSON.parse()</code></p><p>Ejemplo:</p><pre><code class="language-javascript">const storedUserData = localStorage.getItem('user')

if (storedUserData) {
  const userData = JSON.parse(storedUserData)
  // You can use userData here...
} else {
  console.log('User data not found in local storage')
}</code></pre><p>En el ejemplo de arriba, primero chequeamos si hay información para la clave "user" en <em>local storage </em>antes de usar el método JSON.parse(). Esto es importante porque si esa información no existe en el <em>local storage</em>, el método JSON.parse() se aplicará a un valor nulo y que puede resultar en un error.</p><h3 id="c-mo-borrar-informaci-n-del-local-storage"><strong>Cómo borrar información del<em> Local Storage</em></strong></h3><p>Hay dos métodos para borrar información del local storage. Uno es el método <code>removeItem()</code> y el otro es el método <code>clear()</code></p><p>El método <code>removeItem()</code> se utiliza cuando quieres borrar un solo ítem del local storage. El método lleva la clave como argumento y borra el correspondiente par clave-valor del <em>local storage.</em></p><pre><code class="language-javascript">localStorage.removeItem(key)</code></pre><p>Si en vez de borrar un solo par clave-valor quieres borrar toda la información almacenada en el <em>local storage, </em> el local storage tiene un método para eso- el método <code>clear()</code></p><pre><code class="language-javascript">localStorage.clear()</code></pre><p>El método <code>clear()</code>borra todos los pares clave-valor del local storage para el dominio actual.</p><p><strong>Cómo obtener el nombre de una clave en el <em>Local Storage</em></strong></p><p>Si quisieras obtener el nombre de una clave en un índice particular del <em>local storage, </em>puedes usar el método <code>key()</code>. Este método lleva como argumento un número y devuelve el nombre de la clave del índice especificado. </p><p>Ejemplo:</p><pre><code class="language-javascript">localStorage.key(0)</code></pre><p>El ejemplo de arriba devuelve el nombre de la clave del índice cero. Si no hay clave en el índice especificado, el método devuelve null.</p><!--kg-card-begin: html--><h2 id="ejemplo">Un ejemplo práctico</h2><!--kg-card-end: html--><p>El siguiente código muestra la diferencia entre <em>local storage</em> y <em>session storage</em>.</p><p>En este ejemplo, vamos a guardar el nombre del usuario en<em> local storage</em> y la edad en <em>session storage</em></p><pre><code class="language-html">&lt;!-- HTML --&gt; 
&lt;body&gt;

  &lt;h1 class="userName"&gt;&lt;/h1&gt;
  &lt;h2 class="userAge"&gt;&lt;/h2&gt;

  &lt;input type="text" class="name" placeholder="Enter name here"/&gt;
  &lt;button class="saveNameBtn"&gt;Save Name&lt;/button&gt;
  
  &lt;br /&gt;

  &lt;input type="text" class="age" placeholder="Enter age here"/&gt;
  &lt;button class="saveAgeBtn"&gt;Save Age&lt;/button&gt;
  
&lt;/body&gt;</code></pre><p>El código incluye dos elementos header. Uno para <code>userName</code>y el otro para <code>userAge</code>. También incluye dos elementos input para nombre y edad, asociados a un botón que vamos a usar para guardar la información.</p><p>Usemos el método <code>querySelector</code> para seleccionar los distintos elementos.</p><pre><code class="language-javascript">const userNameText = document.querySelector(".userName")
const userAgeText = document.querySelector(".userAge")

const saveNameButton = document.querySelector(".saveNameBtn")
const saveAgeButton = document.querySelector(".saveAgeBtn")</code></pre><h3 id="ejemplo-de-c-digo-para-local-storage"><strong>Ejemplo de código para <em>Local Storage</em></strong></h3><pre><code class="language-javascript">saveNameButton.addEventListener("click", () =&gt; {
  const userName = document.querySelector(".name").value
  userNameText.textContent = userName
  localStorage.setItem("name", userName)
})</code></pre><p>Primero, obtenemos el valor nombre del input, lo ponemos como el <code>textContent</code> de <code>userNameText</code> y luego usamos el método <code>setItem()</code> del <em>local storage</em> para guardar el valor de <code>userName</code> en el <em>local storage.</em></p><p>Ahora veamos cómo podemos obtener el valor nombre del <em>local storage</em> cuando lo necesitamos. </p><pre><code class="language-javascript">function displayUserName () {
  const nameFromLocalStorage = localStorage.getItem("name")

  if (nameFromLocalStorage) {
    userNameText.textContent = nameFromLocalStorage
  } else {
    userNameText.textContent = "No name data in local storage"
  }
}

displayUserName()</code></pre><p>La función <code>displayUserName</code> obtiene el <code>nameFromLocalStorage</code> usando el método `getItem()`. Si el valor existe en el local storage, &nbsp;lo ponemos como el <code>textContent</code> del elemento <code>userNameText</code>. Si es <code>null</code> o no existe, &nbsp;entonces ponemos la cadena de texto "No hay información de nombres en el <em>local storage</em>" como &nbsp;<code>textContent</code>.</p><h3 id="ejemplo-de-c-digo-for-session-storage"><strong>Ejemplo de código for <em>Session Storage</em></strong></h3><p>Ahora, hagamos lo mismo para el valor <code>age</code>. La única diferencia es que vamos a usar <em>session storage </em>en vez de <em>local storage.</em></p><pre><code class="language-javascript">
saveAgeButton.addEventListener("click", () =&gt; {
  const userAge = document.querySelector(".age").value
  userAgeText.textContent = userAge
  sessionStorage.setItem("age", userAge)
})

function displayUserAge () {
  const ageFromSessionStorage = sessionStorage.getItem("age")

  if (ageFromSessionStorage) {
    userAgeText.textContent = ageFromSessionStorage
  } else {
    userAgeText.textContent = "No age data in session storage"
  }
}

displayUserAge()
</code></pre><p>Los métodos <code>setItem</code> y <code>getItem</code> también sirven para <em>session storage</em>.</p><h3 id="demo-"><strong><strong>Demo:</strong></strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/02/demo.gif" class="kg-image" alt="demo" width="600" height="400" loading="lazy"><figcaption>Demo de local storage ysession storage</figcaption></figure><p>Como puedes ver en el demo de arriba, al cerrar y reabrir la página, el valor <code>name</code> persiste en el local storage. Pero el valor <code>age</code> del session storage se borra una vez que la página se cierra. <a href="https://stackblitz.com/edit/vitejs-vite-hb86sa?file=index.html,main.js&amp;terminal=dev">Intentalo tu mismo con el código de ejemplo en StackBlitz</a>.</p><!--kg-card-begin: html--><h2 id="devtools">Cómo ver el Local Storage con DevTools</h2><!--kg-card-end: html--><p>Puedes seguir los pasos de abajo para inspeccionar los contenidos del <em>local storage</em> en las herramientas para desarrolladores de tu navegador.</p><p>Primero, abre las DevTools. Puedes hacer esto haciendo clic derecho sobre la página y seleccionar "Inspeccionar"</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/02/STEP-ONE.gif" class="kg-image" alt="STEP-ONE" width="600" height="400" loading="lazy"><figcaption>Demo de como abrir DevTools</figcaption></figure><p>Después, selecciona la pestaña "Aplicación" del panel de DevTools. De acuerdo con tu navegador, el panel puede tener un nombre diferente. Por ejemplo, en Safari y Firefox se llama "Almacenamiento".</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/02/STEP-TWO.gif" class="kg-image" alt="STEP-TWO" width="600" height="400" loading="lazy"><figcaption>Demo de como abri el panel "Aplicación" en DevTools.</figcaption></figure><p>Busca la sección "Almacenamiento" en la barra del costado que muestra una lista de distintas opciones de almacenamiento web.</p><p>Haz clic en "<em>Local Storage</em>" para expandir y ver su contenido.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/02/STEP-THREE.gif" class="kg-image" alt="STEP-THREE" width="600" height="400" loading="lazy"><figcaption>Demo de como abrir la pestaña de local storage en el panel de almcenamiento.</figcaption></figure><p>Puedes hacer clic en los distintos elementos para ver el par clave-valor correspondiente.</p><!--kg-card-begin: html--><h2 id="beneficios">Beneficios de usar el Local Storage</h2><!--kg-card-end: html--><p>Los siguientes son algunos de los beneficios que tiene el <em>local storage</em> sobre otros mecanismos de almacenamiento que existen en el mundo del desarrollo actual. </p><ol><li><strong>Persistencia de la información</strong>: Al usar el <em>local storage</em>, la información almacenada se mantiene incluso cuando el usuario cierra la pestaña o el navegador. Esto es útil para guardar preferencias de usuario, ajustes y otra información importante porque le que ayuda a que el usuario tenga una experiencia sin fricciones.</li><li><strong>Acceso sin conexión: </strong>Puedes usar el <em>local storage</em> como medio para almacenar información que luego puede ser recuperada aún con internet limitada o sin conexión. Esto hace que sea una herramienta útil para aplicaciones como lectores de noticias, de productividad, y otras, que dependen de almacenar información para posibilitar el uso sin conexión,</li><li><strong>Más capacidad para almacenamiento: </strong>Comparado con otros medios de almacenamiento, el <em>local storage</em> tiene una capacidad relativamente alta. Por ejemplo, las <em>cookies </em>tienen un límite de 4 kilobytes por dominio, pero el<em> local storage</em> puede almacenar hasta 5 megabytes de información por dominio.</li></ol><!--kg-card-begin: html--><h2 id="limitaciones">Limitaciones de usar el Local Storage</h2><!--kg-card-end: html--><ol><li><strong>Almacena solo cadenas de textos:</strong> Como vimos más arriba, el <em>local storage</em> solo almacena cadenas. Si bien puedes usar los métodos <em>JSON</em> <code>stringify</code> y <code>parse</code> para trabajar, muchos desarrolladores prefieren no hacerlo, ya que lleva a escribir bloques complejos de código, difíciles de depurar.</li><li><strong>Seguridad: </strong>La información almacenada en el<em> local storage</em> puede ser susceptible a ataques de vulnerabilidad como el <em>cross-site scripting</em> (XSS). Por eso, debes ser cuidadoso cuando trabajes con información sensible y analizar cuestiones relacionadas con la seguridad. De ser necesario, considera otras alternativas al <em>local storage.</em></li><li><strong>No accesible para usar con <em>web workers</em>: </strong>Al ser el <em>local storage</em> parte del objeto <em>Window,</em> está atado al hilo de ejecución principal del sitio web. Esto significa que no puedes utilizar el <em>local storage</em> si corres scripts en segundo plano como <em>web workers</em>.</li></ol><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>El <em>local storage </em>es una herramienta de los navegadores actuales que les facilita a los desarrolladores web la tarea almacenar y persistir información entre sesiones de navegación.</p><p>Comparado con las<em> cookies</em>, <em>el local storage</em> ofrece mayores capacidades de almacenaje. También, no depende de procesos del lado del servidor, a diferencia de las <em>cookies</em>.</p><p>En este artículo, has aprendido sobre cómo usar el <em>local storage</em>. Vimos como almacenar, recuperar y borrar información del <em>local storage</em>. También has aprendido sobre algunos beneficios de usar el <em>local storage </em>para tu proyecto y algunas de sus limitaciones.</p><p>¡Gracias por leer y feliz codeo! Para más tutoriales en detalle, puedes <a href="https://www.youtube.com/@DevAfterHours">suscribirte a mi canal de YouTube</a>.<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo empezar en el campo del análisis de datos: Guía para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ ¡Hola y bienvenidos al mundo del Análisis de Datos! Si estás pensando en una carrera dentro de este campo, estás en buenas manos. El Análisis de Datos es un campo emocionante y en constante crecimiento, que últimamente está cobrando importancia en nuestro mundo actual impulsado por datos. Seamos sinceros,  actualmente ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-empezar-en-analisis-de-datos-guia-para-principiantes/</link>
                <guid isPermaLink="false">65ecde44e41e0704006c192c</guid>
                
                    <category>
                        <![CDATA[ análisis de datos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Tue, 16 Apr 2024 20:37:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/dataa.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/data-analytics-roadmap/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Get Started in Data Analytics – A Roadmap for Beginners</a>
      </p><p>¡Hola y bienvenidos al mundo del Análisis de Datos! Si estás pensando en una carrera dentro de este campo, estás en buenas manos. El Análisis de Datos es un campo emocionante y en constante crecimiento, que últimamente está cobrando importancia en nuestro mundo actual impulsado por datos.</p><p>Seamos sinceros, &nbsp;actualmente nos estamos ahogando en información. Desde publicaciones de redes sociales a transacciones financieras, pasando hasta por historias clínicas, no hay nada que nos permita hacer un filtro.</p><p>Aquí es donde aparecen los analistas de datos. Ellos son quienes nos ayudan a entender los datos y convertirlos en conocimiento valioso.<br><br>Y ese conocimiento puede ser innovador. Puede ayudar a las empresas a mejorar sus productos y servicios, a los Estados a tomar decisiones informadas sobre políticas, y a las personas a hacer mejores elecciones para su vida personal y profesional.</p><p>Pero no es solamente sobre el impacto. El Análisis de Datos también puede ser bastante lucrativo. De acuerdo con estudios recientes, el sueldo promedio en E.E.U.U es de alrededor de USD 70.000 al año. Y puede ser aún mayor de acuerdo si tenemos en cuenta la experiencia de la persona.</p><p>Por supuesto, como cualquier profesión, el Análisis de Datos tiene sus desafíos. Existe ese conjunto de datos que nos produce dolor de cabeza, la amenaza siempre latente del síndrome del impostor, y los debates infinitos sobre cuál es el mejor lenguaje de programación o herramienta de visualización de datos. Pero, si te gustan los desafíos, este podría ser campo para tí. </p><p>Entonces, si estás tratando de convertirte en un analista de datos, este artículo es para tí. Con suerte, te ahorrará mucho tiempo y esfuerzo para que no desperdicies tu tiempo en aprender cosas irrelevantes como me pasó a mí. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/tenor-1.gif" class="kg-image" alt="tenor-1" width="600" height="400" loading="lazy"></figure><h2 id="paso-1-investiga-el-rol-de-analista-de-datos"><strong>Paso 1: Investiga el rol de Analista de Datos</strong></h2><p>¿Estás pensando en convertirte en analista de datos? ¡Fantástico! Empecemos por comprender de qué se trata el rol antes de continuar. </p><p>Verás, el trabajo de un analista es mucho más que hacer cuentas y crear cuadros (aunque eso también puede ser bastante interesante). El trabajo implica aprovechar la información para encontrar ideas y resolver problemas. Esto significa hacer las preguntas correctas, organizar y evaluar la información y explicar tus conclusiones a otros.</p><p>Algunas de las habilidades básicas y actividades que un analista de datos realiza incluyen:</p><ul><li>Recolectar y analizar grandes grupos de datos para identificar patrones, tendencias, o cualquier otro conocimiento que pueda ayudar a tomar decisiones de negocios informadas.</li><li>Usar herramientas y técnicas de estadística para obtener conocimiento de los datos.</li><li>Desarrollar e implementar de sistemas de recolección de datos y otras estrategias para optimizar la eficiencia y la calidad de los datos.</li><li>Colaborar con otros equipos para identificar necesidades de negocios y desarrollar soluciones usando datos para resolverlas.</li><li>Comunicar las conclusiones a las partes interesadas, de una manera clara y accionable.</li></ul><p>Así que si no eres un prodigio de la matemática o un genio de la computación, no te preocupes. La estadística, la informática y los negocios son sólo algunas de las numerosas disciplinas que se incorporan al tema multidisciplinar del análisis de datos. A quien le guste aprender, resolver problemas y hacer una diferencia puede disfrutar de esta disciplina.</p><p>Entonces, ¿dónde puedes encontrar información adicional sobre lo que hace un analista de datos? Puede empezar por consultar los numerosos recursos gratuitos disponibles en internet.</p><p>Muchos blogs, podcasts y canales de YouTube ofrecen contenido informativo y entretenido sobre el análisis de datos. Voy a dejar abajo algunos canales de YouTube que me han ayudado a lo largo de los años.</p><p>Para obtener una idea de las habilidades y cualidades que requiere el rol, puedes conectar con otros analistas de datos, ir a reuniones o seminarios, y hasta mirar descripciones del puesto.</p><p> No te olvides de tener cuenta si trabajar con datos es algo que disfrutas. ¿Te gusta encontrar patrones y resolver acertijos? ¿Quieres hacer del mundo un lugar mejor? Si la respuesta es sí, entonces el análisis de datos puede ser tu carrera ideal.</p><p>El primer paso en tu camino es entender lo que hace un analista de datos. Disfruta el camino, tomate tu tiempo y no dudes preguntar.</p><h2 id="paso-2-explora-los-requisitos-para-el-rol-de-analista-de-datos"><strong>Paso 2: Explora los requisitos para el rol de Analista de Datos</strong></h2><p>Ahora que ya sabes de qué se trata el rol de analista de datos, es momento de empezar a mirar qué es lo que buscan los empleadores. Al fin y al cabo, querrás asegurarte de que tus habilidades y conocimientos son lo que se necesita en el mercado laboral.</p><p>Pero antes de que empieces a asustarte por no tener demasiada experiencia, tienes que saber que cada empresa es distinta. Algunas priorizan las habilidades de programación, mientras que otras valoran la comunicación y la perspicacia empresarial. Por eso es importante que hagas tu propia investigación para saber qué habilidades y conocimientos específicos están en demanda dentro de tu industria o empresa soñada. </p><p>¿Cómo puedes encontrar esta información? Por ejemplo, un buen lugar es mirar ofertas de empleo y descripciones de puesto en sitios como LinkedIn, Indeed, o Glassdoor. Esto puede ayudarte a darte una idea de los requisitos y conocimientos para distintos roles de analista de datos.</p><p>Algunos ejemplos de lo que una oferta laboral puede incluir son:</p><ul><li>Conocimiento en SQL y experiencia &nbsp;trabajando con grandes conjunto de datos.</li><li>Experiencia en Python y herramientas de visualización de datos como Tableau o Power BI.</li><li>Fuertes habilidades analíticas y capacidad de sacar conclusiones a partir de datos complejos.</li><li>Experiencia en análisis estadístico y técnicas de modelado de datos.</li><li>Excelente habilidad para comunicar conclusiones complejas a audiencias técnicas y no técnicas.</li></ul><p>¡Pero no te detengas ahí! También puedes contactar a personas que estén trabajando en el sector o que tengan puestos que te interesen. Pregúntales sobre su experiencia y qué habilidades, ellos consideran que son las más importantes para ser exitoso en su rol. Quizás hasta quieras tener alguna entrevista para informarte más sobre la industria u obtener consejos sobre cómo empezar.</p><p>Y hablando de empezar, es importante recordar que no hay ningún sustituto para la experiencia práctica. Si bien es tentador pasar horas mirando tutoriales, aprenderás mucho más rápido y de forma efectiva creando cosas y trabajando con proyectos de análisis de datos reales.</p><p>Por eso, tomate tu tiempo para analizar los requisitos de un puesto, pero no te olvides de seguir perfeccionando tus habilidades y obtener experiencia práctica. Con poco esfuerzo, pero mucha curiosidad, estarás en camino de convertirte un analista de datos exitoso.</p><h2 id="paso-3-sentirse-c-modo-con-las-matem-ticas-y-las-estad-sticas"><strong>Paso 3: </strong>Sentirse cómodo con las matemáticas y las estadísticas</h2><p>Ok, sé lo que estás pensando ¿Matemática y Estadística? ¡Oh, no!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/im-out-gif-11-1.gif" class="kg-image" alt="im-out-gif-11-1" width="600" height="400" loading="lazy"></figure><p>Pero escúchame antes de que te vayas corriendo. Para que un analista de datos pueda entender los datos y obtener conclusiones valiosas de ellos, es esencial que tenga un conocimiento básico de estos conceptos.</p><p>¿Qué conceptos básicos y fórmulas estadísticas debes saber?</p><p>Para empezar, hay medidas de tendencia central conocidas como media, mediana y moda, que pueden darte una idea del valor típico en un conjunto de datos. Debes saber cómo calcularlas.</p><p>La desviación típica es una medida que se utiliza para saber cuánto difiere la distribución de los datos de la media, y debes saber cómo calcularla.</p><p>Para poder encontrar relaciones entre variables y generar predicciones basadas en esas asociaciones, también debes estar familiarizado con correlación y regresión.</p><p>Pero no es solamente saber sobre números. También debes tener un conocimiento básico de álgebra lineal, ya que se utiliza en distintas formas de análisis de datos. <a href="https://www.freecodecamp.org/news/linear-algebra-full-course/">Aquí tiene un curso para estudiar a fondo y su libro de texto ,en inglés</a>, para que puedas empezar.</p><p>Quizás necesites matrices para modificar y manipular datos o quizás necesites usar <a href="https://www.freecodecamp.org/news/data-science-with-python-8-ways-to-do-linear-regression-and-measure-their-speed-b5577d75f8b/">regresión lineal (en inglés) </a>para predecir valores futuros basados en tendencias históricas.</p><p>Si no tienes un conocimiento sólido en Matemática, esto puede parecer difícil. ¡Pero no te preocupes! Hay muchos recursos disponibles para ayudarte a aprender.</p><p>Por ejemplo, la Academia Khan ofrece lecciones y ejercicios de práctica de Matemática y Estadística. Si prefieres libros, "Ciencia de Datos para principiantes" ("Data Science for Beginners", en inglés) de Andrew Park es un recurso excelente que explica principios matemáticos y estadísticos de manera accesible.</p><p>freeCodeCamp está desarrollando un programa de Matemática <a href="https://www.freecodecamp.org/news/freecodecamp-foundational-math-curriculum/">sobre el cual puedes leer aquí ,en inglés</a>.</p><p>Y aquí tienes <a href="https://www.freecodecamp.org/news/statistics-for-data-science/">una guía ,en inglés, sobre los conocimientos de Estadística que necesitas saber </a>para entrar al campo de la ciencia de datos y desarrollarte en disciplinas como Machine Learning.</p><p>La clave es empezar de a poco y gradualmente ir ampliando tus conocimientos. No tengas miedo de hacer preguntas o de buscar ayuda cuando lo necesites. Con un poco de práctica y perseverancia, descubrirás que la Matemática y la Estadística son realmente divertidas (¡de en serio!).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/raw.gif" class="kg-image" alt="raw" width="600" height="400" loading="lazy"></figure><h2 id="paso-4-domina-excel-para-analizar-datos"><strong>Paso 4: &nbsp;Domina Excel para analizar datos</strong></h2><p>Excel es una herramienta esencial dentro del arsenal de un analista de datos. Es prácticamente usado por todas las empresas que existen y dominarlo te ayudará a limpiar, manipular y analizar datos fácilmente.</p><p>Con Excel puedes crear fórmulas y funciones que hagan cálculos, tablas dinámicas y cuadros para visualizar datos, y usar herramientas de análisis de datos para hacer predicciones e identificar patrones. Excel es bastante útil para hacer análisis de regresión, predicciones y análisis de escenarios. </p><p>Si realmente quieres convertirte en un analista de datos, es esencial que domines Excel. Por suerte, hay muchos recursos disponibles en línea, en inglés, para que aprendas: <a href="https://www.youtube.com/@excelisfun">ExcelIsFun</a>, <a href="https://www.youtube.com/playlist?list=PLmejDGrsgFyCZ4YC5s8mgdQztj7zt5to5">Excel Chandoo</a>, <a href="https://www.youtube.com/playlist?list=PLWPirh4EWFpEpO6NjjWLbKSCb-wx3hMql">Tutorials Point,</a> <a href="https://www.youtube.com/@AshutoshKumaryt">Ashutosh Kumar</a> , y <a href="https://www.youtube.com/@MyOnlineTrainingHub">MyOnlineTrainingHub</a> en YouTube.</p><p>También estos cursos, en inglés, te ayudarán a sacarle provecho a Excel.</p><ol><li> <a href="https://www.coursera.org/learn/excel-data-analysis?irclickid=WskXxw2EKxyNRBjSCewfUQQZUkARwUz2LzeJ2A0&amp;irgwc=1&amp;utm_medium=partners&amp;utm_source=impact&amp;utm_campaign=1359419&amp;utm_content=b2c">Introducción al Análisis de Datos usando Excel </a>, por Coursera</li><li> <a href="https://www.freecodecamp.org/news/data-analysis-with-python-for-excel-users-course/">Análisis de Datos con Python para usuarios de Excel</a>, en el canal de YouTube de freeCodeCamp</li><li><a href="https://www.coursera.org/specializations/excel?irclickid=WskXxw2EKxyNRBjSCewfUQQZUkARwUQvLzeJ2A0&amp;irgwc=1&amp;utm_medium=partners&amp;utm_source=impact&amp;utm_campaign=1359419&amp;utm_content=b2c">Desarrollo de habilidades en Excel para especialización en negocios</a> ,por Coursera</li><li><a href="https://www.edx.org/course/analyzing-and-visualizing-data-with-excel-2?irclickid=RrSQ3tWpyxyNTDdSXVVnIRUdUkARwR0WLzeJ2A0&amp;utm_source=affiliate&amp;utm_medium=guru99&amp;utm_campaign=Online%20Tracking%20Link_&amp;utm_content=ONLINE_TRACKING_LINK&amp;irgwc=1">Analizando y mostrando datos con Excel</a> por EdX</li></ol><p>Recuerda, Excel es solo una herramienta dentro de tu caja de herramientas para el análisis de datos. Pero es la más importante y la cual usaras diariamente como analista de datos. Al dominar Excel, estarás más que preparado para realizar cualquier tarea relacionada con datos que llegue a tus manos.</p><p>Pasemos a la siguiente habilidad, que también es la más importante que necesitarás como analista de datos.</p><h2 id="paso-5-domina-sql-para-extracci-n-de-datos"><strong>Paso 5: Domina SQL para extracción de datos</strong></h2><p>SQL (por sus siglas en inglés <em>Structured Query Language) </em>es una herramienta importante en el análisis de datos. Como analista de datos, una de tus principales tareas será la de extraer datos de bases de datos y SQL es el lenguaje que se utiliza para hacerlo.</p><p>SQL es más que hacer queries básicas como <em>SELECT, FROM </em>y<em> WHERE</em>. <br>Es un lenguaje complejo que te permite manipular y transformar datos en numerosas maneras. SQL se usa para juntar datos de varias tables, filtrado y agregado de información, además de para crear nuevas tablas y visualizaciones.</p><p>Para ser un analista de datos eficaz, es esencial que domines SQL. Debes poder escribir queries, crear tablas y entender cómo optimizar el desempeño de tus queries. </p><p>Por suerte, hay muchos recursos disponibles para que aprendas SQL. Algunos de los mejores recursos para empezar son <a href="https://www.khanacademy.org/computing/computer-programming/sql/">Khan Academy SQL</a>, W3Schools, <a href="https://sqlzoo.net/wiki/SQL_Tutorial">SQLZoo</a>, <a href="https://sqlbolt.com/">SQLbolt</a>, <a href="https://www.youtube.com/@LukeBarousse">Luke Barousse</a>, <a href="https://www.youtube.com/@AlexTheAnalyst">Alex the Analyst</a>, <a href="https://www.youtube.com/@TheOyinbooke">Microsoft Power Tools</a> y juegos basados en SQL como SQL Island (<a href="https://sql-island.informatik.uni-kl.de/">en alemán, pero está traducido al inglés</a>) y SQL Murder (<a href="https://mystery.knightlab.com/">en inglés</a>)</p><p>Además, hay muchos cursos en línea, en inglés, y libros disponibles para que puedas aprender SQL en detalle. Aquí tienes algunos para que empieces:</p><ol><li><a href="https://www.freecodecamp.org/news/sql-and-databases-full-course/">Aprende SQL y Bases de Datos- Curso completo para principiantes</a></li><li> <a href="https://www.freecodecamp.org/news/learn-sql-free-relational-database-courses-for-beginners/#relational-database-freecodecamp-curriculum">Plan de Estudios sobre Base de Datos Relacionales de freeCodeCamp</a></li><li><a href="https://www.freecodecamp.org/news/learn-sql-free-relational-database-courses-for-beginners/">Colección de cursos gratuitos sobre base de datos relacionales</a></li></ol><p>Al dominar SQL, podrás obtener conocimientos valiosos de bases de datos y manipular datos de manera que ofrezcan valiosos conocimientos de negocio.</p><h2 id="paso-6-aprende-python-para-an-lisis-de-datos"><strong>Paso 6: Aprende Python para Análisis de Datos</strong></h2><p>Es sabido que hay mucha especulación sobre si es necesario que un analista de datos necesita Python -algunos dicen que si mientras otros dicen que no.</p><p>En mi opinión, me gustaría decir que depende de la empresa en la que trabajes - pero saber Python es una ventaja ya que es uno de los lenguajes de programación más usado en el mundo de la ciencia de datos. Python es conocido por su simplicidad, facilidad para leerse y versatilidad, convirtiéndolo en una elección popular entre los analistas de datos.</p><p>Python tiene <a href="https://www.freecodecamp.org/news/python-data-science-course-matplotlib-pandas-numpy/">una gran cantidad de librerías y herramientas</a> que hacen que el Análisis de Datos sea más fácil, como Panda para manipulación de datos y análisis, NumPy para trabajar con arrays, y Matplotlib para visualización de datos. También permite l<a href="https://www.freecodecamp.org/news/python-automation-scripts/">a automatización de tareas</a>, lo que hace al análisis de datos más eficiente y eficaz.Aprender Python para Análisis de Datos es una gran inversión para tu carrera como analista de datos. No solo te permitirá trabajar con librerías poderosas, sino que también te abrirá muchas más oportunidades para trabajar con grandes conjuntos de datos y análisis más complejos.</p><p>Hay muchos recursos disponibles para que aprendas Python, desde cursos gratuitos hasta programas en línea pagos y libros. Algunos recursos disponibles en inglés son <a href="https://www.youtube.com/@freecodecamp">freeCodeCamp</a>, DataCamp, <a href="https://www.youtube.com/@codebasics">CodeBasis</a>, <a href="https://www.youtube.com/@programmingwithmosh">Programming with Mosh</a> and <a href="https://learn.microsoft.com/?wt.mc_id=studentamb_207021">Microsoft Learn.</a></p><p>Al aprender Python, podrás realizar análisis de datos más complejos, automatizar tareas y trabajar con un mayor rango de conjuntos de datos, convirtiéndote en un recurso valioso dentro de cualquier empresa orientada a datos.</p><h2 id="paso-7-domina-una-herramienta-de-visualizaci-n-de-datos"><strong>Paso 7: Domina una herramienta de visualización de datos</strong></h2><p>Como analista de datos, es esencial que puedas comunicar tus conclusiones de manera clara y concisa. Una forma de hacer esto es a través de la visualización de datos. Herramientas de visualización de datos como <a href="https://www.freecodecamp.org/news/python-in-powerbi/">PowerBI </a>y Tableau pueden ayudarte a crear cuadros interactivos, gráficos y tableros de control para que otros entiendan tus conclusiones de manera fácil. Hablaremos sobre ellas dentro de un momento.</p><p>Aquí tienes <a href="https://www.freecodecamp.org/news/tableau-for-data-science-and-data-visualization-crash-course/">un curso, en inglés, de Tableau para análisis de datos y visualización de datos</a> para darle un vistazo.</p><p>Mientras que SQL es bueno para peticionar y manipular datos, no sirve para mostrar completamente tus datos. Y aquí es donde una herramienta de visualización de datos entra en juego. Estas herramientas permiten transformar tus datos en visualizaciones valiosas y fácil de entender que puedes compartir con aquellos interesados. </p><p>Puedes aprender lo básico de la visualización de datos en detalle con<a href="https://www.freecodecamp.org/news/learn-data-visualization-in-this-free-17-hour-course/"> este curso gratuito y en inglés,</a> disponible en el canal de YouTube de freeCodeCamp.</p><p>PowerBI es una gran elección para visualización de datos ya que es fácil de aprender e integrar con otros productos de Microsoft. Esto la convierte en una herramienta ideal para aquellas empresas que usan Microsoft Office. Tableau también es otra elección popular que tiene una gran comunidad de usuarios y con un gran abanico de opciones.</p><p>Aprender un herramienta de visualización de datos como PowerBI o Tableau te permitirá crear visualizaciones atrapantes que te ayudarán a entender mejor tus datos y comunicar las conclusiones a otros. Hay muchos cursos en línea y tutoriales disponibles que te ayudarán a aprender estas herramientas, como el curso de capacitación oficial de <a href="https://learn.microsoft.com/es-es/training/powerplatform/power-bi">Microsoft PowerBI</a> y los <a href="https://trailheadacademy.salesforce.com/es-mx/classes/TVA101-Tableau-Visual-Analytics">cursos de capacitación de Tableau</a></p><p>Al dominar una herramienta de visualización de datos, podrás aprender a crear visualizaciones atrapante e interactivas que te permitan entender mejor tus datos y comunicar las conclusiones a otros, convirtiéndote en un recurso valioso para cualquier empresa orientada a datos.</p><p>También puedes sumergirte en aprender otras herramientas de visualización de datos como D3.js- <a href="https://www.freecodecamp.org/news/data-visualization-using-d3-course/">Aquí tienes un curso para empezar</a>, en inglés.</p><h2 id="paso-8-conecta-con-otros-analistas-de-datos-y-desarrolladores-"><strong>Paso 8: Conecta con otros Analistas de Datos y Desarrolladores.</strong></h2><p>Relacionarse con otros es una parte esencial de cualquier profesión y el campo del Análisis de Datos no es la excepción. Al conectar con otros analistas de datos y desarrolladores, podrás aprender de sus experiencias, obtener información clave sobre las últimas tecnologías y tendencias dentro de la industria y hasta quizás encontrar oportunidades de trabajo.</p><p>Aquí tienes distintas formas de conectar con otros dentro de este campo:</p><p> 1. Asiste a eventos de la industria: Busca conferencias, encuentros y cualquier otro evento relacionado con el análisis de datos y asiste a ellos. Es una gran forma de conocer a otras personas dentro del campo y aprender sobre nuevos avances y tecnologías.</p><p> 2. Únete a comunidades online: Existen muchas comunidades online para analista de datos y desarrolladores como foros, grupos de LinkedIn y en redes sociales. Únete a ellos y participa en las conversaciones para conectar con otros profesionales.</p><p>3. Habla con otros profesionales: No temas contactar a otros analistas de datos y desarrolladores a través de sus redes sociales, correo electrónico o en persona si los ves en algún evento. Preséntate, pide consejos y construye amistades.</p><p>Recuerda que al conectar con otros, tú también debes estar abierto a ofrecer ayuda o dar consejos. Al crear una red de contactos fuerte dentro del campo del Análisis de Datos, puedes potenciar tus oportunidades laborales, además de estar al día con las últimas tecnologías y tendencias dentro de la industria.</p><h2 id="paso-9-no-te-olvides-de-las-habilidades-blandas"><strong>Paso 9: No te olvides de las "habilidades blandas"</strong></h2><p>Una habilidad final que creo que debes trabajar antes de convertirte en un gran analista de datos son tus habilidades blandas. Esto incluye tus habilidades para comunicarte, resolver problemas, etc.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/Analyst.jpeg" class="kg-image" alt="Analyst" width="600" height="400" loading="lazy"></figure><p>Una vez que lo hagas, haz proyectos y no dejes de practicar.</p><h2 id="conclusi-n-"><strong>Conclusión.</strong></h2><p>Convertirte en un analista de datos, requiere dedicación, trabajo duro y ser apasionado por el Análisis de Datos. Si sigues los pasos que fui detallando en esta guía, conseguirás el conocimiento y las habilidades necesarias para convertirte en un analista de datos exitoso.</p><p>Desde entender el rol de analista de datos, hasta dominar SQL y Python, pasando por conectar con otros desarrolladores, cada paso es esencial para alcanzar el éxito en este campo.</p><p>Recuerda ser curioso, no dejar de aprender y siempre ser flexible para adaptarse a nuevas tecnologías y metodologías. Con determinación y persistencia, podrás convertirte en un analista de datos competente y desbloquear un mundo de excitantes oportunidades laborales.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Texto Tachado en Google Docs- Cómo tachar texto en Google Docs ]]>
                </title>
                <description>
                    <![CDATA[ Cuando escribimos, a veces queremos tachar un texto en particular. Esto significa hacer una línea horizontal sobre un texto. ‌‌Así es como luce: Eres una persona genial. El texto tachado se usa en diversas situaciones:  * Para indicar que una porción o bloque de texto debe ser borrado.  ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/google-docs-strikethrough-how-to-cross-out-text-in-google-docs/</link>
                <guid isPermaLink="false">65c5740e85c7c103ecb57c09</guid>
                
                    <category>
                        <![CDATA[ google docs ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Wed, 14 Feb 2024 19:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/02/siriwan-arunsiriwattana-gs0coXLmjdI-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Cuando escribimos, a veces queremos tachar un texto en particular. Esto significa hacer una línea horizontal sobre un texto. ‌‌Así es como luce: <s>Eres una persona genial</s>.</p><p>El texto tachado se usa en diversas situaciones:</p><ul><li>Para indicar que una porción o bloque de texto debe ser borrado.</li><li>Para indicar que una porción o bloque de texto está desactualizado.</li><li>Para mostrar que una tarea fue realizado, sobre todo en listas de tareas.</li><li>Para transmitir un mensaje gracioso o sin relación con lo que se está escribiendo, etc.</li></ul><p>En este artículo, vamos a ver cómo tachar texto cuando usamos Google Docs.</p><h2 id="c-mo-hacer-texto-tachado-en-google-docs"><strong>Cómo hacer texto tachado en Google Docs</strong></h2><p>Existen dos métodos para tachar texto en Google Docs – usar un atajo de teclado o usar la opción de tachado del menú Formato en la barra de menús de Google Docs.</p><h3 id="c-mo-tachar-un-texto-en-google-docs-usando-un-atajo-de-teclado">Cómo<strong> tachar un texto en Google Docs usando un atajo de teclado</strong></h3><p>Estos son los pasos a seguir si usamos un atajo de teclado para tachar un texto en Google Docs:</p><ul><li>Abrir <a href="https://docs.google.com/">Google Docs</a> y crea un documento nuevo.</li><li>Escribe algo de texto en tu documento.</li><li>Selecciona el texto que has escrito.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-4.png" class="kg-image" alt="image-4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/image-4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/image-4.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-4.png 1360w" sizes="(min-width: 720px) 720px" width="1360" height="657" loading="lazy"></figure><p></p><ul><li>En Windows, presiona <code>Alt</code> + <code>Shift</code> + <code>5</code>.</li><li>En Mac, presiona <code>⌘</code> + <code>Shift</code> + <code>X</code>.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-5.png" class="kg-image" alt="image-5" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/image-5.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/image-5.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-5.png 1360w" sizes="(min-width: 720px) 720px" width="1360" height="657" loading="lazy"></figure><p> Y ahí lo tienes, hemos usado un atajo de teclado para tachar texto en Google Docs.</p><h3 id="c-mo-tachar-texto-en-google-docs-usando-el-men-de-formato-"><strong>Cómo tachar texto en Google Docs usando el menú de Formato.</strong></h3><p>En esta sección, veremos cómo podemos tachar texto en Google Docs usando la opción de Formato. Aquí están los pasos: </p><ul><li>Abrir <a href="https://docs.google.com/">Google Docs</a> y crea un documento nuevo.</li><li>Escribe algo de texto en tu documento</li><li>Selecciona el texto que has escrito.</li><li>Haz clic en el menú <code>Formato</code> en la barra de menús.</li><li>Haz clic en <code>Texto</code>.</li><li>Haz clic en la opción <code>Tachar</code>.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-6.png" class="kg-image" alt="image-6" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/02/image-6.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/02/image-6.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/02/image-6.png 1360w" sizes="(min-width: 720px) 720px" width="1360" height="645" loading="lazy"></figure><p>Después de hacer esto, tu texto debería estar tachado.</p><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>En este artículo, hemos hablado sobre los textos tachados en la escritura, sus usos y cómo tachar texto en Google Docs.</p><p><s>¡Muchas gracias por leer!</s> Enserio ¡muchas gracias por leer! :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo consumir REST APIs en React: Guía para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ React es una librería popular de Front-end que los desarrolladores usan para crear aplicaciones. Si quieres crear aplicaciones listas para poner en producción seguramente vas a necesitar saber integrar APIs a tu aplicación de React en algún momento de tu carrera. Cada desarrollador que quiera construir aplicaciones web robustas y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-consumir-rest-apis-en-react-guia-para-principiantes/</link>
                <guid isPermaLink="false">6565bacab9adab03e4e55c21</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                    <category>
                        <![CDATA[ api rest ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Wed, 17 Jan 2024 18:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/01/cover-template-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-consume-rest-apis-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Consume REST APIs in React – a Beginner's Guide</a>
      </p><p>React es una librería popular de Front-end que los desarrolladores usan para crear aplicaciones. Si quieres crear aplicaciones listas para poner en producción seguramente vas a necesitar saber integrar APIs a tu aplicación de React en algún momento de tu carrera.</p><p>Cada desarrollador que quiera construir aplicaciones web robustas y modernas con React tiene que saber cómo consumir APIs para traer información a su aplicación de React.</p><p>En esta guía para principiantes, vamos a aprender como consumir una API RESTful en React trayendo, borrando o agregando información. &nbsp;También veremos dos formas de consumir APIs RESTful y cómo usarla con React Hooks.</p><h3 id="aqu-tienes-un-scrim-interactivo-sobre-c-mo-consumir-apis-rest-en-react-"><strong>Aquí tienes un scrim interactivo sobre cómo consumir APIs REST en React:</strong></h3><figure class="kg-card kg-embed-card"><iframe src="https://scrimba.com/scrim/coc6f42838bab19b28a86cca1?embed=freecodecamp,mini-header" width="100%" height="480" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: Lato, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></iframe></figure><h2 id="-qu-es-una-api-rest"><strong>¿Qué es una API REST?</strong></h2><p> Si alguna vez haz pasado tiempo programando o investigando sobre programación, seguramente te haz cruzado con el término "API".</p><p>API significa "Interfaz de Programación de Aplicación", por sus siglas en inglés. Es un medio que permite la comunicación programática entre diferentes aplicaciones y que devuelve una respuesta en tiempo real.</p><p>En los 2000, Roy Fielding definió el concepto REST como un estilo de arquitectura y metodología usado frecuentemente en el desarrollo de servicios de internet, como, por ejemplo, los sistemas de hipermedia distribuidos. Es un acrónimo que significa, en inglés, Transferencia de Estado Representacional.</p><p>Cuando se hace una petición a través de una API REST, ésta envía, al peticionante o a un endpoint, una representación del estado actual del recurso. Esta representación del estado puede tomar la forma de archivo JSON (JavaScript Object Notation), XML, o HTML.</p><p>JSON es el formato de archivo más usado porque no depende de ningún lenguaje de programación y puede ser leído tanto por personas como por computadoras.</p><p><strong>Por ejemplo:</strong></p><pre><code class="language-json">[
   {
      "userId": 1,
      "id": 1,
      "title": "sunt excepturi",
      "body": "quia et suscipit\nsuscipit recusandae consequuntur "
   },
   {
      "userId": 1,
      "id": 2,
      "title": "qui est esse",
      "body": "est rerum tempore vitae\nsequi sint nihil"
   }
]</code></pre><h2 id="c-mo-consumir-apis-rest-en-react"><strong>Cómo consumir APIs REST en React</strong></h2><p>Es posible consumir APIs REST dentro de una aplicación React de distintas maneras, pero en esta guía veremos dos de las formas más populares: Axios (un cliente HTTP basado en promesas) y Fetch API (una API web ya incluida en el navegador).</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> Para poder comprender esta guía en su totalidad, deberías saber JavaScript, React y React Hooks, ya que son conocimientos que vamos a usar aquí.</p><p>Antes de explicar cómo consumir APIs, es importante entender que consumir APIs en React es muy diferente de como se lo hace en JavaScript. Esto es porque estas peticiones ahora se hacen en un componente de React.</p><p>En nuestro caso, vamos a usar componentes funcionales, lo que significa que vamos a necesitar 2 Hooks de React importantes:</p><ul><li><strong>Hook <strong>useEffect:</strong></strong> En React, las peticiones a las API se hacen dentro del hook <code>useEffect()</code>. El hook muestra la información cuando la aplicación es montada o después de se alcanza un estado específico. Esta es la sintaxis general que vamos a usar:</li></ul><pre><code>useEffect(() =&gt; {
    // data fetching here
}, []);
</code></pre><ul><li><strong>Hook <strong>useState:</strong></strong> Al pedir información, debemos crear un estado en el cual se va a guardar el resultado de la petición. También lo podemos guardar en un herramienta de administración de estado como Redux o en un objeto de contexto. Para hacerlo más simple, vamos a guardar el resultado de la petición en el estado local de React.</li></ul><pre><code>const [posts, setPosts] = useState([]);
</code></pre><p>Vamos a meternos en la parte jugosa de esta guía, donde aprenderemos como obtener, agregar, y borrar información usando la API <a href="https://jsonplaceholder.typicode.com/posts">JSONPlaceholder</a>. Este conocimiento es aplicable a cualquier tipo de API, ya que esta guía está orientada a principiantes.</p><h2 id="c-mo-consumir-apis-con-la-fetch-api"><strong>Cómo consumir APIs con la Fetch API</strong></h2><p>La Fetch API es un método JavaScript para obtener recursos de un servidor o de un endpoint de una API. Como ya viene incluida en el navegador, no es necesario instalar dependencias o paquetes.</p><p>El método <code>fetch()</code> requiere de un argumento obligatorio que es la URL o dirección al recurso que queremos obtener. Luego, este se convierte en una promesa para que podamos manejar su éxito o error a través de los métodos <code>then()</code> y <code>catch()</code>.</p><p>Una petición fetch básica es muy simple de escribir y se parece al código de abajo. Lo que estamos haciendo es simplemente obtener información desde una URL que devuelve esa información como un JSON y luego mostrándola en la consola:</p><pre><code class="language-js">fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
   .then(response =&gt; response.json())
   .then(data =&gt; console.log(data));
</code></pre><p>La respuesta por defecto es una respuesta HTTP estándar más que un JSON, pero podemos ver la información como un objeto JSON al usar el método json() incluida en la respuesta.</p><h3 id="c-mo-realizar-una-petici-n-get-en-react-con-fetch-api"><strong>Cómo realizar una petición GET en React con Fetch API</strong></h3><p>Es posible usar el método HTTP GET para obtener información desde un endpoint.</p><p>Como dijimos antes, Fetch API solo acepta un argumento obligatorio, lo cual es cierto. También acepta un argumento option, el cual es opcional, específicamente cuando se usa el método GET, el cual es el método predeterminado. Pero para los otros métodos como POST y DELETE, es necesario usar el método con un arreglo:</p><pre><code class="language-js">fetch(url, {
    method: "GET" // default, so we can ignore
})
</code></pre><p>Hasta el momento aprendimos cómo funcionan las cosas, ahora vamos a poner todo lo que aprendimos junto y hacer una petición get para obtener información de nuestra API.</p><p>De nuevo, volvemos a usar la<a href="https://jsonplaceholder.typicode.com/posts"> API gratuita JSONPlaceholder</a> para obtener una lista de posts dentro de nuestra aplicación:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';

const App = () =&gt; {
   const [posts, setPosts] = useState([]);
   useEffect(() =&gt; {
      fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
         .then((response) =&gt; response.json())
         .then((data) =&gt; {
            console.log(data);
            setPosts(data);
         })
         .catch((err) =&gt; {
            console.log(err.message);
         });
   }, []);

return (
   // ... consume here
);
};
</code></pre><p>Creamos un estado en el código anterior para guardar la información que obtuvimos de la API así la podemos usar después en nuestra aplicación. También podemos establecer el valor predeterminado a un arreglo vacío.</p><pre><code class="language-js">const [posts, setPosts] = useState([]);
</code></pre><p>Como la parte más importante de <code>then()</code> ocurrió en el hook useState, la información/los posteos se obtienen apenas carga la aplicación. La petición fetch produce una promesa que puede ser aceptada o rechazada:</p><pre><code class="language-js">useEffect(() =&gt; {
   fetch('https://jsonplaceholder.typicode.com/posts?_limit=10').then(
      (response) =&gt; console.log(response)
   );
}, []);
</code></pre><p>Esta respuesta contiene una gran cantidad de información, como el código de estado, texto, y otra información que vamos a necesitar después para manejar los errores. </p><p>Hasta ahora, hemos manejado la resolución de una promesa con <code>.then()</code>, pero nos devolvió un objeto como respuesta que no es lo que queremos. Por esos, necesitamos transformar el objeto respuesta al formato JSON con el método <code>.then()</code>. Esto también nos devuelve una promesa para que podamos obtener la información usando el segundo <code>.then()</code>.</p><pre><code class="language-js">useEffect(() =&gt; {
   fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
      .then((response) =&gt; response.json())
      .then((data) =&gt; {
         console.log(data);
         setPosts(data);
      });
}, []);
</code></pre><p>Si miramos la consola, vamos a ver que obtuvimos 10 posts de nuestra API, lo que también especificamos anteriormente en el estado.</p><p>Esto no está completo porque solamente estuvimos manejando la resolución favorable de la promesa pero no su rechazo, lo cual haremos con el método <code>.catch()</code>:</p><pre><code class="language-js">useEffect(() =&gt; {
   fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
      .then((response) =&gt; response.json())
      .then((data) =&gt; {
         console.log(data);
         setPosts(data);
      })
      .catch((err) =&gt; {
         console.log(err.message);
      });
}, []);
</code></pre><p>Hasta ahora vimos como hacer una petición <code>GET</code>. Esta puede ser consumida dentro de nuestra aplicación, a través de un bucle que recorra nuestro arreglo:</p><pre><code class="language-js">const App = () =&gt; {
// ...

   return (
   &lt;div className="posts-container"&gt;
      {posts.map((post) =&gt; {
         return (
            &lt;div className="post-card" key={post.id}&gt;
               &lt;h2 className="post-title"&gt;{post.title}&lt;/h2&gt;
               &lt;p className="post-body"&gt;{post.body}&lt;/p&gt;
               &lt;div className="button"&gt;
               &lt;div className="delete-btn"&gt;Delete&lt;/div&gt;
               &lt;/div&gt;
            &lt;/div&gt;
         );
      })}
   &lt;/div&gt;
   );
};

export default App;
</code></pre><h3 id="c-mo-realizar-una-petici-n-post-en-react-con-fetch-api"><strong>Cómo realizar una petición POST en React con Fetch API</strong></h3><p>Es posible usar el método HTTP <code>POST</code> para enviar información a un endpoint. Funciona de manera similar a la petición <code>GET</code>, la única diferencia está en que es necesario agregar el método y dos parámetros adicionales al objeto opcional:</p><pre><code class="language-js">const addPosts = async (title, body) =&gt; {
await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
   title: title,
   body: body,
   userId: Math.random().toString(36).slice(2),
}),
headers: {
   'Content-type': 'application/json; charset=UTF-8',
},
})
.then((response) =&gt; response.json())
.then((data) =&gt; {
   setPosts((posts) =&gt; [data, ...posts]);
   setTitle('');
   setBody('');
})
.catch((err) =&gt; {
   console.log(err.message);
});
};
</code></pre><p>Los dos parámetros que pueden parecer extraños son el body (cuerpo) y el header (encabezado).</p><p>En el body va a estar toda la información que queremos enviar a la API, la cual primero debemos convertir en una cadena de texto porque estamos enviando información al navegador. El header nos dice el tipo de información, que es siempre el mismo cuando consumimos APIs REST. También creamos el estado que va a guardar ésta nueva información y distribuir la información restante por el arreglo.</p><p>Si miramos el método <code>addPost()</code> que creamos, va a necesitar que esa información venga de un formulario o de otro lado. En nuestro caso, hice un formulario, obtuve la información mediante estados. Al enviar el formulario, la información es incluida en el método:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';
const App = () =&gt; {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
// ...
const addPosts = async (title, body) =&gt; {
   await fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST',
      body: JSON.stringify({
         title: title,
         body: body,
         userId: Math.random().toString(36).slice(2),
      }),
      headers: {
         'Content-type': 'application/json; charset=UTF-8',
      },
   })
      .then((response) =&gt; response.json())
      .then((data) =&gt; {
         setPosts((posts) =&gt; [data, ...posts]);
         setTitle('');
         setBody('');
      })
      .catch((err) =&gt; {
         console.log(err.message);
      });
};

const handleSubmit = (e) =&gt; {
   e.preventDefault();
   addPosts(title, body);
};    

return (
   &lt;div className="app"&gt;
      &lt;div className="add-post-container"&gt;
         &lt;form onSubmit={handleSubmit}&gt;
            &lt;input type="text" className="form-control" value={title}
               onChange={(e) =&gt; setTitle(e.target.value)}
            /&gt;
            &lt;textarea name="" className="form-control" id="" cols="10" rows="8" 
               value={body} onChange={(e) =&gt; setBody(e.target.value)} 
            &gt;&lt;/textarea&gt;
            &lt;button type="submit"&gt;Add Post&lt;/button&gt;
         &lt;/form&gt;
      &lt;/div&gt;
      {/* ... */}
   &lt;/div&gt;
);
};

export default App;
</code></pre><h3 id="c-mo-realizar-una-petici-n-delete-en-react-con-fetch-api"><strong>Cómo realizar una petición DELETE en React con Fetch API</strong></h3><p>Es posible usar el método HTTP <code>DELETE</code> para eliminar información de un endpoint. También funciona de forma similar a la petición <code>GET</code>, la principal diferencia radica en que tenemos que agregar el método:</p><pre><code class="language-js">const deletePost = async (id) =&gt; {
await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
   method: 'DELETE',
}).then((response) =&gt; {
   if (response.status === 200) {
      setPosts(
         posts.filter((post) =&gt; {
            return post.id !== id;
         })
      );
   } else {
      return;
   }
});
};
</code></pre><p>Este código se dispara al hacer click en el botón. De esta manera, obtenemos el id del post específico en el cual se hizo click. </p><p>Este método hace que se elimine la información del resultado devuelto. Esto permite que la información sea borrada de la API, pero no inmediatamente de la UI y por eso necesitamos agregar un filtro que elimine la información también de ahí. Para cada ítem del bucle, tú botón de borrar debería lucir así:</p><pre><code class="language-js">const App = () =&gt; {
// ...

   return (
   &lt;div className="posts-container"&gt;
      {posts.map((post) =&gt; {
         return (
            &lt;div className="post-card" key={post.id}&gt;
               {/* ... */}
               &lt;div className="button"&gt;
                  &lt;div className="delete-btn" onClick={() =&gt; deletePost(post.id)}&gt;
                     Delete
                  &lt;/div&gt;
               &lt;/div&gt;    
            &lt;/div&gt;
         );
      })}
   &lt;/div&gt;
   );
};

export default App;
</code></pre><h3 id="c-mo-usar-async-await-en-fetch-api"><strong>Cómo usar Async/Await en Fetch API</strong></h3><p>Hasta ahora vimos como hacer peticiones fetch usando la sintaxis de las promesas, que puede ser confusa a veces. Y después, el encadenamiento con <code>.then()</code>. Podemos evitar el encadenamiento usando Async/await y así escribir código más legible.</p><p>Para usar async/awaiy, primero hay que escribir <code>async</code> en la función. Después, al hacer una petición y esperar un respuesta, hay que agregar la sintaxis <code>await</code> delante de la función para esperar a que la promesa devuelva el resultado.</p><p>Cuando usamos async/await, todas las peticiones Fetch se ven así:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';

const App = () =&gt; {
   const [title, setTitle] = useState('');
   const [body, setBody] = useState('');
   const [posts, setPosts] = useState([]);

   // GET with fetch API
   useEffect(() =&gt; {
      const fetchPost = async () =&gt; {
         const response = await fetch(
            'https://jsonplaceholder.typicode.com/posts?_limit=10'
         );
         const data = await response.json();
         console.log(data);
         setPosts(data);
      };
      fetchPost();
   }, []);

   // Delete with fetchAPI
   const deletePost = async (id) =&gt; {
      let response = await fetch(
         `https://jsonplaceholder.typicode.com/posts/${id}`,
         {
            method: 'DELETE',
         }
      );
      if (response.status === 200) {
         setPosts(
            posts.filter((post) =&gt; {
               return post.id !== id;
            })
         );
      } else {
         return;
      }
   };

   // Post with fetchAPI
   const addPosts = async (title, body) =&gt; {
      let response = await fetch('https://jsonplaceholder.typicode.com/posts', {
         method: 'POST',
         body: JSON.stringify({
            title: title,
            body: body,
            userId: Math.random().toString(36).slice(2),
         }),
         headers: {
            'Content-type': 'application/json; charset=UTF-8',
         },
      });
      let data = await response.json();
      setPosts((posts) =&gt; [data, ...posts]);
      setTitle('');
      setBody('');
   };

   const handleSubmit = (e) =&gt; {
      e.preventDefault();
      addPosts(title, body);
   };

   return (
      // ...
   );
};

export default App;
</code></pre><h4 id="aqu-tienes-un-scrim-interactivo-para-guiarte-"><strong>Aquí tienes un scrim interactivo para guiarte:</strong></h4><figure class="kg-card kg-embed-card"><iframe src="https://scrimba.com/scrim/co1af4d8f8db412c467e20af0?embed=freecodecamp,mini-header" width="100%" height="480" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: Lato, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></iframe></figure><h3 id="c-mo-manejar-errores-con-fetch-api"><strong>Cómo manejar errores con Fetch API</strong></h3><p>En esta sección, vamos a ver como manejar error de manera tradicional y con async/await.</p><p>Para manejar los errores con Fetch API, podemos usar la misma información de la respuesta o usar la sentencia try/catch si usamos async/await. </p><p>Primero veamos cómo podemos hacerlo con Fetch API:</p><pre><code class="language-js">const fetchPost = () =&gt; {
fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
   .then((response) =&gt; {
      if (!response.ok) {
         throw Error(response.statusText);
      }
      return response.json();
   })
   .then((data) =&gt; {
      console.log(data);
      setPosts(data);
   })
   .catch((err) =&gt; {
      console.log(err.message);
   });
};
</code></pre><p><a href="https://www.tjvantoll.com/2015/09/13/fetch-and-errors/">Aquí </a>(en inglés) puedes leer más sobre errores en Fetch API.</p><p>Para async/await podemos usar &nbsp;<code>try</code> y <code>catch</code> de esta forma:</p><pre><code class="language-js">const fetchPost = async () =&gt; {
   try {
      const response = await fetch(
         'https://jsonplaceholder.typicode.com/posts?_limit=10'
      );
      const data = await response.json();
      setPosts(data);
   } catch (error) {
      console.log(error);
   }
};
</code></pre><h2 id="c-mo-consumir-apis-con-axios-"><strong>Cómo consumir APIs con Axios:</strong></h2><p>Axios es un &nbsp;cliente HTTP basado en promesas que hace más simple el envío de peticiones HTTP asíncronas a endpoints REST. El endpoint en nuestro caso la API de posts de JSONPlaceholder, a la cual haremos peticiones &nbsp;<code>GET</code>, <code>POST</code>, y <code>DELETE</code>.</p><h4 id="aqu-tienes-un-scrim-interactivo-que-te-guiar-por-los-distintos-pasos-mientras-lees-"><strong>Aquí tienes un scrim interactivo que te guiará por los distintos pasos mientras lees:</strong></h4><figure class="kg-card kg-embed-card"><iframe src="https://scrimba.com/scrim/cob6540b4a1ad315f83abd56d?embed=freecodecamp,mini-header" width="100%" height="480" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: Lato, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></iframe></figure><h3 id="c-mo-instalar-y-configurar-axios"><strong>Cómo instalar y configurar Axios</strong></h3><p>A diferencia de Fetch API, Axios no viene incluido en el navegador por lo que necesitamos instalarlo en nuestro proyecto para poder utilizarlo.</p><p>Para poder instalar Axios en tu proyecto necesitas correr el siguiente comando:</p><pre><code class="language-bash">npm install axios
</code></pre><p>Una vez que lo instalamos correctamente, podemos crear una instancia, lo cual es opcional pero recomendable ya que nos evita repeticiones innecesarias.</p><p>Para crear una instancia, usamos el método <code>.create()</code>, que podemos usarlo para especificar información como la URL y posibles encabezados:</p><pre><code class="language-js">import axios from "axios";

const client = axios.create({
   baseURL: "https://jsonplaceholder.typicode.com/posts" 
});
</code></pre><h3 id="c-mo-realizar-una-petici-n-get-en-react-con-axios"><strong>Cómo realizar una petición GET en React con Axios</strong></h3><p>Usaremos la instancia que creamos anterior para realizar la petición GET. Todo lo que necesitamos es establecer parámetros, si los hay, y obtener la respuesta como un JSON por defecto.</p><p>A diferencia del método Fetch API, no se necesita una option para declarar el método. Solamente agregamos el método a la instancia y hacemos la petición.</p><pre><code class="language-js">useEffect(() =&gt; {
   client.get('?_limit=10').then((response) =&gt; {
      setPosts(response.data);
   });
}, []);
</code></pre><h3 id="c-mo-hacer-una-petici-n-post-en-react-con-axios"><strong>Cómo hacer una petición POST en React con Axios</strong></h3><p>Como dijimos antes, se puede usar el método <code>POST</code> para enviar información a un endpoint. Funciona de manera similar a la petición &nbsp;<code>GET</code>, siendo la principal diferencia el requesito de incluir el método y una option para guardar la información que estamos enviando:</p><pre><code class="language-js">const addPosts = (title, body) =&gt; {
   client
      .post('', {
         title: title,
         body: body,
      })
      .then((response) =&gt; {
         setPosts((posts) =&gt; [response.data, ...posts]);
      });
};
</code></pre><h3 id="c-mo-hacer-una-petici-n-delete-en-react-con-axios"><strong>Cómo hacer una petición DELETE en React con Axios</strong></h3><p>Podemos hacer peticiones delete con el método delete, el cual obtiene el <code>id</code> &nbsp;y lo borra de la API. También usaremos el método filter para borrarlo de la UI, como lo hicimos con el método Fetch API:</p><pre><code class="language-js">const deletePost = (id) =&gt; {
   client.delete(`${id}`);
   setPosts(
      posts.filter((post) =&gt; {
         return post.id !== id;
      })
   );
};
</code></pre><h3 id="c-mo-usar-async-await-en-axios"><strong>Cómo usar Async/Await en Axios</strong></h3><p>Hasta ahora hemos visto con hacer peticiones con Axios usando la sintaxis para promesas. Pero ahora veamos cómo usar async/await para escribir menos código y evitar el encadenamiento con <code>.then()</code></p><p>Cuando usemos async/await, todas nuestras peticiones Axios se verán así:</p><pre><code class="language-js">import React, { useState, useEffect } from 'react';

const App = () =&gt; {
   const [title, setTitle] = useState('');
   const [body, setBody] = useState('');
   const [posts, setPosts] = useState([]);

   // GET with Axios
   useEffect(() =&gt; {
      const fetchPost = async () =&gt; {
         let response = await client.get('?_limit=10');
         setPosts(response.data);
      };
      fetchPost();
   }, []);

   // Delete with Axios
   const deletePost = async (id) =&gt; {
      await client.delete(`${id}`);
      setPosts(
         posts.filter((post) =&gt; {
            return post.id !== id;
         })
      );
   };

   // Post with Axios
   const addPosts = async (title, body) =&gt; {
      let response = await client.post('', {
         title: title,
         body: body,
      });
      setPosts((posts) =&gt; [response.data, ...posts]);
   };

   const handleSubmit = (e) =&gt; {
      e.preventDefault();
      addPosts(title, body);
   };

   return (
      // ...
   );
};

export default App;
</code></pre><h3 id="c-mo-manejar-errores-con-axios"><strong>Cómo manejar errores con Axios</strong></h3><p>Para peticiones con Axios basadas en promesas, podemos usar los métodos <code>.then()</code> y .<code>catch (</code>) , pero para async/awit, podemos usar el bloque <code>try...catch</code>. Esto es muy similar a como lo implementamos en Fetch API. <br>El bloque <code>try...catch</code> se verá así:</p><pre><code class="language-js">const fetchPost = async () =&gt; {
   try {
      let response = await client.get('?_limit=10');
      setPosts(response.data);
   } catch (error) {
      console.log(error);
   }
};
</code></pre><p><a href="https://stackabuse.com/handling-errors-with-axios/">Aquí </a>(en inglés) puedes leer más sobre como manejar errores en Axios.</p><h2 id="fetch-api-vs-axios"><strong>Fetch API vs Axios</strong></h2><p>Quizás hayas notado algunas diferencias, pero vamos a ponerlas en un tabla así podemos comparar Fetch y Axios. </p><p>Estas distinciones le ayudarán a decidir qué método utilizar para un proyecto concreto. Entre estas distinciones se encuentran:</p><!--kg-card-begin: html--><table style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background: var(--body-bg);">AXIOS</th><th style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background: var(--body-bg);">FETCH</th></tr></thead><tbody style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios is a standalone third-party package that is simple to install.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch is built into most modern browsers.<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">No installation</strong><span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span>is required as such.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios uses the<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">data</strong><span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span>property.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch uses the<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">body</strong><span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span>property.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios data contains the<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">object</strong>.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch’s body has to be<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">stringified</strong>.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">When the status is 200 and the statusText is 'OK,' the Axios request is accepted.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch request is ok when<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">response object contains the ok property</strong>.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios performs<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">automatic transforms of JSON data</strong>.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch is a<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">two-step process</strong><span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span>when handling JSON data- first, to make the actual request; second, to call the .json() method on the response.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios allows<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">cancelling request and request timeout</strong>.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch does not.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios has<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">built-in support for download progress</strong>.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch does not support upload progress.</td></tr><tr style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Axios has<span style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline;">&nbsp;</span><strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bolder; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">wide browser support</strong>.</td><td style="box-sizing: border-box; margin: 0px; padding: var(--su-2); border: 1px solid var(--base-20); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Fetch is only compatible with Chrome 42+, Firefox 39+, Edge 14+, and Safari 10.1+. (This is known as Backward Compatibility).</td></tr></tbody></table><!--kg-card-end: html--><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>En esta guía aprendimos a consumir APIs REST en React con Fetch API y Axios.</p><p>Esto te ayudará a empezar a consumir API en React, y desde ahí podrás consumir información de manera más complejas y manipular APIs de la manera que quieras.</p><p>¡Embárcate en un viaje de aprendizaje! <a href="https://joelolawanle.com/contents">Explora más de 200 artículos escritos por expertos en desarrollo web</a>. Pégale un vistazo a <a href="https://joelolawanle.com/posts">mí blog (en inglés)</a> con contenido interesante escrito por mí.</p><p><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo cambiar la tipografía en HTML ]]>
                </title>
                <description>
                    <![CDATA[ Anteriormente, cuando se usaba HTML4, existía la etiqueta <font> que se podía usar para cambiar el tamaño, la tipografía y el color de un texto. Pero con la aparición de HTML5, la etiqueta <font> fue deprecada. Actualmente, si se quiere modificar cualquier cosa relacionado con la fuente, hay que hacerlo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-cambiar-la-tipografia-en-html/</link>
                <guid isPermaLink="false">654ea31e208bc703b414b67d</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Thu, 23 Nov 2023 23:23:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/abc-3523454_1280.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-change-font-with-html/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Change Font with HTML</a>
      </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/size/w2000/2022/06/abc-3523454_1280.jpg" class="kg-image" alt="How to Change Font with HTML" width="600" height="400" loading="lazy"></figure><p>Anteriormente, cuando se usaba HTML4, existía la etiqueta <code>&lt;font&gt;</code> que se podía usar para cambiar el tamaño, la tipografía y el color de un texto.</p><p>Pero con la aparición de HTML5, la etiqueta <code>&lt;font&gt;</code> fue deprecada. Actualmente, si se quiere modificar cualquier cosa relacionado con la fuente, hay que hacerlo con CSS.</p><p>En este artículo, te enseñaré como cambiar el tamaño de la fuente, el &nbsp;font-weight (grosor de la fuente), el estilo (font-style) y la familia (font-family) con CSS.</p><h2 id="c-mo-cambiar-el-tama-o-del-texto-con-la-propiedad-font-size-"><strong>Cómo cambiar el tamaño del texto con la propiedad font-size.</strong></h2><p>La propiedad font size del texto representa cuán grande es texto es.</p><p>Para cambiar el tamaño del texto, se debe usar la propiedad <code>font-size</code> y después especificar el valor en pixeles <code>px</code>, <code>rem</code>, o <code>em</code>.</p><p>Esto se puede hacer usando CSS dentro de la línea de código (elemento HTML):</p><pre><code class="language-html">&lt;h1 style="font-size: 4rem"&gt;freeCodeCamp&lt;/h1&gt;
</code></pre><p>O con CSS interno o embebido dentro del mismo archivo o documento HTML:</p><pre><code class="language-css">&lt;style&gt;
    h1 {
        font-size: 4rem;
    }
&lt;/style&gt;
</code></pre><p>Y también usando CSS externo:</p><pre><code class="language-css">    h1 {
        font-size: 4rem;
    }
</code></pre><p>Para deshacerse del fondo blanco que viene por defecto y centrar el texto de forma horizontal y vertical, escribí el siguiente código CSS:</p><pre><code class="language-css">  body {
      display: flex;
      align-items: center;
      justify-content: center;
      height: 100vh;
      background-color: #f1f1f1;
    }
</code></pre><p>En el navegador se ve como se muestra abajo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/ss1-2.png" class="kg-image" alt="ss1-2" width="600" height="400" loading="lazy"></figure><h2 id="como-cambiar-la-propiedad-font-weight-del-texto"><strong>Como cambiar la propiedad font-weight del texto</strong></h2><p>Font-weight es la propiedad que nos permite que un texto especifico sea más grueso o fino.</p><p>Se puede usar <code>font-weight</code> para cambiar cuan fina o gruesa queremos la fuente al darle un valor como <code>normal</code>, <code>lighter</code>, <code>bold</code>, or <code>bolder</code>. &nbsp;También se puede usar valores como 100, 200, 500 y similares.</p><p>Como con el tamaño de la fuente, también se puede cambiar la propiedad font-weight usando CSS dentro del elemento HTML, con CSS embebido en el documento HTML o de manera externa.</p><pre><code class="language-html">&lt;span&gt;
   &lt;h1 style="font-weight: lighter"&gt;freeCodeCamp Lighter&lt;/h1&gt;
   &lt;h1 style="font-weight: normal"&gt;freeCodeCamp Normal&lt;/h1&gt;
   &lt;h1 class="bold" style="font-weight: bold"&gt;freeCodeCamp Bold&lt;/h1&gt;
   &lt;h1 style="font-weight: bolder"&gt;freeCodeCamp Bolder&lt;/h1&gt;
&lt;/span&gt;
</code></pre><pre><code class="language-css">&lt;style&gt;
    .lighter {
      font-weight: lighter;
    }

    .normal {
      font-weight: normal;
    }

    .bold {
      font-weight: bold;
    }

    .bolder {
      font-weight: bolder;
    }
&lt;/style&gt;
</code></pre><pre><code class="language-css">.lighter {
      font-weight: lighter;
    }

    .normal {
      font-weight: normal;
    }

    .bold {
      font-weight: bold;
    }

    .bolder {
      font-weight: bolder;
    }
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/ss2-2.png" class="kg-image" alt="ss2-2" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-cambiar-la-propiedad-font-style-del-texto"><strong>Cómo cambiar la propiedad font-style del texto</strong></h2><p>La propiedad font-style permite variación del estilo y tamaño (typeface) de la fuente de un texto. Los posibles valores para utilizar son: <code>normal</code>, <code>bold</code>, or <code>italic</code></p><p>Para cambiar la propiedad font-style, se pueden usar los valores: <code>normal</code>, <code>oblique</code>, o <code>italic</code>.</p><p><code>normal</code> es el valor predeterminado de la propiedad font-style. No es necesario especificarlo a menos que quieras cambiarlo.</p><p>También se puede cambiar la propiedad font style con CSS dentro del elemento HTML, con CSS embebido en el documento HTML o de manera externa (archivo CSS).</p><pre><code class="language-html">&lt;span&gt;
      &lt;h1&gt;freeCodeCamp Normal&lt;/h1&gt;
      &lt;h1 style="font-style: oblique"&gt;freeCodeCamp Oblique&lt;/h1&gt;
      &lt;h1 style="font-style: italic"&gt;freeCodeCamp Italic&lt;/h1&gt;
&lt;/span&gt;
</code></pre><pre><code class="language-css">&lt;style&gt;
    .oblique {
      font-style: oblique;
    }

    .italic {
      font-style: italic;
    }
&lt;/style&gt;
</code></pre><pre><code class="language-css">    .oblique {
      font-style: oblique;
    }

    .italic {
      font-style: italic;
    }
</code></pre><p>Así se ve el resultado en el navegador:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/ss3-2.png" class="kg-image" alt="ss3-2" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-cambiar-la-propiedad-font-family-de-un-texto"><strong>Cómo cambiar la propiedad font-family de un texto</strong></h2><p>La propiedad font-family es una colección de fuentes que comparten el mismo diseño y tipografía.</p><p>Para cambiar esta propiedad, es necesario usar el atributo CSS <code>font-family</code>.</p><p>Es posible hacer estos cambios usando CSS dentro del elemento HTML, con CSS embebido en el documento HTML o de manera externa en un archivo CSS.</p><p>El código de abajo muestra como cambiar la propiedad font-family usando CSS dentro del código HTML:</p><pre><code class="language-html">&lt;h1 style="font-family: Verdana, Geneva, Tahoma, sans-serif"&gt;
      freeCodeCamp
&lt;/h1&gt;


You can change the font-family in embedded or internal CSS this way:

```css
&lt;style&gt;
    h1 {
      font-family: Verdana, Geneva, Tahoma, sans-serif;
    }
&lt;/style&gt;
</code></pre><p>Usando un archivo CSS externo es posible cambiar la propiedad font family de esta manera:</p><pre><code class="language-css">h1 {
      font-family: Verdana, Geneva, Tahoma, sans-serif;
    }
</code></pre><p>Para esto, debes asegurarte de que el archivo CSS externo este vinculado al archivo HTML. Si no lo está, esto no funcionará.</p><p>La fuente Verdana se ve de esta manera el navegador Google Chrome:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/ss4-1.png" class="kg-image" alt="ss4-1" width="600" height="400" loading="lazy"></figure><p>Seguro notaste que hay otras fuentes dentro del valor asignado a font-family &nbsp;(Geneva, Tahoma, y sans-serif).</p><p>Estas son fuentes de respaldo en caso de que Verdana no este instalada en el equipo del usuario.</p><p>Si no te gustan las fuentes que vienen instaladas en tu equipo, puedes obtener otras de Google Fonts.</p><p>Busca tu favorita y copia el enlace a la fuente dentro de la sección <code>&lt;head&gt;</code> de tu documento HTML para que la puedas usar en tu hoja de estilo CSS.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/ss5-1.png" class="kg-image" alt="ss5-1" width="600" height="400" loading="lazy"></figure><p>En este caso, yo usé la fuente Roboto de esta manera:</p><pre><code class="language-css"> h1 {
      font-family: Roboto, sans-serif;
    }
</code></pre><p>Y así es como se ve en el navegador:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/ss6-1.png" class="kg-image" alt="ss6-1" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Este artículo te guía en las distintas maneras para modificar el tamaño y otras propiedades de las fuentes (font-size, font-weight, font-style y font-family) usando CSS dentro del código HTML, con CSS embebido en el mismo archivo HTML o en un archivo externo.</p><p>Quizás te preguntes cuál es la mejor manera de usar el código CSS: dentro de la línea de código HTML, con CSS embebido en el mismo documento HTML, o en un archivo CSS externo.</p><p>Si estás trabajando en un proyecto pequeño, puedes usar CSS embebido dentro del mismo documento HTML, pero si estás trabajando en un proyecto grande o en equipo, no deberías usar CSS embebido.</p><p>Esto es porque es una buena práctica tener el código CSS separado del código HTML.</p><p>Por otro lado, CSS dentro de los elementos HTML no se recomienda porque no facilita la lectura del código HTML.</p><p>Otro aspecto importante que considerar es que el CSS dentro de los elementos HTML afecta negativamente el SEO (optimización de búsqueda) del sitio web.</p><p>¡Gracias por leer!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo convertirse en Desarrollador Front-End - Habilidades para Desarrollo Web Front-End ]]>
                </title>
                <description>
                    <![CDATA[ Algunos de los profesionales mejores pagados del mundo son los desarrolladores front-end. Ellos usan sus conocimientos y talento para diseñar sitios web atractivos y amigables para el usuario. Los desarrolladores front-end no necesitan un título de grado para trabajar. Solo deben comprender los conceptos fundamentales del desarrollo front-end, de los ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-convertirse-en-desarrollador-front-end-habilidades/</link>
                <guid isPermaLink="false">6536e2e8a37ad203ea2a0c27</guid>
                
                    <category>
                        <![CDATA[ frontend ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Mon, 13 Nov 2023 06:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/cover-template--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-become-a-frontend-developer/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Become a Front End Developer – Front End Web Dev Skills</a>
      </p><p>Algunos de los profesionales mejores pagados del mundo son los desarrolladores front-end. Ellos usan sus conocimientos y talento para diseñar sitios web atractivos y amigables para el usuario.</p><p>Los desarrolladores front-end no necesitan un título de grado para trabajar. Solo deben comprender los conceptos fundamentales del desarrollo front-end, de los lenguajes de programación, y de entornos de desarrollo front-end.</p><p>En esta guía, aprenderás a cómo convertirte en un desarrollador front-end, primero entendiendo de qué trata el desarrollo front-end, las habilidades técnicas y blandas que se necesitan, los lenguajes y entornos de programación existentes, y los primeros pasos necesarios para empezar.</p><p>En Estados Unidos, un desarrollador front-end puede ganar en promedio USD 86.178 al año, de acuerdo con <a href="https://www.glassdoor.co.in/Salaries/us-front-end-developer-salary-SRCH_IL.0,2_IN1_KO3,22.htm" rel="noreferrer nofollow noopener">Glassdoor</a>. De acuerdo con Payscale, un desarollador front-end "típico" puede ganar un ingreso anual de USD 71.350.</p><p>Si recién incursionas en el mundo de la tecnología, quizás no sabes qué significa front-end u otros términos del mundo del desarrollo web como back-end y full-stack. Por eso, vamos a empezar explicándolos.</p><h2 id="-qu-es-el-front-end"><strong>¿Qué es el front-end?</strong></h2><p>Todos los sitios web que navegamos, los sitios de comercio electrónico de donde compramos productos, los blogs que leemos, y demás sitios son sitios amigables con el usuario y estéticamente agradables realizados por desarrolladores front-end.</p><p>Existen dos grandes áreas del desarrollo web que hay que tener en cuenta cuando se diseñan sitios web y aplicaciones web: el front-end y el back-end.</p><p>El desarrollo front-end está relacionado con la cara visible por el usuario de cualquier aplicación web. Es lo que el usuario ve y con lo que interactúa al hacer clic sobre un botón, desplazarse por la página, completar un formulario, etc. Esto es la funcionalidad del lado del cliente de una aplicación web.</p><p>El back-end se refiere a todos los eventos que ocurren por detrás de escena, como la infraestructura, la conexión y comunicación con la base de datos, etc. Full stack se refiere a la combinación de las áreas de front-end y back-end.</p><h2 id="-qu-es-lo-que-hace-un-desarrollador-front-end"><strong>¿Qué es lo que hace un Desarrollador Front-end?</strong></h2><p>Recién hablábamos de las distintas áreas del desarrollo web: front, back-end y full stack. Así también tenemos distintos desarrolladores, especializados en las distintas áreas del desarrollo web. Por lo que tenemos desarrolladores front-end, desarrolladores back-end y desarrolladores full-stack.</p><p>Un desarrollador front-end es un profesional que tiene a su cargo la tarea de crear la interfaz y la experiencia de usuario (UI/UX) con la que los usuarios interactúan para acceder a la aplicación. Son los que resuelven problemas a través de los lenguajes de programación, herramientas, creatividad y la experiencia para crear un sitio web o aplicación que no solo resuelva el problema del usuario y además tiene un buen diseño.</p><p>Un desarrollador back-end, como dijimos anteriormente, es responsable por todo lo relacionado con la lógica, la comunicación de la base de datos, entre otras cosas.</p><p>Por último, un desarrollador full-stack son los que entienden tanto de desarrollo front-end como de back-end. Esto les permite poder comenzar y terminar un proyecto por sí mismos.</p><p>En un ambiente profesional o de empresa, usualmente hay un diseñador UI/UX quién se encarga de diseñar la interfaz y la experiencia del usuario. </p><p>Ellos después le pasan el diseño a los desarrolladores front-end y back-end, quienes se encargan en la implementación para que la aplicación diseñada funcione en la web.<br>El desarrollador front-end va a recrear el diseño al escribir el código en HTML, CSS y JavaScript.</p><h2 id="c-mo-convertirse-en-desarrollador-front-end"><strong>Cómo convertirse en Desarrollador Front-end</strong></h2><p> Hasta ahora hablamos sobre qué significa front-end y quién es un desarrollador front-end. Ahora, veamos cuáles son los requisitos o habilidades necesarias para poder ser un desarrollador front-end.</p><p>Es importante entender que no es necesario saber todo antes de empezar a trabajar como desarrollador front-end, pero hay saberes fundamentales como HTML, CSS, y JavasScript que siempre van a ser esenciales.</p><h3 id="1-aprende-html-css-y-javascript"><strong><strong>1. </strong>Aprende HTML, CSS, y JavaScript</strong></h3><p>Cuando miramos un sitio en la web, las tres cosas más importantes que componen lo que vemos en la web son HTML, CSS, y JavaScript. Estas son las tres cosas que primero tienes que aprender como base para convertirte un desarrollador front-end.</p><p>Son las bases de los sitios web y aplicaciones, por lo que debes aprenderlos si quieren dedicarte al desarrollo web. Por suerte, hay muchos recursos en línea disponibles para ayudarte en aprender y practicar.</p><h4 id="-qu-es-html"><strong>¿Qué es HTML?</strong></h4><p>HTML significa, por sus siglas en inglés, Lenguaje de Marcado de HyperTexto. Es el esqueleto de todas las páginas web y aplicaciones. Es el bloque para construir más básico de todos. El HTML se usa para estructurar tu página en elementos como párrafos, secciones, encabezados, barras de navegación, etcétera. </p><p>El HTML provee de estructura al contenido que aparece en el sitio web, como imágenes, texto o videos. Una página con solo HTML es muy básica y nada atractiva, por lo que se necesitará usar estilos CSS para hacerla más presentable. </p><p>HTML es frecuentemente el primer lenguaje que los desarrolladores aprenden, ya que es esencial para el trabajo de desarrollo web. ¿Quieres aprender más sobre HTML? Puedes empezar con la certificación en <a href="https://www.freecodecamp.org/espanol/learn/2022/responsive-web-design/">Diseño Web Responsive de freeCodeCamp</a> y el <a href="https://www.freecodecamp.org/news/html-crash-course/">nuevo curso completo de HTML de Beau Carnes (en inglés)</a></p><h4 id="-qu-es-css"><strong>¿Qué es CSS?</strong></h4><p>CSS es la abreviatura, en inglés, para Hojas de Estilo en Cascada, y lo usas para mejorar la apareciencia de una página web con estilos CSS. Estos estilos hacen que tu sitio web sea más atractivo y agradable a la vista para el usuario final.</p><p>¿Quieres aprender más sobre CSS? Para empezar, puedas darle un vistazo a la <a href="https://www.freecodecamp.org/espanol/learn/2022/responsive-web-design/">segunda parte de la certificación de Diseño Web Responsive de freeCodeCamp</a>.</p><h4 id="-qu-es-javascript"><strong>¿Qué es JavaScript?</strong></h4><p>HTML es un lenguaje de marcado, CSS es una hoja de estilo, y después tenemos a JavaScript, el tercer bloque básico de construcción. JavaScript es un lenguaje de programación que te permite hacer tus páginas web más interactivas. Esto puede incluir animaciones, estilos dinámicos, efectos cuando se les hacen clic a los botones, game motion, etcétera.</p><p>Si quieres aprender JavaScript, puedes darle un vistazo a la certificación en <a href="https://www.freecodecamp.org/espanol/news/ghost/#/editor/post/6536e2e8a37ad203ea2a0c27:~:text=https%3A/www.freecodecamp.org/learn/javascript%2Dalgorithms%2Dand%2Ddata%2Dstructures/">Algoritmos de Javascript y Estructura de Datos.</a> Puedes complementar tu aprendizaje con este excelente <a href="https://www.freecodecamp.org/news/learn-javascript-full-course/">curso introductorio a JavaScript</a>.</p><h3 id="2-pr-ctica-con-ejercicios-de-programaci-n"><strong><strong>2. </strong>Práctica con ejercicios de programación</strong></h3><p>Hay una frase que dice "la práctica hace al maestro". Esto significa que si haces algo con frecuencia, cada vez irás mejorando.</p><p>Si quieres convertirte en un desarrollador front-end profesional, tienes que practicar constantemente. Esto te ayudará a aprender los conceptos más profundamente (y no solo lo superficial). Cuanto más practiques, mejor entenderás los conceptos.</p><h3 id="3-mejora-tus-habilidades"><strong><strong>3. </strong>Mejora tus habilidades</strong></h3><p>"Aprende constantemente, siempre hay algo más por aprender", decía Steve Jobs. Esto es verdad para todos los aspectos de la vida, incluidos la programación y el desarrollo front-end.</p><p>Mientras nuevas tecnologías, herramientas, sintaxis y maneras de resolver problemas sigan apareciendo, siempre es mejor estar al tanto de las nuevas tendencias en tecnología para no quedarnos atrás.</p><p>Esto te ayudará a que tus habilidades como desarrollador front-end crezcan. Siempre puedes estar al tanto de todo lo nuevo uniéndote e interactuando con comunidades activas de desarrolladores. <br>Existen muchas comunidades como la comunidad de desarrolladores de freeCodeCamp y todas las comunidades locales &nbsp;que existen alrededor nuestro.</p><h3 id="4-aprende-la-l-nea-de-comandos-y-control-de-versiones"><strong><strong>4. </strong>Aprende la Línea de Comandos y Control de Versiones</strong></h3><p>Como desarrollador front-end, debes entender como funciona la línea de comandos porque te permite acceder a funciones del sistema operativo a través de una interfaz de texto. <br>Muchos desarrolladores profesionales prefieren las CLIs (Command Line Interface, por sus siglas en inglés) por su velocidad y rendimiento al instalar librerías y frameworks. </p><p>Los desarrolladores front-end también deben estar familiarizados con sistemas de control de versiones como Git, que es el más usado. Al programar, frecuentemente vas a querer hacer seguimiento de los que vas programando y otras informaciones.</p><p>El control de versiones lo hace mucho más fácil porque te permite a ti y a tu equipo comunicarte y seguir todos los cambios al código original de manera eficiente.<br>También te proporciona información sobre quién hizo el cambio y qué cambio hizo.</p><h3 id="5-entendiendo-las-interfaces-de-programaci-n-de-aplicaciones-apis-"><strong><strong>5. </strong>Entendiendo las Interfaces de Programación de Aplicaciones (APIs)</strong></h3><p>Como desarrollador front-end profesional, tienes que estar familiarizado con las APIs, sobretodo en cómo usarlas. Esto es importante para poder comunicarte con la lógica del back-end y las bases de datos.</p><p>Para interactuar con APIs usando JavaScript, mayormente vas a usar la Fetch API de tu navegador o la librería Axios. Este artículo explica <a href="https://www.freecodecamp.org/espanol/news/fetch-api-como-realizar-un-get-request-y-un-post-request-en-javascript/">cómo usar Fetch API con JavaScript. </a></p><h3 id="6-aprende-c-mo-funcionan-las-librer-as-de-javascript-css"><strong><strong>6. </strong>Aprende cómo funcionan las librerías de JavaScript/CSS</strong></h3><p>Actualmente, hay muchas librerías de JavaScript, todas ellas apuntan a hacer el desarrollo de un aplicación web más fácil. &nbsp;Todas son scripts de JavaScript que hacen que el desarrollo de aplicaciones basadas en JavaScript sea más fácil.</p><p>Hay muchas librerías como React, Vue, o Angular (tres de las más populares), por lo cual es mejor elegir una y profundizar en su aprendizaje. Puedes darle una mirada al <a href="https://www.freecodecamp.org/espanol/learn/front-end-development-libraries/">curso de certificación el librerías de desarrollo frontend de freeCodeCamp</a> para aprender más.</p><p>También hay algunas librerías de estilo para darle estilo a tus páginas web de manera simple como Bootstrap, Sass/Scss, Tailwind, y otras.</p><h3 id="7-construye-tu-portfolio-online"><strong><strong>7. </strong>Construye tu portfolio online</strong></h3><p>Construir tu portfolio es un manera fácil de mostrar tu habilidad como desarrollador front-end.</p><p>Si recién estás comenzando como desarrollador front-end, no es necesario que cada proyecto que muestres en tu portfolio pertenezca a un cliente. Podes tomar la iniciativa y ser creativo.</p><p>Usa nuevas herramientas y librerías para crear algo espectacular. Mientras vayas avanzando en tu carrera, podrás incluir los proyectos en los que vayas trabajando.</p><p>También podes darle una mirada los portfolios de otros desarrolladores front-end para inspirarte y ver qué es lo que te gusta o no. Entonces, al saber que es lo que quieres mostrar al mundo, ya puedes crear tu propio sitio web.</p><p><a href="https://www.freecodecamp.org/news/create-a-portfolio-website-using-html-css-javascript/">Aquí tienes un curso entretenido</a> que te ayudará a construir tu propio portfolio con HTML, CSS y JavaScript- para que puedas practicar esas habilidades de desarrollo web.</p><p>Puedes hacer que tus amigos y miembros de la comunidad te den feedback sobre tu sitio para asegurarte de que todo se ve y funciona bien. No debes olvidarte que todas las palabras que uses en tu sitio web deberían ayudarte a conseguir un buen trabajo. No vas a querer que los textos que incluyas sean demasiados largos o aburridos.</p><p><a href="https://www.freecodecamp.org/news/level-up-developer-portfolio/">Aquí tienes algunos tips</a> que te ayudarán a que tu portfolio desarrollador realmente destaque.</p><h3 id="8-cultiva-tus-habilidades-blandas"><strong><strong>8. </strong>Cultiva tus habilidades blandas</strong></h3><p>Los desarrolladores front-end deben ser comunicadores eficaces, tanto en lo escrito como lo oral, porque interactúan con el equipo técnico y con el cliente.</p><p>También deben ser excelentes comunicadores a través de su código, por lo que es crucial que se tomen el tiempo para comentar dentro del código y escribir la documentación apropiada así tanto tu como otros desarrolladores pueden entenderlo, aún cuando haya pasado tiempo.</p><p>Los desarrolladores front-end también deben prestar atención a los detalles y ser meticulosos en todos los aspectos relacionados con su trabajo. Tienen que tener un buen ojo y ser capaces de darse cuenta de pequeños errores o inconsistencias que pueden existir al momento de crear una página web.</p><p>Y los desarrolladores front-end deben también ser también capaces de seguir aprendiendo durante toda su vida, porque los sitios web siempre están evolucionando y las expectativas en cuanto a accesibilidad y apariencia siempre están cambiando. Los ingenieros front-end deben estar en constante actualización, ya que seguramente necesitarán aprender nuevos lenguajes de programación o librerías, a lo largo del tiempo. &nbsp;</p><h3 id="9-empieza-a-postularte-a-las-pasant-as-o-puestos-de-trabajo-que-quieras"><strong><strong>9. </strong>Empieza a postularte a las pasantías o puestos de trabajo que quieras</strong></h3><p>Una vez que tengas el conocimiento de frontend necesario a través del aprendizaje de las habilidades necesarios y de <a href="https://www.freecodecamp.org/news/how-to-write-a-developer-resume-recruiters-will-read/">la creación de un curriculum vitae simple</a>, puedes empezar a buscar ofertas de trabajo relacionadas con el front-end.</p><p>Chequea los requisitos de las ofertas para ver en que otras áreas necesitas mejorar como desarrollador front-end.</p><p> Finalmente, siempre postúlate a trabajos y nunca tengas miedo de hacerlo. Esto te dará experiencia para ayudarte a comprender cómo son los procesos de contratación de las empresas y qué es lo que se necesita para ser contratados.</p><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>En este artículo, hemos aprendido qué es un desarrollador front-end y qué es lo que se necesita para convertirse en uno.</p><p>También hemos aprendido que convertirse en un desarrollador front-end sin título no solo es posible, sino que hasta alcanzable.</p><p>Una pregunta final que las personas se hacen mucho es cuánto se tarda para convertirse en desarrollador front-end. Bueno, el tiempo depende totalmente de tu ritmo de aprendizaje y conocimientos previos que tengas.</p><p>Solo recuerda que no debes compararte a ti o tu ritmo de aprendizaje con el de otros mientras estás aprendiendo. Resérvate un momento cada semana o día para aprender, apégate a ese hábito lo mejor que puedas y luego disfruta. <br><br></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
