<?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[ Josué - 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[ Josué - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 27 May 2026 16:02:06 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/drifting/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de imagen de fondo en React: Cómo establecer una imagen de fondo con estilo CSS en línea ]]>
                </title>
                <description>
                    <![CDATA[ Hay cuatro maneras de establecer una propiedad de estilo backgroundImage  utilizando el CSS en línea de React. Este tutorial le mostrará los cuatro métodos, con ejemplos de código para cada uno. Cómo establecer una imagen de fondo en React usando una URL externa Si tu imagen se encuentra en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-imagen-de-fondo-en-react/</link>
                <guid isPermaLink="false">62362b664ecd0f09d7dd032a</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Sun, 18 Sep 2022 02:07:37 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/08/fcc-bg-image-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/react-background-image-tutorial-how-to-set-backgroundimage-with-inline-css-style/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Background Image Tutorial – How to Set backgroundImage with Inline CSS Style</a>
      </p><p>Hay cuatro maneras de establecer una propiedad de estilo <code>backgroundImage</code> utilizando el CSS en línea de React.<br><br>Este tutorial le mostrará los cuatro métodos, con ejemplos de código para cada uno.</p><h2 id="c-mo-establecer-una-imagen-de-fondo-en-react-usando-una-url-externa">Cómo establecer una imagen de fondo en React usando una URL externa</h2><p>Si tu imagen se encuentra en algún lugar en línea, puedes establecer la imagen de fondo de su elemento colocando la URL así:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">function App() {
  return (
    &lt;div style={{ 
      backgroundImage: `url("https://via.placeholder.com/500")` 
    }}&gt;
      Hello World
    &lt;/div&gt;
  );
}</code></pre><figcaption>Configurar la imagen de fondo de React con una URL externa</figcaption></figure><p>El código anterior mostrará un único elemento &lt;div&gt; con el estilo <code>background-image: url(https://via.placeholder.com/500)</code> aplicado en él.</p><h2 id="c-mo-establecer-una-imagen-de-fondo-en-react-desde-tu-carpeta-src">Cómo establecer una imagen de fondo en React desde tu carpeta /src</h2><p>Si arrancas tu aplicación usando Create React App y tienes tu imagen dentro de la carpeta <code>src/</code>, puedes importar la imagen primero y luego colocarla como fondo de su elemento:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">import React from "react";
import background from "./img/placeholder.png";

function App() {
  return (
    &lt;div style={{ backgroundImage: `url(${background})` }}&gt;
      Hello World
    &lt;/div&gt;
  );
}

export default App;</code></pre><figcaption>Setting background image using imported image</figcaption></figure><p>Cuando se ejecuta el comando <code>npm start</code>, React mostrará un error "Failed to Compile" y detendrá la compilación cuando no se encuentre la imagen:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/React-failed-to-compile-image.png" class="kg-image" alt="React-failed-to-compile-image" width="600" height="400" loading="lazy"><figcaption>React ha fallado al compilar. La imagen no se encuentra.</figcaption></figure><p>De esta manera, no mostrarás ningún enlace de imagen roto en tu aplicación web. En el código anterior, el valor de <code>backgroundImage</code> se establece mediante una cadena de plantilla, que permite incrustar expresiones de JavaScript.</p><h2 id="c-mo-establecer-una-imagen-de-fondo-en-react-usando-el-m-todo-de-la-url-relativa">Cómo establecer una imagen de fondo en React usando el método de la URL relativa</h2><p>La carpeta <code>public/</code>en Create React App se puede utilizar para añadir activos estáticos en su aplicación React. Cualquier archivo que pongas dentro de la carpeta será accesible en línea.</p><p>Si pones un archivo <code>image.png</code> dentro de la carpeta <code>public/</code>, puedes acceder a él en <code>&lt;tu dirección de host&gt;/image.png</code>. Cuando se ejecuta React en tu ordenador local, la imagen debe estar en <code>http://localhost:3000/image.png</code>.<br><br>Entonces puedes asignar la URL relativa a tu dirección de host para establecer la imagen de fondo. Aquí tienes un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">&lt;div style={{ backgroundImage: "url(/image.png)" }}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Establecer la imagen de fondo con URL relativa</figcaption></figure><p>Al establecer la ruta de la URL a <code>/image.png</code> como en el ejemplo anterior, el navegador buscará la imagen de fondo en <code>&lt;Tu direccion de host&gt;/image.png</code>.<br><br>También puedes crear otra carpeta dentro de <code>public/</code> si quieres organizar tus imágenes en carpetas. Por ejemplo:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/Screen-Shot-2020-12-14-at-20.18.30.png" class="kg-image" alt="Screen-Shot-2020-12-14-at-20.18.30" width="600" height="400" loading="lazy"><figcaption>Creación de una carpeta img/ dentro de la carpeta public/</figcaption></figure><p>No olvides ajustar el valor de <code>backgroundImage</code> a <code>url(/img/image.png)</code> si decides crear la carpeta.</p><h2 id="c-mo-establecer-una-imagen-de-fondo-en-react-usando-el-m-todo-de-la-url-absoluta">Cómo establecer una imagen de fondo en React usando el método de la URL absoluta</h2><p>También puedes incluir la URL absoluta utilizando la variable de entorno <code>PUBLIC_URL</code> de Create React App de la siguiente manera:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">&lt;div style={{ 
  backgroundImage: `url(${process.env.PUBLIC_URL + '/image.png'})` 
}}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Setting background image with absolute URL</figcaption></figure><p>Cuando lo ejecutes en tu ordenador local, los scripts de React manejarán el valor de <code>PUBLIC_URL</code>. Cuando lo ejecutes localmente, se verá como una URL relativa en lugar de una URL absoluta:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/absolute-url-background-image-1.png" class="kg-image" alt="absolute-url-background-image-1" width="600" height="400" loading="lazy"><figcaption>La URL absoluta de la imagen no se muestra en el ordenador local</figcaption></figure><p>La URL absoluta sólo se verá cuando se despliegue React en la aplicación de producción más tarde.</p><h2 id="c-mo-establecer-una-imagen-de-fondo-con-propiedades-adicionales">Cómo establecer una imagen de fondo con propiedades adicionales</h2><p>Si quieres personalizar más la imagen de fondo, puedes hacerlo añadiendo propiedades adicionales después de <code>backgroundImage</code>. He aquí un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">
&lt;div style={{ 
  backgroundImage: `url(${process.env.PUBLIC_URL + '/image.png'})`,
  backgroundRepeat: 'no-repeat',
  width:'250px' 
}}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Establecer la imagen de fondo con propiedades adicionales</figcaption></figure><p>Las propiedades establecidas anteriormente añadirán <code>background-repeat: no-repeat</code> y <code>width: 250px</code> junto con el estilo <code>background-image</code> al elemento <code>&lt;div&gt;</code>.</p><p>Gracias por leer, y espero que hayas encontrado este artículo útil. Si tienes alguna pregunta, puedes encontrarme en <a href="https://twitter.com/nsebhastian">Twitter</a>. También compartiré algunos consejos cortos para desarrolladores de vez en cuando. ?</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Cuáles son los mejores editores de código para el desarrollo web? ]]>
                </title>
                <description>
                    <![CDATA[ Como desarrolladores de software tenemos muchas herramientas, programas y tecnologías a nuestra disposición para poder ejercer nuestro trabajo, una de las principales son los editores de código, en este artículo descubrirás cuáles son los mejores editores de código para el desarrollo web. Si eres nuevo en este rubro, probablemente no ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/mejores-editores-de-codigo/</link>
                <guid isPermaLink="false">631aa137b1786008d5614ef7</guid>
                
                    <category>
                        <![CDATA[ Tecnología ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Fri, 09 Sep 2022 19:17:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/Banners-Art-culos-freeCodeCamp.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Como desarrolladores de software tenemos muchas herramientas, programas y tecnologías a nuestra disposición para poder ejercer nuestro trabajo, una de las principales son los editores de código, en este artículo descubrirás cuáles son los mejores editores de código para el desarrollo web.</p><p>Si eres nuevo en este rubro, probablemente no sepas que es un editor de código, así que expliquemos primero que es. </p><h2 id="-qu-es-un-editor-de-c-digo">¿Qué es un editor de código? </h2><p>Un editor de código es un software que cómo su nombre dice nos ayuda a editar texto, en su mayoría los editores de código cuentan con resaltado de sintaxis, autocompletado, entre otras cosas. Algunos de ellos nos permiten agregar extensiones que amplían nuestra manera de escribir código y hasta nos ayudan a ser más eficientes escribiendo código más rápido. </p><h2 id="mejores-editores-de-c-digo-para-el-desarrollo-web">Mejores editores de código para el desarrollo web </h2><!--kg-card-begin: markdown--><p><img src="https://code.visualstudio.com/opengraphimg/opengraph-home.png" alt="opengraph-home" width="600" height="400" loading="lazy"></p>
<!--kg-card-end: markdown--><h3 id="visual-studio-code"><a href="https://code.visualstudio.com/es-eu">Visual Studio Code</a></h3><p>Actualmente, este es el principal editor de código para el desarrollo web, fue creado por Microsoft en el año 2015 y cuenta con resaltado de sintaxis, autocompletado, extensiones, soporte para la depuración y está disponible tanto para Windows, Linux, MacOS y hace poco también para la web.</p><!--kg-card-begin: markdown--><p><img src="https://www.sublimetext.com/images/og-full.jpg" alt="og-full" width="600" height="400" loading="lazy"></p>
<!--kg-card-end: markdown--><h3 id="sublime-text"><a href="https://www.sublimetext.com/">Sublime Text</a> </h3><p>Fue inicialmente una extensión de Vim (otro editor de código), al igual que VS Code cuenta con extensiones, resaltado de sintaxis, está disponible para Windows, Linux y MacOS. Cuando lo descargas cuentas con una prueba para que lo evalúes de forma gratuita para, luego, comprar su licencia. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/flat-750x-075-f-pad-750x1000-f8f8f8.u1.jpg" class="kg-image" alt="flat-750x-075-f-pad-750x1000-f8f8f8.u1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/flat-750x-075-f-pad-750x1000-f8f8f8.u1.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/flat-750x-075-f-pad-750x1000-f8f8f8.u1.jpg 750w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><h3 id="vim"><a href="https://www.vim.org/">Vim</a></h3><p>Vim es un editor de código un tanto <strong>peculiar, ya que</strong> no se ejecuta de manera <em>visual</em>, sino directamente en la terminal. Fue creado en 1991 y cuenta con resaltado de sintaxis, autocompletado y extensiones. Esta disponible para Windows, Linux y MacOS. </p><!--kg-card-begin: markdown--><p><img src="https://brackets.io/img/hero@2x.png" alt="hero@2x" width="600" height="400" loading="lazy"></p>
<!--kg-card-end: markdown--><h3 id="brackets"><a href="https://brackets.io/">Brackets</a></h3><p>Brackets es un editor de código web, cuenta con soporte para Linux MacOS y Windows, pero su principal fuerte es la web, fue creado por adobe en 2014. </p><!--kg-card-begin: markdown--><p><img src="https://www.jetbrains.com/webstorm/img/overview/webstorm-overview.png" alt="webstorm-overview" width="600" height="400" loading="lazy"></p>
<!--kg-card-end: markdown--><h3 id="webstorm"><a href="https://www.jetbrains.com/es-es/webstorm/">WebStorm</a></h3><p> WebStorm no es tanto un editor de código, es un IDE (Entorno De Desarrollo Integrado en inglés) pero igualmente cabe en esta lista. Fue creado por Jetbrains y se basa en el muy conocido IntelliJ IDEA, cuenta con resaltado de sintaxis, autocompletado, extensiones y pruebas unitarias de JavaScript. Está disponible para Windows Linux y MacOS. Puedes usarlo gratis con una prueba de 30 días para después comprar su licencia. También cuenta con una versión gratis para estudiantes y maestros. </p><figure class="kg-card kg-image-card"><img src="https://www.islabit.com/wp-content/uploads/2021/08/validar-XML-XDS-Notepad.png" class="kg-image" alt="Cómo validar XML con XDS en Notepad++ - islaBit" width="600" height="400" loading="lazy"></figure><h3 id="notepad-"><a href="https://notepad-plus-plus.org/downloads/ ">Notepad++</a></h3><p>Fue creado en 2003, cuenta con soporte para varios lenguajes de programación y cuenta con resaltado de sintaxis. Esta disponible para Windows, Linux y MacOS. </p><h2 id="recapitulando">Recapitulando </h2><p>Este ha sido mi recuento de los que son para mí, los mejores editores de código, espero te sirva de ayuda en tu camino como desarrollador web. Si te ha resultado útil, toma en cuenta <a href="https://twitter.com/DriftingL_?t=VyPUOGXqnbbD4JRmsEdN0Q&amp;s=09">seguirme en Twitter</a>. Me lees en la próxima. ?</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear objetos en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Kaashan Hussain Artículo original How to create objects in JavaScript [https://www.freecodecamp.org/news/a-complete-guide-to-creating-objects-in-javascript-b0e2450655e8/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] Todos tratamos con objetos de una forma u otra al escribir código en un lenguaje de programación. En JavaScript, los objetos nos proporcionan una forma de almacenar, manipular y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-objetos-en-javascript/</link>
                <guid isPermaLink="false">622bc2ea7fbf230853a584e5</guid>
                
                    <category>
                        <![CDATA[ Tecnología ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Mon, 21 Mar 2022 02:12:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/03/1_S6zT7E9uySUcbD69OPQR8A.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>Kaashan Hussain<br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/a-complete-guide-to-creating-objects-in-javascript-b0e2450655e8/">How to create objects in JavaScript</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>Todos tratamos con objetos de una forma u otra al escribir código en un lenguaje de programación. En JavaScript, los objetos nos proporcionan una forma de almacenar, manipular y enviar datos a través de la red.</p><p>Hay muchas maneras en que los objetos en JavaScript difieren de los objetos en otros lenguajes de programación convencionales, como Java. Trataré de cubrir eso en otro tema. Aquí, vamos a centrarnos solo en las diversas formas en que JavaScript nos permite crear objetos.</p><p>En JavaScript, piensa en los objetos como una colección de pares 'clave:valor'. Esto nos lleva a la primera y más popular forma de crear objetos en JavaScript. </p><p>Empecemos con esto.</p><h4 id="1-creaci-n-de-objetos-mediante-la-sintaxis-literal-de-objetos"><strong>1.</strong> Creación de objetos mediante la sintaxis literal de objetos</h4><p>Esto es realmente sencillo. Todo lo que tienes que hacer es lanzar tus pares clave-valor separados por ':' dentro de un conjunto de llaves ({ }) y tu objeto está listo para ser servido (o consumido), como abajo:</p><pre><code class="language-js">const person = {
  firstName: 'testFirstName',
  lastName: 'testLastName'
};</code></pre><p>Esta es la forma más sencilla y popular de crear objetos en JavaScript.</p><h4 id="2-creaci-n-de-objetos-con-la-palabra-clave-new"><strong>2.</strong> Creación de objetos con la palabra clave "new"</h4><p>Este método de creación de objetos se asemeja a la forma en que se crean los objetos en los lenguajes basados en clases, como Java. Por cierto, a partir de ES6, las clases son nativas de JavaScript también y veremos la creación de objetos mediante la definición de clases hacia el final de este artículo. Así que, para crear un objeto usando la palabra clave 'new', necesitas tener una función constructora.</p><p>Aquí hay 2 maneras de utilizar el patrón de la palabra clave "new" -</p><p><strong><strong>a) </strong>Uso de la palabra clave "new" con la función constructora de objetos incorporada</strong></p><p>Para crear un objeto, utilice la palabra clave new con el constructor <code>Object()</code>, así:</p><pre><code class="language-js">const person = new Object();</code></pre><p>Ahora, para añadir propiedades a este objeto, tenemos que hacer algo así:</p><pre><code class="language-js">person.firstName = 'testFirstName';
person.lastName = 'testLastName';</code></pre><p>Puede que te hayas dado cuenta de que este método es un poco más largo de escribir. Además, esta práctica no es recomendable, ya que hay una resolución de ámbito que ocurre detrás de las escenas para encontrar si la función del constructor es incorporada o definida por el usuario.</p><p><strong><strong>b) </strong>Uso de 'new' con función constructora definida por el usuario</strong></p><p>El otro problema con el enfoque de usar la función constructora 'Object' resulta del hecho de que cada vez que creamos un objeto, tenemos que añadir manualmente las propiedades al objeto creado.<br><br>¿Qué pasaría si tuviéramos que crear cientos de objetos persona? Puedes imaginar el dolor ahora. Así que, para librarnos de añadir manualmente las propiedades a los objetos, creamos funciones personalizadas (o definidas por el usuario). Primero creamos una función constructora y luego usamos la palabra clave 'new' para obtener objetos:</p><pre><code class="language-js">function Person(fname, lname) {
  this.firstName = fname;
  this.lastName = lname;
}</code></pre><p>Ahora, cada vez que quieras un objeto <code>Person</code>, simplemente haz esto:</p><pre><code class="language-js">const personOne = new Person('testFirstNameOne', 'testLastNameOne');
const personTwo = new Person('testFirstNameTwo', 'testLastNameTwo');</code></pre><h4 id="3-uso-de-object-create-para-crear-nuevos-objetos"><strong>3. </strong>Uso de Object.create() para crear nuevos objetos</h4><p>Este patrón es muy útil cuando se nos pide crear objetos a partir de otros objetos existentes y no utilizar directamente la sintaxis de la palabra clave 'new'. Veamos cómo utilizar este patrón. Como se indica en <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Object/create">MDN</a>:</p><blockquote>El método <code>Object.create()</code> crea un nuevo objeto, utilizando un objeto existente como prototipo del nuevo objeto creado.</blockquote><p>Para entender el método <code><strong>Object.create</strong></code>, basta con recordar que toma dos parámetros. El primer parámetro es un objeto obligatorio que sirve como prototipo del nuevo objeto a crear. El segundo parámetro es un objeto opcional que contiene las propiedades que se añadirán al nuevo objeto.<br><br>No vamos a profundizar en los prototipos y las cadenas de herencia ahora para mantener nuestro enfoque en el tema. Pero como punto rápido, puedes pensar en los prototipos como objetos de los que otros objetos pueden tomar prestadas las propiedades/métodos que necesitan.<br><br>Imagina que tienes una organización representada por <code>orgObject</code></p><pre><code>const orgObject = { company: 'ABC Corp' };</code></pre><p>Y quieres crear empleados para esta organización. Claramente, usted quiere todos los objetos de los empleados.</p><pre><code class="language-js">const employee = Object.create(orgObject, { name: { value: 'EmployeeOne' } });

console.log(employee); // { company: "ABC Corp" }
console.log(employee.name); // "EmployeeOne"</code></pre><h4 id="4-uso-de-object-assign-para-crear-nuevos-objetos"><strong>4. </strong>Uso de Object.assign() para crear nuevos objetos</h4><p>¿Qué pasa si queremos crear un objeto que necesita tener propiedades de más de un objeto? <code>Objeto.assign()</code> nos ayuda.</p><p>Como se indica en <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Object/assign">MDN</a>:</p><blockquote>El <code>Object.assign()</code> se utiliza para copiar los valores de todas las propiedades propias enumerables de uno o más objetos de origen a un objeto de destino. Devolverá el objeto de destino.</blockquote><p>El método <code>Object.assign()</code> puede tomar cualquier número de objetos como parámetros. El primer parámetro es el objeto que creará y devolverá. El resto de los objetos que se le pasen se utilizarán para copiar las propiedades en el nuevo objeto. Vamos a entenderlo extendiendo el ejemplo anterior que vimos.</p><p>Supongamos que tiene dos objetos como se muestra a continuación:</p><pre><code class="language-js">const orgObject = { company: 'ABC Corp' }
const carObject = { carName: 'Ford' }</code></pre><p>Ahora, desea un objeto empleado de 'ABC Corp' que conduzca un automóvil 'Ford'. Puede hacerlo con la ayuda de <code>Object.assign</code> lo siguiente:</p><p><code>const employee = Object.assign({}, orgObject, carObject);</code></p><p>Ahora, obtienes un <code>employee</code>objeto que tiene <code>company</code>y <code>carName</code>como su propiedad.</p><pre><code class="language-js">console.log(employee); // { carName: "Ford", company: "ABC Corp" }</code></pre><h4 id="5-usar-clases-de-es6-para-crear-objetos"><strong>5. Usar clases de ES6 para crear objetos</strong></h4><p>Notará que este método es similar al uso de 'nuevo' con la función de constructor definida por el usuario. Las funciones del constructor ahora se reemplazan por clases, ya que son compatibles con las especificaciones de ES6. Veamos el código ahora.</p><pre><code class="language-js">class Person {
  constructor(fname, lname) {
    this.firstName = fname;
    this.lastName = lname;
  }
}

const person = new Person('testFirstName', 'testLastName');

console.log(person.firstName); // testFirstName
console.log(person.lastName); // testLastName

</code></pre><p>Estas son todas las formas que conozco para crear objetos en JavaScript. Espero que hayas disfrutado esta publicación y ahora entiendas cómo crear objetos.</p><p><em><em>¡Gracias por su tiempo para leer este artículo</em>!</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo instalar Python 3 en Mac - Tutorial de actualización de la instalación de Brew ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Quincy Larson [https://www.freecodecamp.org/news/author/quincylarson/] Artículo original How to Install Python 3 on Mac – Brew Install Update Tutorial [https://www.freecodecamp.org/news/python-version-on-mac-update/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] MacOS viene con Python preinstalado. Pero es la versión 2.7 de Python, que ahora está obsoleta (abandonada por la comunidad de desarrolladores ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-instalar-python-3-en-mac-tutorial-de-actualizacion-de-la-instalacion-de-brew/</link>
                <guid isPermaLink="false">622527e45e4d0b08bcc781bc</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Tue, 15 Mar 2022 01:40:22 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/03/606ba4e1d5756f080ba94d0c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/quincylarson/">Quincy Larson</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/python-version-on-mac-update/">How to Install Python 3 on Mac – Brew Install Update Tutorial</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>MacOS viene con Python preinstalado. Pero es la versión 2.7 de Python, que ahora está obsoleta (abandonada por la comunidad de desarrolladores de Python).</p><p>Toda la comunidad de Python ha pasado a utilizar Python 3.x (la versión actual al escribir esto es la 3.9). Y Python 4.x saldrá pronto, pero será completamente compatible con las versiones anteriores.</p><p>Si intentas ejecutar Python desde tu terminal de MacOS, verás incluso esta advertencia:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/freecodecamp_-_freecodecamp_MacBook-Pro_-___-_-zsh_-_84-24-1.png" class="kg-image" alt="freecodecamp_-_freecodecamp_MacBook-Pro_-___-_-zsh_-_84-24-1" width="600" height="400" loading="lazy"><figcaption>ADVERTENCIA: No se recomienda Python 2.7. Esta versión se incluye en macOS por compatibilidad con el software heredado. Las futuras versiones de macOS no incluirán Python 2.7. En su lugar, se recomienda la transición al uso de 'python3' desde el Terminal.</figcaption></figure><p>Hasta que Apple decida establecer Python 3.x, como la versión por defecto, vas a tener que instalarlo tú mismo.</p><h2 id="un-solo-comando-para-ejecutar-python-3">Un solo comando para ejecutar Python 3</h2><p>Para algunos de los que están leyendo esto, este comando puede ser suficiente. Puedes ejecutar Python 3 usando este comando (con el 3 al final).</p><pre><code class="language-bash">python3</code></pre><p>Si eso es todo lo que has venido a buscar, no te preocupes. Que pases un buen día y que seas feliz codificando.</p><p>Pero si quieres un sistema de control de versiones de Python adecuado para hacer un seguimiento de varias versiones - y tener un control preciso sobre qué versión utilizas - este tutorial te mostrará exactamente cómo lograrlo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/Megaman-810x600.jpeg" class="kg-image" alt="Megaman-810x600" width="600" height="400" loading="lazy"><figcaption>Por cierto, si te preguntas por qué sigo refiriéndome a Python 3.x, la x es un sustituto de las subversiones (o versiones puntuales, como las llaman los desarrolladores).</figcaption></figure><h2 id="c-mo-instalar-homebrew-en-mac">Cómo instalar Homebrew en Mac</h2><p>Primero necesitas instalar Homebrew, un potente gestor de paquetes para Mac.<br><br>Abre tu terminal. Puedes hacerlo utilizando el Spotlight de MacOS (comando+espacio) y escribiendo "terminal".<br><br>Ahora que estás en una línea de comandos, puedes instalar la última versión de Homebrew ejecutando este comando:</p><pre><code class="language-bash">/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</code></pre><p>Su terminal le pedirá acceso a nivel de superusuario. Tendrá que escribir su contraseña para ejecutar este comando. Esta es la misma contraseña que escribes cuando te conectas a tu Mac. Escríbala y pulse Intro.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/freecodecamp_-__bin_bash_-c__-__bin_bash_-_sudo_-_bash_-c____bin_bash_012set_-u_012_012abort___-_012__printf___s_n_______012__exit_1_012-_012_012if___-z___-BASH_VERSION_--_____then_012__abort__Bash_is_required_to_interpret_this_script___012.png" class="kg-image" alt="freecodecamp_-__bin_bash_-c__-__bin_bash_-_sudo_-_bash_-c____bin_bash_012set_-u_012_012abort___-_012__printf___s_n_______012__exit_1_012-_012_012if___-z___-BASH_VERSION_--_____then_012__abort__Bash_is_required_to_interpret_this_script___012" width="600" height="400" loading="lazy"><figcaption>Una captura de pantalla de mi terminal fuertemente personalizada. Su terminal probablemente se verá diferente de esto.</figcaption></figure><p>Homebrew te pedirá que confirmes que quieres instalar lo siguiente. Tienes que pulsar enter para continuar. (O pulsar cualquier otra tecla si te acobardas).</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/freecodecamp_-__bin_bash_-c__-__bin_bash_-_bash_-c____bin_bash_012set_-u_012_012abort___-_012__printf___s_n_______012__exit_1_012-_012_012if___-z___-BASH_VERSION_--_____then_012__abort__Bash_is_required_to_interpret_this_script___012fi_012_.png" class="kg-image" alt="freecodecamp_-__bin_bash_-c__-__bin_bash_-_bash_-c____bin_bash_012set_-u_012_012abort___-_012__printf___s_n_______012__exit_1_012-_012_012if___-z___-BASH_VERSION_--_____then_012__abort__Bash_is_required_to_interpret_this_script___012fi_012_" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-instalar-pyenv-para-gestionar-las-versiones-de-python">Cómo instalar pyenv para gestionar las versiones de Python</h2><p>Ahora tomemos un momento para instalar PyEnv. Esta biblioteca te ayudará a cambiar entre diferentes versiones de Python (en caso de que necesites ejecutar Python 2.x por alguna razón, y en previsión de la llegada de Python 4.0).<br><br>Ejecuta este comando:</p><pre><code class="language-bash">brew install pyenv</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/freecodecamp_-_freecodecamp_MacBook-Pro_-___-_-zsh_-_90-24.png" class="kg-image" alt="freecodecamp_-_freecodecamp_MacBook-Pro_-___-_-zsh_-_90-24" width="600" height="400" loading="lazy"><figcaption>Instalación de PyEnv</figcaption></figure><p>Ahora puedes instalar la última versión de Python.</p><h2 id="c-mo-utilizar-pyenv-para-instalar-python-o-actualizar-su-versi-n-de-python">Cómo utilizar pyenv para instalar Python o actualizar su versión de Python</h2><p>Ahora sólo tienes que ejecutar el siguiente comando:</p><pre><code class="language-bash">pyenv install 3.9.2 </code></pre><p>Tenga en cuenta que puede sustituir la versión 3.9.2 por la última versión de Python. Por ejemplo, una vez que salga Python 4.0.0, puedes ejecutar esto:</p><pre><code class="language-bash">pyenv install 4.0.0</code></pre><h2 id="soluci-n-de-problemas-de-instalaci-n-de-pyenv">Solución de problemas de instalación de pyenv</h2><p>Si te encuentras con un error de que "el compilador de C no puede crear ejecutables", la forma más sencilla de resolverlo es reinstalar Xcode de Apple.<br><br>Xcode es una herramienta creada por Apple que incluye todas las bibliotecas C y otras herramientas que Python utiliza cuando se ejecuta en MacOS. Xcode ocupa la friolera de 11 gigabytes, pero querrás estar al día. Es posible que quieras ejecutar esto mientras duermes.<br><br><a href="https://developer.apple.com/xcode/">Puedes obtener la última versión de Xcode de Apple aquí</a>. Tuve que hacer esto después de actualizar a MacOS Big Sur, pero una vez que lo hice, todos los siguientes comandos funcionaron bien. Sólo tienes que volver a ejecutar el <code>pyenv install 3.9.2</code> anterior y ahora debería funcionar.</p><h2 id="c-mo-configurar-el-path-de-macos-para-pyenv-bash-o-zsh-">Cómo configurar el PATH de MacOS para pyenv (Bash o ZSH)</h2><p>Primero tienes que actualizar tu ruta Unix para preparar el camino para que PyEnv pueda interactuar con tu sistema.<br><br>Esta es una larga explicación de cómo funciona PATH en MacOS (y Unix), directamente desde el repo de <a href="https://github.com/pyenv/pyenv">GitHub de pyenv</a>.</p><blockquote>Cuando ejecutas un comando como <code>python</code> o <code>pip</code>, tu sistema operativo busca en una lista de directorios para encontrar un archivo ejecutable con ese nombre. Esta lista de directorios vive en una variable de entorno llamada <code>PATH</code>, con cada directorio de la lista separado por dos puntos:</blockquote><pre><code>/usr/local/bin:/usr/bin:/bin
</code></pre><blockquote>Los directorios en <code>PATH</code> &nbsp;se buscan de izquierda a derecha, por lo que un ejecutable que coincida en un directorio al principio de la lista tiene prioridad sobre otro al final. En este ejemplo, se buscará primero en el directorio <code>/usr/local/bin</code>, luego en <code>/usr/bin</code> y después en <code>/bin.then/bin</code>.</blockquote><p>Y aquí está su explicación de lo que es un Shim. Vuelvo a citarlos extensamente porque realmente no puedo explicarlo mejor.</p><blockquote>pyenv funciona insertando un directorio de calzas al frente de su <code>PATH</code> :</blockquote><pre><code>$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin
</code></pre><blockquote>A través de un proceso llamado rehacer, pyenv mantiene calzas en ese directorio para que coincida con cada comando de Python a través de cada versión instalada de Python-<code>python</code>, <code>pip</code>, y así sucesivamente.</blockquote><blockquote>Los shims son ejecutables ligeros que simplemente pasan su comando a pyenv.</blockquote><p>A continuación se explica cómo actualizar su <code>.bash_profile</code> en Bash (que se instala en MacOS por defecto):</p><pre><code>echo 'export PYENV_ROOT="$HOME/.pyenv"' &gt;&gt; ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' &gt;&gt; ~/.bash_profile</code></pre><p>O si has instalado ZSH (o OhMyZSH) como yo, querrás editar el archivo .zshrc en su lugar:</p><pre><code>echo 'export PYENV_ROOT="$HOME/.pyenv"' &gt;&gt; ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' &gt;&gt; ~/.zshrc</code></pre><p>Entonces querrás añadir PyEnv Init a tu terminal. Ejecuta este comando si estás usando Bash (de nuevo, este es el predeterminado con MacOS):</p><pre><code>echo -e 'if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then\n  eval "$(pyenv init -)"\nfi' &gt;&gt; ~/.bash_profile
</code></pre><p>O ejecuta este comando si estás usando ZSH:</p><pre><code>echo -e 'if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then\n  eval "$(pyenv init --path)"\n  eval "$(pyenv init -)"\nfi' &gt;&gt; ~/.zshrc</code></pre><p>Ahora reinicie su terminal ejecutando este comando:</p><pre><code>reset</code></pre><h2 id="c-mo-establecer-una-versi-n-de-python-por-defecto-global-bash-o-zsh-">Cómo establecer una versión de Python por defecto global (Bash o ZSH)</h2><p>Puedes configurar la última versión de Python para que sea global, lo que significa que será la versión por defecto de Python que utiliza MacOS cuando ejecutas aplicaciones de Python.<br><br>Ejecuta este comando:</p><pre><code class="language-bash">pyenv global 3.9.2</code></pre><p>De nuevo, puedes sustituir la versión 3.9.2 por la más reciente.<br><br>Ahora puedes verificar que esto ha funcionado comprobando la versión global de Python:</p><pre><code class="language-bash">pyenv versions</code></pre><p>Debería ver esta salida:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/freecodecamp_-_freecodecamp_MacBook-Pro_-_-zsh_-_84-24.png" class="kg-image" alt="freecodecamp_-_freecodecamp_MacBook-Pro_-_-zsh_-_84-24" width="600" height="400" loading="lazy"><figcaption>El * significa que la versión es ahora la global por defecto</figcaption></figure><h2 id="el-paso-final-cerrar-el-terminal-y-reiniciarlo">El paso final: Cerrar el terminal y reiniciarlo</h2><p>Una vez que hayas reiniciado tu terminal, ejecuta el comando <code>python</code> y lanzarás la nueva versión de Python en lugar de la antigua.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/freecodecamp_-_python_-_python_-_python_-_119-36.png" class="kg-image" alt="freecodecamp_-_python_-_python_-_python_-_119-36" width="600" height="400" loading="lazy"><figcaption>Sí. Python 3.9.2 y sin advertencias de desaprobación</figcaption></figure><p>Enhorabuena. Gracias por leer esto, y feliz codificación.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Debounce: Cómo retrasar una función en JavaScript (Ejemplo JS ES6) ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Ondrej Polesny [https://www.freecodecamp.org/news/author/ondrej/] Artículo original Debounce – How to Delay a Function in JavaScript (JS ES6 Example) [https://www.freecodecamp.org/news/javascript-debounce-example/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] En JavaScript, una función debounce se asegura de que su código sólo se active una vez por cada entrada del usuario. Las ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/debounce-como-retrasar-una-funcion-en-javascript-ejemplo-js-es6/</link>
                <guid isPermaLink="false">6211cb70ac7bdf0914b1f8c1</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Mon, 14 Mar 2022 14:48:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/02/teaser-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/ondrej/">Ondrej Polesny</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/javascript-debounce-example/">Debounce – How to Delay a Function in JavaScript (JS ES6 Example)</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>En JavaScript, una función debounce se asegura de que su código sólo se active una vez por cada entrada del usuario. Las sugerencias de los cuadros de búsqueda, el autoguardado de los campos de texto y la eliminación de los clics dobles son casos de uso de la función debounce.<br><br>En este tutorial, aprenderemos a crear una función debounce en JavaScript.</p><h2 id="-qu-es-debounce">¿Qué es <strong>debounce?</strong></h2><p>El término <strong><strong>debounce</strong></strong> proviene de la electrónica. Cuando se pulsa un botón, por ejemplo, en el mando a distancia del televisor, la señal viaja hasta el microchip del mando con tanta rapidez que, antes de que consiga soltar el botón, rebota y el microchip registra su "clic" varias veces.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/01/debounce-button.png" class="kg-image" alt="debounce-button" width="600" height="400" loading="lazy"></figure><p>Para mitigar esto, una vez que se recibe una señal del botón, el microchip deja de procesar las señales del botón durante unos microsegundos mientras es físicamente imposible que lo vuelva a pulsar.</p><h2 id="debounce-en-javascript"><strong>Debounce en JavaScript</strong></h2><p>En JavaScript, el caso de uso es similar. Queremos activar una función, pero sólo una vez por caso de uso.</p><p>Digamos que queremos mostrar sugerencias para una consulta de búsqueda, pero sólo después de que el visitante haya terminado de escribirla.<br><br>O queremos guardar los cambios en un formulario, pero sólo cuando el usuario no esté trabajando activamente en esos cambios, ya que cada "guardado" nos cuesta un viaje a la base de datos.</p><p>Y mi favorito: algunos se acostumbraron mucho a Windows 95 y ahora hacen doble clic en todo ?.<br><br>Esta es una simple implementación de la función debounce (<a href="https://codepen.io/ondrabus/pen/WNGaVZN">CodePen aquí</a>):</p><pre><code class="language-js">function debounce(func, timeout = 300){
  let timer;
  return (...args) =&gt; {
    clearTimeout(timer);
    timer = setTimeout(() =&gt; { func.apply(this, args); }, timeout);
  };
}
function saveInput(){
  console.log('Saving data');
}
const processChange = debounce(() =&gt; saveInput());
</code></pre><p>Se puede utilizar en un input:</p><pre><code class="language-html">&lt;input type="text" onkeyup="processChange()" /&gt;
</code></pre><p>O en un botón:</p><pre><code class="language-html">&lt;button onclick="processChange()"&gt;Click me&lt;/button&gt;
</code></pre><p>O un evento en la ventana:</p><pre><code class="language-js">window.addEventListener("scroll", processChange);
</code></pre><p>Y en otros elementos como una simple función JS.<br><br>¿Qué ocurre aquí? El <code>debounce</code> es una función especial que se encarga de dos tareas:</p><ul><li>Asignación de un ámbito para la variable del temporizador.</li><li>Programar la función para que se active en un momento determinado.</li></ul><p>Vamos a explicar cómo funciona esto en el primer caso de uso con la entrada de texto.<br><br>Cuando un visitante escribe la primera letra y suelta la tecla, el <code>debounce</code> primero reinicia el temporizador con <code>clearTimeout(timer)</code>. En este punto, el paso no es necesario, ya que no hay nada programado todavía. Luego programa la función proporcionada -<code>saveInput()</code>- para ser invocada en 300 ms.</p><p>Pero digamos que el visitante sigue escribiendo, por lo que cada liberación de la tecla desencadena el <code>debounce</code> de nuevo. Cada invocación necesita reiniciar el temporizador, o, en otras palabras, cancelar los planes anteriores con <code>saveInput()</code>, y reprogramarlo para un nuevo tiempo-300 ms en el futuro. Esto continúa mientras el visitante siga pulsando las teclas por debajo de los 300 ms.<br><br>La última programación no se borrará, por lo que finalmente se llamará a <code>saveInput()</code>.</p><h2 id="al-rev-s-c-mo-ignorar-los-acontecimientos-posteriores">Al revés: ¿Cómo ignorar los acontecimientos posteriores?</h2><p>Eso está bien para activar el autoguardado o mostrar sugerencias. ¿Pero qué pasa con el caso de uso con múltiples clics de un solo botón? No queremos esperar al último clic, sino registrar el primero e ignorar el resto (<a href="https://codepen.io/ondrabus/pen/bGwmXjN">CodePen Aquí</a>).</p><pre><code class="language-js">function debounce_leading(func, timeout = 300){
  let timer;
  return (...args) =&gt; {
    if (!timer) {
      func.apply(this, args);
    }
    clearTimeout(timer);
    timer = setTimeout(() =&gt; {
      timer = undefined;
    }, timeout);
  };
}
</code></pre><p>Aquí activamos la función <code>saveInput()</code> en la primera llamada <code>debounce_leading</code> causada por el primer clic del botón. Programamos la destrucción del temporizador para 300 ms. Cada clic de botón posterior dentro de ese marco de tiempo ya tendrá el temporizador definido y sólo empujará la destrucción 300 ms hacia el futuro.</p><h2 id="implementaciones-de-debounce-en-las-librer-as">Implementaciones de debounce en las librerías</h2><p>En este artículo, te mostré cómo implementar una función de debounce en JavaScript y utilizarla para, bueno, rebotar eventos desencadenados por elementos del sitio web.</p><p>Sin embargo, no es necesario que uses tu propia implementación de debounce en tus proyectos si no quieres. Librerías JS ampliamente utilizadas ya contienen su implementación. Aquí hay algunos ejemplos:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: 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-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(24, 26, 27); color: rgb(218, 215, 210); 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;"><tbody 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-size: 16px; vertical-align: baseline;"><tr 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-size: 16px; vertical-align: baseline;"><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: italic; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);">Library</strong></em></td><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: italic; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);">Example</strong></em></td></tr><tr 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-size: 16px; vertical-align: baseline;"><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><a href="http://benalman.com/projects/jquery-throttle-debounce-plugin/" style="box-sizing: inherit; color: var(--darkreader-text--gray90); 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-size: 16px; vertical-align: baseline; background-color: transparent; text-decoration: underline; cursor: pointer; word-break: break-word;">jQuery (via library)</a></td><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">$.debounce(300, saveInput);</code></td></tr><tr 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-size: 16px; vertical-align: baseline;"><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><a href="https://lodash.com/docs/4.17.15#debounce" style="box-sizing: inherit; color: var(--darkreader-text--gray90); 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-size: 16px; vertical-align: baseline; background-color: transparent; text-decoration: underline; cursor: pointer; word-break: break-word;">Lodash</a></td><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">_.debounce(saveInput, 300);</code></td></tr><tr 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-size: 16px; vertical-align: baseline;"><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><a href="https://underscorejs.org/#debounce" style="box-sizing: inherit; color: var(--darkreader-text--gray90); 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-size: 16px; vertical-align: baseline; background-color: transparent; text-decoration: underline; cursor: pointer; word-break: break-word;">Underscore</a></td><td data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; --darkreader-inline-border-top:#8c8273; --darkreader-inline-border-right:#8c8273; --darkreader-inline-border-bottom:#8c8273; --darkreader-inline-border-left:#8c8273;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">_.debounce(saveInput, 300);</code></td></tr></tbody></table><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript map: Cómo utilizar la función JS .map() (método de Arreglo) ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Nathan Sebhastian [https://www.freecodecamp.org/news/author/nsebhastian/] Artículo original JavaScript Map – How to Use the JS .map() Function (Array Method) [https://www.freecodecamp.org/news/javascript-map-how-to-use-the-js-map-function-array-method/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] A veces es necesario tomar un arreglo y aplicar algún procedimiento a sus elementos para obtener un nuevo arreglo con elementos modificados. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/javascript-map-como-utilizar-la-funcion-js-map-metodo-de-arreglo/</link>
                <guid isPermaLink="false">6211c1afac7bdf0914b1f7fd</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Wed, 23 Feb 2022 16:45:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/02/javascript-map-function.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/nsebhastian/">Nathan Sebhastian</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/javascript-map-how-to-use-the-js-map-function-array-method/">JavaScript Map – How to Use the JS .map() Function (Array Method)</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>A veces es necesario tomar un arreglo y aplicar algún procedimiento a sus elementos para obtener un nuevo arreglo con elementos modificados.<br><br>En lugar de iterar manualmente sobre el arreglo usando un bucle, puedes simplemente usar el método incorporado <code>Array.map()</code>.<br><br>El método <code>Array.map()</code> te permite iterar sobre un arreglo y modificar sus elementos utilizando una función callback. La función callback se ejecutará entonces en cada uno de los elementos del arreglo.<br><br>Por ejemplo, supón que tienes el siguiente elemento de arreglo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [3, 4, 5, 6];</code></pre><figcaption>Un simple arreglo de JavaScript</figcaption></figure><p>Ahora imagina que tienes que multiplicar cada uno de los elementos del arreglo por 3. Podrías considerar usar un bucle <code>for</code> como el siguiente:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [3, 4, 5, 6];

for (let i = 0; i &lt; arr.length; i++){
  arr[i] = arr[i] * 3;
}

console.log(arr); // [9, 12, 15, 18]</code></pre><figcaption>Iterar sobre un arreglo utilizando el bucle for</figcaption></figure><p>Pero en realidad puedes utilizar el método <code>Array.map()</code> para conseguir el mismo resultado. He aquí un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [3, 4, 5, 6];

let modifiedArr = arr.map(function(element){
    return element *3;
});

console.log(modifiedArr); // [9, 12, 15, 18]</code></pre><figcaption>Iterar sobre un arreglo utilizando el método map()</figcaption></figure><p>El método <code>Array.map()</code> se utiliza comúnmente para aplicar algunos cambios a los elementos, ya sea multiplicando por un número específico como en el código anterior, o haciendo cualquier otra operación que pueda necesitar para su aplicación.</p><h3 id="c-mo-utilizar-map-sobre-un-arreglo-de-objetos">Cómo utilizar map() sobre un arreglo de objetos</h3><p>Por ejemplo, puedes tener un arreglo de objetos que almacene los valores de <code>firstName</code> y <code>lastName</code> de tus amigos de la siguiente manera:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let users = [
  {firstName : "Susan", lastName: "Steward"},
  {firstName : "Daniel", lastName: "Longbottom"},
  {firstName : "Jacob", lastName: "Black"}
];

</code></pre><figcaption>Un arreglo de objetos</figcaption></figure><p>Puedes utilizar el método <code>map()</code> para iterar sobre el arreglo y unir los valores de <code>firstName</code> y <code>lastName</code> de la siguiente manera:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let users = [
  {firstName : "Susan", lastName: "Steward"},
  {firstName : "Daniel", lastName: "Longbottom"},
  {firstName : "Jacob", lastName: "Black"}
];

let userFullnames = users.map(function(element){
    return `${element.firstName} ${element.lastName}`;
})

console.log(userFullnames);
// ["Susan Steward", "Daniel Longbottom", "Jacob Black"]</code></pre><figcaption>Utiliza el método map() para iterar sobre un arreglo de objetos</figcaption></figure><p>El método <code>map()</code> pasa algo más que un elemento. Veamos todos los argumentos que pasa <code>map()</code> a la función callback.</p><h3 id="la-sintaxis-completa-del-m-todo-map-">La sintaxis completa del método map()</h3><p>La sintaxis del método <code>map()</code> es la siguiente:</p><pre><code class="language-js">arr.map(function(element, index, array){  }, this);</code></pre><p>La <code>function()</code> callback es llamada en cada elemento del arreglo, y el método <code>map()</code> siempre le pasa el <code>element</code> actual, el <code>index</code> del elemento actual y el objeto <code>array</code> completo.<br><br>El argumento <code>this</code> se utilizará dentro de la función callback. Por defecto, su valor es <code>undefined</code>. Por ejemplo, aquí está cómo cambiar el valor de <code>this</code> al número <code>80</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [2, 3, 5, 7]

arr.map(function(element, index, array){
	console.log(this) // 80
}, 80);</code></pre><figcaption>Asignación de valor numérico al método map() en este argumento</figcaption></figure><p>También puedes probar los otros argumentos usando <code>console.log()</code> si te interesa:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [2, 3, 5, 7]

arr.map(function(element, index, array){
    console.log(element);
    console.log(index);
    console.log(array);
    return element;
}, 80);</code></pre><figcaption>Registro de los argumentos para ver los valores</figcaption></figure><p>Y eso es todo lo que necesitas saber sobre el método <code>Array.map()</code>. La mayoría de las veces, solo utilizarás el argumento del <code>element</code> dentro de la función callback, ignorando el resto. Eso es lo que suelo hacer en mis proyectos diarios :)</p><p>Gracias por leer este tutorial</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Introducción al acceso a bases de datos relacionales reactivas con Spring y R2DBC ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Daniel Newton Artículo original An introduction to Reactive Relational Database Access with Spring and R2DBC [https://www.freecodecamp.org/news/an-introduction-to-reactive-relational-database-access-with-spring-and-r2dbc-1a9447d4b122/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] No hace mucho tiempo, se lanzó una variante reactiva del controlador JDBC, conocida como R2DBC.  Permite que los datos se transmitan de forma asincrónica ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/introduccion-al-acceso-a-bases-de-datos-relacionales-reactivas-con-spring-y-r2dbc/</link>
                <guid isPermaLink="false">61dce67017a453092f694a70</guid>
                
                    <category>
                        <![CDATA[ java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Wed, 23 Feb 2022 16:34:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/1_Y5vRk0tztWvhhbWrvJrm-g.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por</strong></strong></strong></strong></strong></strong> </strong></strong>Daniel Newton<br><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong> </strong></strong><a href="https://www.freecodecamp.org/news/an-introduction-to-reactive-relational-database-access-with-spring-and-r2dbc-1a9447d4b122/">An introduction to Reactive Relational Database Access with Spring and R2DBC</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>No hace mucho tiempo, se lanzó una variante reactiva del controlador JDBC, conocida como R2DBC. &nbsp;Permite que los datos se transmitan de forma asincrónica a cualquier punto final que se haya suscrito a él. &nbsp;Usando un controlador reactivo como R2DBC junto con Spring, WebFlux le permite escribir una aplicación completa que maneja la recepción y el envío de datos de forma asíncrona.</p><p>En esta publicación, nos centraremos en la base de datos, desde la conexión a la base de datos hasta finalmente guardar y recuperar datos. &nbsp;Para hacer esto, usaremos Spring Data. &nbsp;Al igual que con todos los módulos de Spring Data, nos proporciona una configuración lista para usar. &nbsp;Esto disminuye la cantidad de código repetitivo que necesitamos escribir para configurar nuestra aplicación. &nbsp;Además de eso, proporciona una capa sobre el controlador de la base de datos que hace que realizar las tareas simples sea más fácil y las tareas más difíciles sean un poco menos dolorosas.</p><p>Para el contenido de esta publicación, estoy haciendo uso de una base de datos de Postgres. &nbsp;En el momento de escribir este artículo, solo Postgres, H2 y Microsoft SQL Server tienen sus propias implementaciones de controladores R2DBC.</p><p>Anteriormente, escribí dos publicaciones sobre bibliotecas Spring Data reactivas, una sobre <a href="https://lankydanblog.com/2017/07/16/a-quick-look-into-reactive-streams-with-spring-data-and-mongodb/">Mongo</a> y otra sobre <a href="https://lankydanblog.com/2017/12/11/reactive-streams-with-spring-data-cassandra/">Cassandra</a>. &nbsp;Es posible que hayas notado que ninguna de estas bases de datos son bases de datos RDBMS. &nbsp;Ahora hay otros controladores reactivos disponibles desde hace mucho tiempo (escribí la publicación de Mongo hace casi 2 años), pero al momento de escribir un controlador reactivo para una base de datos RDBMS todavía es algo bastante nuevo. &nbsp;Esta publicación seguirá un formato similar a aquellos.</p><p>Además, también he escrito un post sobre el uso de Spring Web Flux que mencioné en la introducción. </p><h3 id="dependencias"><strong>Dependencias</strong></h3><p>Hay algunas cosas que señalar aquí.</p><p>Cuanto más utilices Spring Boot, más te acostumbrarás a importar una única dependencia de <code>spring-boot-starter</code> para la cosa que quieras hacer. Por ejemplo, esperaba que hubiera una dependencia de <code>spring-boot-starter-r2dbc</code>, pero lamentablemente no la hay. Todavía.</p><p>Simplemente, esta biblioteca está en el lado más nuevo y en el momento de escribir, no tiene su propio módulo de Spring Boot que contiene las dependencias que necesita junto con una configuración más rápida a través de la configuración automática. Estoy seguro de que estas cosas llegarán en algún momento y harán que la configuración de un controlador R2DBC sea aún más fácil. </p><p>Por ahora, tendremos que rellenar manualmente algunas dependencias adicionales.‌‌‌‌ </p><p>Además, las librerías R2DBC solo tienen versiones Milestone (una prueba más de que son nuevas) por lo que tenemos que asegurarnos de traer el repositorio Spring Milestone. Probablemente, tendré que actualizar este post en el futuro cuando consiga una versión de lanzamiento.</p><h3 id="conexi-n-a-la-base-de-datos">Conexión<strong> a la base de datos</strong></h3><p>Gracias a que Spring Data hace gran parte del trabajo por nosotros, el único Bean que hay que crear manualmente es el <code>ConnectionFactory</code> que contiene los detalles de conexión de la base de datos:</p><p>Lo primero que hay que observar aquí es la extensión de <code>AbstractR2dbcConfiguration</code>. Esta clase contiene un montón de Beans que ya no necesitamos crear manualmente. La implementación de <code>connectionFactory</code> es el único requisito de la clase, ya que es necesario para crear el Bean <code>DatabaseClient</code>. Este tipo de estructura es típica de los módulos de Spring Data, por lo que se siente bastante familiar al probar uno diferente. Además, yo esperaría que esta configuración manual se elimine una vez que la autoconfiguración esté disponible y se dirija únicamente a través del <code>application.properties</code>.</p><p>He incluido la propiedad del <code>port</code> aquí, pero si no has jugado con la configuración de tu Postgres entonces puedes confiar en el valor por defecto de <code>5432</code>.</p><p>Las cuatro propiedades: <code>host</code>, <code>database</code>, <code>username</code> &nbsp;y <code>password</code> definidas por el <code>PostgresqlConnectionFactory</code> son lo mínimo para que funcione. Cualquier cosa menos y experimentará excepciones durante el arranque.</p><p>Usando esta configuración, Spring es capaz de conectarse a una instancia de Postgres en ejecución.</p><p>El último dato a destacar de este ejemplo es el uso de <code>@EnableR2dbcRepositories</code>. Esta anotación indica a Spring que busque cualquier interfaz de repositorio que extienda la interfaz <code>Repository</code> de Spring. Esta se utiliza como interfaz base para instrumentar los repositorios de Spring Data. Veremos esto con más detalle en la siguiente sección. La principal información que debemos extraer de aquí es que debemos utilizar la anotación <code>@EnableR2dbcRepositories</code> &nbsp;para aprovechar al máximo las capacidades de Spring Data.</p><h3 id="creaci-n-de-un-repositorio-de-datos-de-spring">Creación de un repositorio de datos de Spring</h3><p>Como se ha mencionado anteriormente, en esta sección veremos cómo añadir un repositorio de datos de Spring. Estos repositorios son una buena característica de Spring Data, lo que significa que no es necesario escribir un montón de código extra para simplemente escribir una consulta.<br><br>Desafortunadamente, al menos por ahora, Spring R2DBC no puede inferir consultas de la misma manera que lo hacen actualmente otros módulos de Spring Data (estoy seguro de que esto se añadirá en algún momento). Esto significa que tendrá que utilizar la anotación <code>@Query</code> y escribir el SQL a mano. Echemos un vistazo:</p><p>Esta interfaz extiende <code>R2dbcRepository</code>. Este a su vez extiende <code>ReactiveCrudRepository</code> &nbsp;y luego baja a <code>Repository</code>. <code>ReactiveCrudRepository</code> proporciona las funciones CRUD estándar y, por lo que tengo entendido, <code>R2dbcRepository</code> no proporciona ninguna función extra y es, en cambio, una interfaz creada para una mejor denominación de la situación.<br><br><code>R2dbcRepository</code> toma dos parámetros genéricos, uno es la clase de entidad que toma como entrada y produce como salida. El segundo es el tipo de la clave primaria. Por lo tanto, en esta situación, la clase <code>Person</code> está siendo gestionada por el <code>PersonRepository</code> (tiene sentido) y el campo de la clave primaria dentro de <code>Person</code> es un <code>Int</code>.</p><p>Los tipos de retorno de las funciones de esta clase y los proporcionados por <code>ReactiveCrudRepository</code> son <code>Flux</code> y <code>Mono</code> (no se ven aquí). Estos son tipos del Proyecto Reactor que Spring utiliza como tipos de flujo reactivo por defecto. <code>Flux</code> representa un flujo de múltiples elementos mientras que <code>Mono</code> es un único resultado.</p><p>Finalmente, como mencioné antes del ejemplo, cada función está anotada con <code>@Query</code>. La sintaxis es bastante sencilla, siendo el SQL una cadena dentro de la anotación. El <code>$1</code> (<code>$2</code>, <code>$3</code>, etc ... para más entradas) representa el valor introducido en la función. Una vez hecho esto, Spring se encargará del resto y pasará la(s) entrada(s) a su respectivo parámetro de entrada, recogerá los resultados y los asignará a la clase de entidad designada del repositorio.</p><h3 id="una-mirada-muy-r-pida-a-la-entidad">Una mirada muy rápida a la entidad</h3><p>No voy a decir mucho aquí, sino simplemente mostrar la clase <code>Person</code> utilizada por el <code>PersonRepository</code>.</p><p>En realidad, hay un punto que hacer aquí. <code>id</code> se ha hecho anulable y se ha proporcionado un valor por defecto de <code>null</code> para permitir que Postgres genere el siguiente valor adecuado por sí mismo. Si no es anulable y se proporciona un valor de <code>id</code>, Spring intentará ejecutar una actualización en lugar de una inserción al guardar. Hay otras formas de evitar esto, pero creo que esto es suficiente.</p><p>Esta entidad se asignará a la tabla de personas definida a continuación:</p><h3 id="ver-todo-en-acci-n">Ver todo en acción</h3><p>Ahora veamos cómo se hace realmente. A continuación se muestra un código que inserta algunos registros y los recupera de diferentes maneras:<br><br>Una cosa que mencionaré sobre este código. Hay una posibilidad muy real de que se ejecute sin realmente insertar o leer algunos de los registros. Pero, si lo piensas, tiene sentido. Las aplicaciones reactivas están pensadas para hacer cosas de forma asíncrona y, por tanto, esta aplicación ha comenzado a procesar las llamadas a funciones en diferentes hilos. Sin bloquear el hilo principal, estos procesos asíncronos podrían no ejecutarse nunca completamente. Por esta razón, hay algunas llamadas a <code>Thread.sleep</code> en este código, pero las he eliminado del ejemplo para mantener todo ordenado.<br><br>El resultado de la ejecución del código anterior sería algo parecido a lo siguiente:</p><pre><code>[ main] onSubscribe(FluxConcatMap.ConcatMapImmediate)[ main] request(unbounded)[actor-tcp-nio-1] onNext(Person(id=35, name=Dan Newton, age=25))[actor-tcp-nio-1] onNext(Person(id=36, name=Laura So, age=23))[actor-tcp-nio-1] onComplete()[actor-tcp-nio-2] findAll - Person(id=35, name=Dan Newton, age=25)[actor-tcp-nio-2] findAll - Person(id=36, name=Laura So, age=23)[actor-tcp-nio-4] findAllByName - Person(id=36, name=Laura So, age=23)[actor-tcp-nio-5] findAllByAge - Person(id=35, name=Dan Newton, age=25)</code></pre><p>Hay que tener en cuenta algunas cosas:</p><ul><li><code>onSubscribe</code> y <code>request</code> ocurren en el hilo principal desde el que se llamó al <code>Flux</code>. Solo <code>saveAll</code> &nbsp;produce esto, ya que ha incluido la función de <code>log</code>. Añadir esto a las otras llamadas habría llevado al mismo resultado de registro en el hilo principal.</li><li>La ejecución contenida en la función de suscripción y los pasos internos del <code>Flux</code> se ejecutan en hilos separados.</li></ul><p>Esto no es ni de lejos una representación real de cómo usarías los Streams Reactivos en una aplicación real, pero esperamos que demuestre cómo usarlos y dé una idea de cómo se ejecutan.</p><h3 id="conclusi-n">Conclusión</h3><p>En conclusión, los Reactive Streams han llegado a algunas bases de datos RDBMS gracias al driver R2DBC y a Spring Data que construye una capa encima para hacer todo un poco más ordenado. Usando Spring Data R2DBC somos capaces de crear una conexión a una base de datos y empezar a consultarla sin necesidad de demasiado código.<br><br>Aunque Spring ya está haciendo mucho por nosotros, podría hacer más. Actualmente, no tiene soporte para la autoconfiguración de Spring Boot. Lo cual es un poco molesto. Pero, estoy seguro de que alguien se pondrá a hacerlo pronto y hará que todo sea aún mejor de lo que ya es.</p><p>El código utilizado en este post se puede encontrar en mi <a href="https://github.com/lankydan/spring-data-r2dbc">GitHub</a>.</p><p>Si te ha resultado útil este post, puedes seguirme en Twitter en @<a href="https://twitter.com/LankyDanDev">LankyDanDev </a>para estar al día de mis nuevas publicaciones.<br><br>Publicado originalmente en <a href="https://lankydanblog.com/2019/02/16/asynchronous-rdbms-access-with-spring-data-r2dbc/">lankydanblog.com</a> el 16 de febrero de 2019.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Fuentes HTML: Ejemplo de familia de fuentes CSS (caracteres Serif y Sans Serif) ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Dionysia Lemonaki [https://www.freecodecamp.org/news/author/dionysia/] Artículo original HTML Font – CSS Font Family Example (Serif and Sans Serif Characters) [https://www.freecodecamp.org/news/html-font-css-font-family-example-serif-and-sans-serif-characters/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] Elegir el tipo de letra adecuado es un primer paso importante para que su sitio web sea utilizable y accesible. El formato ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/fuentes-html-ejemplo-de-familia-de-fuentes-css/</link>
                <guid isPermaLink="false">61db9197148c1c0972346c94</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Wed, 12 Jan 2022 21:51:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/brett-jordan-M9NVqELEtHU-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/dionysia/">Dionysia Lemonaki</a><br><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/html-font-css-font-family-example-serif-and-sans-serif-characters/">HTML Font – CSS Font Family Example (Serif and Sans Serif Characters)</a><br><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>Elegir el tipo de letra adecuado es un primer paso importante para que su sitio web sea utilizable y accesible.</p><p>El formato del texto afecta a la legibilidad de los diseños y las páginas web.<br><br>Puedes modificar la apariencia de tu texto HTML de muchas maneras utilizando CSS. Puedes seleccionar el tipo de fuente que quieres usar, si está en negrita o no, qué tamaño tiene, e incluso puedes cambiar el color y añadirle diferentes espaciados o decoraciones.</p><p>En este artículo, repasaremos las diferencias entre los dos tipos de letra más populares, Serif y Sans Serif.<br><br>Además, cubriremos la sintaxis y cómo utilizar la propiedad font-family para que, con la ayuda de CSS, puedas elegir y luego utilizar diferentes fuentes en tus proyectos de diseño web.<br><br>¡Empecemos!</p><h2 id="terminolog-a-tipogr-fica">Terminología tipográfica</h2><p>En primer lugar, hablemos de algunos de los tipos de letra más comunes y frecuentes que admiten los navegadores modernos.</p><h3 id="el-tipo-de-letra-serif">El tipo de letra Serif</h3><p>Las fuentes Serif se caracterizan por los pequeños detalles extrafinos en los extremos de las letras.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-13-at-4.34.15-PM.png" class="kg-image" alt="Screenshot-2021-08-13-at-4.34.15-PM" width="600" height="400" loading="lazy"></figure><p>Al final de los trazos principales de los caracteres, hay pequeños trazos de floritura llamados serifas <em>(del francés serif)</em>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-13-at-4.38.02-PM.jpeg" class="kg-image" alt="Screenshot-2021-08-13-at-4.38.02-PM" width="600" height="400" loading="lazy"></figure><p>Los tipos de letra Serif se utilizan tradicionalmente en la impresión, ya que se consideran legibles para pasajes largos de texto. Pero no siempre se muestran bien en las pantallas.<br><br>Las fuentes Serif están consideradas como las más clásicas, elegantes y tradicionales que se pueden utilizar.</p><h3 id="el-tipo-de-letra-sans-serif">El tipo de letra Sans-Serif</h3><p>Este tipo de fuente crea un aspecto de diseño limpio, a la vez que es muy legible y claro.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-13-at-4.35.04-PM.png" class="kg-image" alt="Screenshot-2021-08-13-at-4.35.04-PM" width="600" height="400" loading="lazy"></figure><p>Este tipo de letra tiene extremos rectos en cada letra y no hay trazos en los bordes, lo que hace que los caracteres parezcan nítidos y planos y con líneas limpias.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-13-at-4.38.14-PM.jpeg" class="kg-image" alt="Screenshot-2021-08-13-at-4.38.14-PM" width="600" height="400" loading="lazy"></figure><p>Las fuentes Sans-serif se consideran modernas, minimalistas, contemporáneas y una opción más legible para las pantallas de ordenador de alta resolución.</p><h3 id="el-tipo-de-letra-monospace">El tipo de letra Monospace</h3><p>Con este tipo de letra, cada letra tiene la misma anchura fija y las letras están igualmente espaciadas.<br><br>Con los tipos de letra anteriores que hemos analizado hasta ahora, cada letra tiene una anchura diferente.<br><br>En cambio, con el tipo de letra monospace, todas las letras tienen la misma anchura. Esto hace que el texto se alinee bien y sea fácil de seguir, dando a los diseños un aspecto limpio y una sensación mecánica.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-13-at-5.29.11-PM.png" class="kg-image" alt="Screenshot-2021-08-13-at-5.29.11-PM" width="600" height="400" loading="lazy"></figure><p>Hay otros dos tipos de fuentes genéricas disponibles, <code>fantasy</code> y <code>cursive</code>, pero los tipos de letra más utilizados son los mencionados anteriormente.</p><h2 id="como-elegir-un-tipo-de-letra-para-su-sitio-web-nombres-de-fuentes">Como elegir un tipo de letra para su sitio web - nombres de fuentes</h2><p>Ahora que hemos cubierto los términos básicos de las fuentes y sus descripciones, es el momento de ver los diferentes estilos de fuentes dentro de cada familia.<br><br>A continuación se enumeran algunos estilos comunes dentro de cada familia de fuentes:</p><h3 id="fuentes-serif"><strong>Fuentes Serif</strong></h3><ul><li>Georgia</li><li>Times</li><li>Times New Roman</li><li>Bodoni</li><li>Garamond</li><li>Palatino</li><li>ITC Clearface</li><li>Plantin</li><li>Freight Text</li><li>Didot</li><li>American Typewriter</li></ul><h3 id="fuentes-sans-serif"><strong>Fuentes <strong>Sans-Serif</strong></strong></h3><ul><li>Arial</li><li>Verdana</li><li>Helvetica</li><li>Geneva</li><li>Tahoma</li><li>Trebuchet MS</li><li>Open Sans</li><li>Liberation Sans</li><li>Impact</li></ul><h3 id="fuentes-monospace"><strong>Fuentes <strong>Monospace</strong></strong></h3><ul><li>Courier</li><li>MS Courier New</li><li>Monaco</li><li>Lucinda Console</li><li>Andalé Mono</li><li>Menlo</li><li>Consolas</li></ul><h2 id="como-usar-la-propiedad-font-family"><strong>Como usar la propiedad<strong> <code>font-family</code></strong></strong></h2><p>En CSS, la propiedad <code>font-family</code> define un tipo de letra específico para un elemento y el aspecto que tendrá su contenido de texto.</p><p>La sintaxis de la propiedad <code>font-family</code> es:</p><pre><code class="language-css">element {
font-family: value;
}
</code></pre><p>Escribimos la propiedad <code>font-family</code> seguida de dos puntos <code>:</code>, un espacio, un &nbsp;<code>value</code>, y finalmente terminamos la especificación con un punto y coma <code>;</code>.</p><p>Tenemos que establecer la propiedad a la que queremos apuntar y asignar el valor que queremos.</p><h2 id="como-establecer-una-fuente-css">Como establecer una fuente CSS</h2><p><br>Digamos que tenemos el HTML de abajo:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;link rel="stylesheet" href="style.css"&gt;
    &lt;title&gt;CSS Fonts&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;HTML Font – CSS Font Family &lt;/h1&gt;
    &lt;p&gt;I am a paragraph&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Sin aplicar ningún estilo y sin establecer explícitamente un valor a la propiedad <code>font-family</code>, los navegadores muestran los encabezados y los párrafos con el tipo de letra de su elección.</p><p>El tipo de letra estándar y por defecto de Google Chrome es <code>Times New Roman</code>, una fuente serif.<br><br>El resultado tiene este aspecto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-13-at-7.03.34-PM.png" class="kg-image" alt="Screenshot-2021-08-13-at-7.03.34-PM" width="600" height="400" loading="lazy"></figure><p>Hay varias maneras de establecer un tipo de letra diferente y especificar la fuente que queremos.<br><br>A la hora de elegir un tipo de letra, que es la parte más valiosa, hay que mencionar que los sitios utilizan un conjunto limitado de tipos de letra. Tomarán las fuentes que ya están instaladas en el ordenador del usuario.<br><br>Un navegador solo mostrará un tipo de letra si ya está instalado en el ordenador del usuario.<br><br>Así que veamos las formas en que se puede establecer un tipo de letra en CSS.</p><h3 id="c-mo-utilizar-un-nombre-gen-rico-de-familia-de-fuentes">Cómo utilizar un nombre genérico de familia de fuentes</h3><p>En este caso, los nombres son palabras clave e incluyen una de las categorías de fuentes mencionadas anteriormente (serif, sans-serif, monospace).</p><p>Sería algo así:</p><pre><code class="language-css">p {
 font-family: serif;
 }
</code></pre><p>Esto establece la fuente a una fuente serif genérica.</p><h3 id="como-utilizar-un-nombre-de-familia-de-fuentes-espec-fico">Como utilizar un nombre de familia de fuentes específico</h3><pre><code class="language-css">p {
 font-family: Times,serif;
 }
</code></pre><p>Esta regla establece Times como la fuente deseada y luego Serif como la opción genérica de reserva, en caso de que la primera opción no esté instalada en el ordenador del usuario.<br><br>Si el nombre contiene algún espacio en blanco, es necesario encerrarlo entre comillas.</p><pre><code class="language-css">p {
font-family: "Courier New",monospace;
}
</code></pre><p>Esto establece la fuente a Courier New y añade monospace como respaldo.<br><br>Si especificamos un tipo de letra que no sea uno de los nombres genéricos (como serif, sans-serif) tenemos que dar al navegador una alternativa.</p><h3 id="como-utilizar-una-pila-de-fuentes">Como utilizar una pila de fuentes</h3><p>En este caso, la propiedad <code>font-family</code> tiene múltiples valores.<br><br>Es una lista priorizada, separada por comas, de nombres de familias de fuentes que puede aplicar al texto, indicando que todas las fuentes son alternativas. Esto permite la máxima compatibilidad con los navegadores y sistemas operativos.<br><br>La lista se prioriza de izquierda a derecha, de mayor a menor prioridad.</p><pre><code class="language-css">p { 
  font-family: "Lucida Console", Courier, monospace;
}
</code></pre><p>Al aplicar más de un nombre de familia de fuentes, se crea un orden de preferencia. Empezamos con la fuente que queremos primero.<br><br>Si un usuario no tiene la primera opción instalada en su ordenador o si no es compatible con el navegador, este pasa a la segunda fuente y la utiliza. Si esa fuente tampoco está disponible, pasa a la tercera, y así sucesivamente.</p><p>Podemos listar tantas fuentes como queramos, pero la mejor práctica es listar de tres a cuatro.</p><p>Si todo lo demás falla, siempre habrá una fuente genérica listada al final como última opción-mecanismo de devolución.<br><br>Del grupo listado, el navegador tiene que soportar al menos una opción y el nombre genérico garantiza que algo en la familia de fuentes deseada será renderizado.</p><pre><code class="language-css">p {
 font-family: Georgia, "Times New Roman", Times, serif;
</code></pre><p>Los tipos de letra que se enumeran se conocen como una pila de fuentes.<br><br>El navegador buscará primero Georgia. Si está instalada, el navegador mostrará esa fuente. A continuación, buscará Times New Roman. Si tampoco está disponible, recurrirá a mostrar la fuente genérica por defecto de la familia serif.</p><h2 id="conclusi-n">Conclusión</h2><p>En este artículo, hemos repasado las diferentes familias de fuentes y hemos dado algunos ejemplos de los diferentes estilos dentro de cada familia.<br></p><p>También repasamos la propiedad font-family y las tres formas diferentes de establecer una fuente en CSS.<br></p><p>Si quieres aprender más sobre HTML y CSS y las diferentes técnicas modernas que se utilizan, freeCodeCamp tiene una <a href="https://www.freecodecamp.org/espanol/learn/responsive-web-design/">certificación gratuita sobre Diseño Web Responsivo.</a><br><br>Empezarás desde lo más básico hasta llegar a Flexbox, CSS Grid, y cómo hacer sitios web responsivos. Estas son habilidades esenciales para el diseño digital y el desarrollo web front-end.<br><br>Al final, construirás 5 proyectos, incluyendo un sitio de portafolio donde puedes mostrar los otros proyectos que has construido si lo deseas.<br><br>Gracias por leer y feliz aprendizaje.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tamaño de fuente HTML: Cómo cambiar el tamaño del texto usando el estilo CSS en línea ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Kolade Chris [https://www.freecodecamp.org/news/author/kolade/] Artículo original HTML Font Size – How to Change Text Size Using Inline CSS Style [https://www.freecodecamp.org/news/html-font-size-how-to-change-text-size-using-inline-css-style/] Traducido y adaptado por Josué [/espanol/news/author/drifting/] En HTML, la fuente que elija jugará un papel importante en la apariencia de sus páginas web. Puedes elegir el color, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tamano-de-fuente-html-como-cambiar-el-tamano-del-texto-usando-el-estilo-css-en-linea/</link>
                <guid isPermaLink="false">615f7dd3818d3e0912698fa9</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Sat, 16 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/fontsize-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por </strong></strong><a href="https://www.freecodecamp.org/news/author/kolade/">Kolade Chris</a><br><strong><strong>Artículo original </strong></strong><a href="https://www.freecodecamp.org/news/html-font-size-how-to-change-text-size-using-inline-css-style/">HTML Font Size – How to Change Text Size Using Inline CSS Style</a><br><strong><strong>Traducido y adaptado por </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting/">Josué</a></p><p>En HTML, la fuente que elija jugará un papel importante en la apariencia de sus páginas web.</p><p>Puedes elegir el color, el peso, el tamaño, etc. de la fuente. &nbsp;Y todas estas características hacen que sus sitios web y aplicaciones se vean mejor y más presentables para el usuario.</p><p>Con la propiedad <code>font-size</code> en CSS, puedes cambiar el tamaño del texto en la página web. Puedes utilizar esta propiedad en cualquier tipo de CSS que esté escribiendo: externo, interno o en línea.</p><p>En este artículo, le mostraré cómo cambiar el tamaño del texto con la propiedad &nbsp;<code>font-size</code> en CSS en línea.</p><h2 id="-qu-es-css-en-l-nea">¿Qué es CSS en línea?</h2><p>CSS en línea es una de las tres formas diferentes que puede utilizar para diseñar cualquier elemento HTML.</p><p>En lugar de apuntar al elemento con un atributo <code>class</code> o <code>id</code>, o al elemento mismo como selector y darle estilo con eso, pones todos los estilos CSS en la etiqueta de apertura.</p><p>Además, debe asegurarse de que todas las propiedades y valores de sus estilos estén dentro del atributo <code>style</code>. El atributo <code>style</code> es uno de los numerosos atributos aceptados por todas las etiquetas HTML.</p><p>En el siguiente ejemplo, cambio el color de fondo del texto a carmesí, el color del texto a <code>#f1f1f1</code> (gris claro), y el peso de la fuente a <code>bold</code> con CSS en línea.</p><pre><code class="language-html">&lt;p style="background-color: crimson; color: #f1f1f1; font-weight: bold"&gt;
      Hello Campers...
&lt;/p&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/inline-styling-example.png" class="kg-image" alt="inline-styling-example" width="600" height="400" loading="lazy"></figure><p>Por cierto, mi navegador está ampliado a un nivel del 400%, por lo que todo parece tan grande. &nbsp;No apliqué ningún estilo adicional para lograr eso :)</p><h2 id="c-mo-cambiar-el-tama-o-del-texto-usando-css-en-l-nea">Cómo cambiar el tamaño del texto usando CSS en línea</h2><p>Para cambiar el tamaño de su texto con CSS en línea, debe hacerlo con el atributo <code>style</code>. Escribe en la propiedad <code>font-size</code>, y luego asígnale un valor.</p><p>Hay valores incorporados como <code>large</code>, <code>larger</code>, <code>medium</code>, <code>small</code>, <code>x-large</code>, y también:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/inbuilt-properties.png" class="kg-image" alt="inbuilt-properties" width="600" height="400" loading="lazy"></figure><p>En el fragmento de código a continuación, cambio el tamaño del texto “Hello Campers…” &nbsp;a <code>x-large</code>, uno de los valores integrados de la propiedad <code>font-size</code>.</p><pre><code class="language-html">&lt;p style="font-size: x-large"&gt;Hello Campers...&lt;/p&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/font-style-with-inbuilt-value.png" class="kg-image" alt="font-style-with-inbuilt-value" width="600" height="400" loading="lazy"></figure><p>También puede establecer el valor de la propiedad <code>font-size</code> utilizando un número con cualquier unidad, como píxeles (px), <code>rem</code> o <code>em</code>.</p><p>Es mejor ir con valores numerados porque le dan más libertad para elegir el tamaño de fuente que desee.</p><p>En el fragmento de código a continuación, cambié el tamaño del texto a <code>30px</code> en CSS en línea:</p><pre><code class="language-html">&lt;p style="font-size: 30px"&gt;Hello Campers...&lt;/p&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/font-style-with-numbered-value.png" class="kg-image" alt="font-style-with-numbered-value" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n">Conclusión</h2><p>En este artículo, aprendió cómo cambiar el tamaño del texto con CSS en línea y la propiedad de <code>font-size</code>. &nbsp;También vio cómo puede asignar valores a la propiedad de <code>font-size</code>.</p><p>Sin embargo, solo un aviso: CSS en línea es excelente para diseñar, pero no debes confiar mucho en él, ya que hace que su HTML sea difícil de leer, especialmente si está trabajando en equipo. &nbsp;No querrás ser el único que podrá leer tu propio código.</p><p>Tenga en cuenta que también anula cualquier conjunto de estilo con estilo interno o externo. &nbsp;En su lugar, debe usar un estilo externo o un estilo interno, ya que hacen que sus códigos HTML y CSS se separen, lo que es mejor para la legibilidad.</p><p>Al asignar valores a la propiedad <code>font-size</code>, es mejor asignar los valores en unidades rem en lugar de <code>px</code>, por ejemplo. Esto se debe a que cuando usas <code>rem</code>, el navegador podrá realizar ajustes en el tamaño de la fuente a medida que el usuario se acerca o aleja, que no sucederá cuando uses <code>px</code>.</p><p>Gracias por leer y seguir programando.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo implementar automáticamente tus aplicaciones React con Cloudflare Pages ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Reed Barger [https://www.freecodecamp.org/news/author/reed/] Artículo original How to Auto-Deploy Your React Apps with Cloudflare Pages [https://www.freecodecamp.org/news/how-to-auto-deploy-your-react-apps-with-cloudflare-pages/] Traducido y adaptado por Josue Custodio [/espanol/news/author/drifting] En este artículo, te mostraré cómo implementar rápidamente cualquier aplicación React con la ayuda de las páginas de Cloudflare. Verás cómo no solo crear ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-implementar-automaticamente-sus-aplicaciones-react-con-cloudflare/</link>
                <guid isPermaLink="false">6154c69ec757580942e5bec6</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Thu, 07 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/09/autodeploy-your-react-apps.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por </strong></strong><a href="https://www.freecodecamp.org/news/author/reed/">Reed Barger</a><br><strong><strong>Artículo original </strong></strong><a href="https://www.freecodecamp.org/news/how-to-auto-deploy-your-react-apps-with-cloudflare-pages/">How to Auto-Deploy Your React Apps with Cloudflare Pages</a><br><strong><strong>Traducido y adaptado por </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting">Josue Custodio</a></p><p>En este artículo, te mostraré cómo implementar rápidamente cualquier aplicación React con la ayuda de las páginas de Cloudflare.</p><p>Verás cómo no solo crear e implementar tu aplicación en minutos usando solo algunas herramientas, sino también cómo implementar automáticamente cualquier cambio futuro que realices a través de tu cuenta de GitHub.</p><h2 id="c-mo-empezar">Cómo empezar</h2><p>Para comenzar, necesitarás las siguientes herramientas:</p><ol><li><a href="https://nodejs.org/es/">El administrador de paquetes npm</a> y <a href="https://gitforwindows.org/">el software de control de versiones Git</a></li><li>Tu propia cuenta de <a href="https://github.com/">GitHub </a>(gratuita) y tu cuenta de <a href="https://www.cloudflare.com/es-es/">Cloudflare</a></li></ol><h2 id="crea-nuestro-proyecto-react">Crea nuestro proyecto React</h2><p>Para implementar una aplicación React, primero necesitamos crear una.</p><p>Creemos una aplicación React en nuestra computadora con la ayuda de Create-React-App. &nbsp;Podemos hacerlo dándole el nombre "cloudflare-react":</p><pre><code class="language-bash">npx create-react-app cloudflare-react</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-1.gif" class="kg-image" alt="cloudflare-react-1" width="600" height="400" loading="lazy"></figure><h2 id="crea-nuestro-repositorio-de-github">Crea nuestro repositorio de Github</h2><p>Y una vez que nuestro proyecto se haya creado con éxito, sigamos adelante y creemos un repositorio de GitHub para él.</p><p>Usamos GitHub para poder mantener un registro en línea y fácil de administrar de nuestros proyectos individuales. &nbsp;GitHub también permite que otros usuarios realicen mejoras en nuestro código a través de solicitudes de extracción.</p><p>Cloudflare usa GitHub para realizar un seguimiento de todo nuestro código y cada vez que hacemos cambios.</p><p>Para rastrear nuestra nueva aplicación React, creamos un nuevo repositorio de GitHub yendo a <a href="https://github.com/new">github.com/new</a>.</p><p>A continuación, podemos simplemente agregar todos nuestros archivos y enviarlos con un mensaje que diga lo que estamos haciendo:</p><pre><code class="language-bash">git add .
git commit -m "Deploy to Cloudflare Pages"</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-2.gif" class="kg-image" alt="cloudflare-react-2" width="600" height="400" loading="lazy"></figure><p>A continuación, debemos agregar el control remoto de Git apropiado, que se utiliza para enviar nuestro código comprometido a nuestro nuevo repositorio de GitHub.</p><p>GitHub le dirá el comando que necesitas incluir para tu repositorio recién creado. &nbsp;Debería verse algo como esto:</p><pre><code class="language-bash">git remote add origin someurl</code></pre><p>Y finalmente, podemos simplemente correr &nbsp;<code>git push -u origin master</code>.</p><p>Después de actualizar nuestra página de repositorio de GitHub, deberíamos ver todo el código de nuestro proyecto React, enviado a GitHub.</p><p>Este es el primer requisito principal para implementar una aplicación en las páginas de Cloudflare: tener una aplicación React viviendo en GitHub.</p><h2 id="crea-una-cuenta-de-cloudflare">Crea una cuenta de Cloudflare</h2><p>A continuación, vamos a Cloudflare para implementar nuestro proyecto React.</p><p>Si aún no tienes una cuenta gratuita de Cloudflare, puedes ir a pages.cloudflare.com y hacer clic en "Sign Up":</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-8.png" class="kg-image" alt="cloudflare-react-8" width="600" height="400" loading="lazy"></figure><p>Una razón principal por la que tú y la mayoría de los desarrolladores estarían interesados ​​en utilizar Cloudflare Pages es que Cloudflare tiene una CDN mundial. Esto permite una entrega más rápida de nuestra aplicación implementada.</p><p>Cloudflare también tiene recursos como la administración de DNS, que es especialmente útil si desea que su aplicación tenga su propio dominio personalizado.</p><h2 id="vincula-github-a-cloudflare-pages">Vincula GitHub a Cloudflare Pages</h2><p>La primera vez que visites Cloudflare Pages, se te pedirá que creas un proyecto desde tu repositorio de GitHub, por lo que seleccionarás el botón conectar cuenta de GitHub:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-5.png" class="kg-image" alt="cloudflare-react-5" width="600" height="400" loading="lazy"></figure><p>Luego se te pedirá que instales y autorice Cloudflare pages.</p><p>Este paso nos permite elegir a qué tiene acceso Cloudflare, si queremos darle acceso a todos nuestros repositorios o solo a repositorios seleccionados:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-6.png" class="kg-image" alt="cloudflare-react-6" width="600" height="400" loading="lazy"></figure><p>Si deseas implementar varios proyectos en el futuro, te recomiendo seleccionar todos los repositorios.</p><p>Como resultado, Cloudflare tendrá la capacidad de acceder a cualquier código e implementación que hayamos realizado para que pueda implementarse en la web.</p><h2 id="implementa-nuestro-proyecto-react-en-cloudflare-pages">Implementa nuestro proyecto React en Cloudflare Pages</h2><p>Una vez que hayamos dado autorización a Cloudflare para hacerlo, veremos una pantalla donde podemos elegir qué proyecto de nuestro repositorio de GitHub queremos implementar:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-7.png" class="kg-image" alt="cloudflare-react-7" width="600" height="400" loading="lazy"></figure><p>En nuestro caso, elegiremos nuestro repositorio "cloudflare-react", luego de lo cual presionaremos Comenzar configuración.</p><p>Desde allí, podemos elegir qué nombre de proyecto queremos que tenga nuestra aplicación React con Cloudflare. Este nombre de proyecto es importante porque determina el subdominio en el que se implementará.</p><p>Como elegimos "cloudflare-react", se implementará en cloudflare-react.pages.dev:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-3.gif" class="kg-image" alt="cloudflare-react-3" width="600" height="400" loading="lazy"></figure><p>Podemos elegir qué rama implementar, así como la configuración de compilación.</p><p>Ten en cuenta que todo lo que realmente tenemos que hacer es elegir qué marco preestablecido estamos usando. Cloudflare tiene una opción preestablecida para nuestro marco: Create React App.</p><p>Cuando lo elijamos, incluirá la configuración predeterminada para cualquier proyecto Create React App: para implementar el proyecto ejecutando el comando de compilación "npm run build" y el directorio de salida (la carpeta en la que se construirá nuestro código React al ejecutar este comando de compilación) se llama "build".</p><p>Hay otros ajustes preestablecidos útiles para cualquier aplicación React que se haya creado con un marco como Next.js o Gatsby. &nbsp;Puedes usar las páginas de Cloudflare para implementar casi cualquier tipo de aplicación React que se le ocurra.</p><p>Finalmente, podemos presionar el botón de despliegue. &nbsp;El proceso de implementación tomará de cuatro a cinco minutos la primera vez. &nbsp;Sé paciente, pero ten en cuenta que cualquier implementación posterior llevará mucho menos tiempo.</p><p>Vemos algunos registros útiles sobre la construcción de nuestro proyecto y el progreso de nuestra implementación. &nbsp;Si hubiera un error en ese proceso, lo veríamos en los registros y obtendríamos alguna indicación de lo que necesitábamos arreglar.</p><p>Luego, para ver nuestro proyecto implementado, podemos presionar el botón Continuar al proyecto, presionar "Visitar sitio" y podemos ver nuestra aplicación ejecutándose en la URL: your-project-name.pages.dev.</p><h2 id="realiza-cambios-con-implementaciones-autom-ticas">Realiza cambios con implementaciones automáticas</h2><p>Si bien fue muy fácil implementar instantáneamente nuestra aplicación React en la web después de que la enviamos a GitHub, el siguiente paso es realizar cambios en nuestra aplicación y volver a implementarla.</p><p>Como verás, esta funcionalidad de implementación automática (integración continua) ya se ha configurado.</p><p>En el caso de mi aplicación, decidí instalar React Router DOM para agregar una página de información. &nbsp;En la página de inicio, también agregué un enlace a la página Acerca de:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/cloudflare-react-4.gif" class="kg-image" alt="cloudflare-react-4" width="600" height="400" loading="lazy"></figure><p>Después de que termines de realizar ese cambio que puedes ver en el video de arriba, pasé por el mismo proceso de ejecutar <code>git add .</code>, <code>git commit</code> con un mensaje sobre los cambios que hice, y luego <code>git push</code>.</p><p>Después de hacerlo, si volvemos a nuestro panel de Cloudflare Pages, podemos ver que inmediatamente Cloudflare ha recogido esta nueva implementación porque está vinculada a nuestra cuenta de GitHub y puedes ver cualquier implementación o solicitud de extracción que se realizó a nuestro repositorio.</p><p>Como resultado, vuelve a implementar instantáneamente nuestra aplicación con los cambios que hicimos. &nbsp;A medida que se lleva a cabo nuestra implementación, podemos presionar "View build" y podemos ver información específica sobre esta implementación, junto con los registros.</p><p>Como verás, cualquier cambio realizado después de la implementación inicial toma mucho menos tiempo (solo toma alrededor de un minuto en total para que la implementación finalice correctamente). &nbsp;También verás que tiene su propio hash de implementación único al comienzo de nuestra URL. &nbsp;Esto nos permite hacer referencia única a cada implementación.</p><p>Si eliminamos el hash, vemos que los cambios que hicimos también se implementan en el nombre de nuestro proyecto elegido: cloudflare-react.pages.dev.</p><h2 id="conclusi-n">Conclusión</h2><p>Espero que este tutorial te muestre lo fácil que es comenzar con las nuevas páginas de Cloudflare. &nbsp;Puedes comenzar a implementar tus aplicaciones React hoy para aprovechar su CDN global y todas las características adicionales que Cloudflare tiene para ofrecer.</p><p>Cloudflare Page todavía es un proyecto bastante nuevo, pero ya ofrecen muchas herramientas que vale la pena revisar. &nbsp;Lo recomiendo encarecidamente como tu servicio de implementación para la próxima aplicación React que desees compartir con el mundo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear un componente React verdaderamente reutilizable desde cero ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Yogesh Chavan [https://www.freecodecamp.org/news/author/yogesh/]. Artículo original How to Create a Truly Reusable React Component from Scratch [https://www.freecodecamp.org/news/how-to-create-a-truly-reusable-react-component-from-scratch/] . Traducido y adaptado por Josue Custodio [/espanol/news/author/drifting]. En este tutorial, creará una aplicación con React.  Y aprenderá a crear un componente de autosugestión verdaderamente reutilizable desde cero. Esta apli ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-un-componente-react-verdaderamente-reutilizable-desde-cero/</link>
                <guid isPermaLink="false">614f72954a041b0918732e50</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Mon, 04 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/pexels-sarah-chai-7262760.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por </strong></strong><a href="https://www.freecodecamp.org/news/author/yogesh/">Yogesh Chavan</a>.<br><strong><strong>Artículo original </strong></strong><a href="https://www.freecodecamp.org/news/how-to-create-a-truly-reusable-react-component-from-scratch/">How to Create a Truly Reusable React Component from Scratch</a>.<br><strong><strong>Traducido y adaptado por </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting">Josue Custodio</a>.</p><p>En este tutorial, creará una aplicación con React. &nbsp;Y aprenderá a crear un componente de autosugestión verdaderamente reutilizable desde cero.</p><p>Esta aplicación permitirá al usuario buscar un país en una lista de países. Mostrará sugerencias coincidentes debajo del campo de entrada para el país que el usuario ha ingresado.</p><p>Al crear esta aplicación, aprenderá:</p><ul><li>Cómo crear un componente reutilizable.</li><li>Cómo utilizar el <code>useRef</code> hook para administrar sugerencias automáticas.</li><li>Cómo crear un hook reutilizable personalizado.</li><li>Cómo realizar la búsqueda de manera eficiente.</li></ul><p>y mucho más.</p><p>Puede encontrar la demostración en vivo de la aplicación final <a href="https://react-autosuggestion-app.netlify.app/">aquí</a>.</p><p>A continuación se muestra la demostración funcional de la función de sugerencias automáticas.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/suggestion_demo.gif" class="kg-image" alt="suggestion_demo" width="600" height="400" loading="lazy"></figure><p>Así que comencemos a construir la aplicación.</p><h2 id="configurar-el-proyecto">Configurar el proyecto</h2><p>Usaremos create-react-app para inicializar el proyecto.</p><p>Usaremos la sintaxis de React Hooks para crear los componentes. </p><p>Crea un nuevo proyecto de React ejecutando el siguiente comando:</p><p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <code>npx create-react-app react-autosuggestion-app</code> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><p>Una vez que hayas creado el proyecto, elimina todos los archivos de la carpeta <code>src</code> y crea los archivos &nbsp;<code>index.js</code>, <code>App.js</code>, <code>styles.css</code> dentro de la carpeta &nbsp;<code>src</code>.</p><p>También crea las carpetas <code>components</code> y <code>custom-hooks</code> dentro de la carpeta &nbsp;<code>src</code>.</p><p>Instala las dependencias necesarias ejecutando el siguiente comando desde la terminal o el símbolo del sistema: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><pre><code class="language-js">yarn add axios@0.21.1 lodash@4.17.21 react-bootstrap@1.6.1 bootstrap@5.1.0</code></pre><p>Una vez instalados, abre el archivo <code>src/styles.css</code> y agrega el contenido <a href="https://github.com/myogeshchavan97/react-autosuggestion-app/blob/master/src/styles.css">de este archivo dentro de él.</a></p><h2 id="c-mo-construir-las-p-ginas-iniciales">Cómo construir las páginas iniciales</h2><p>Crea un nuevo archivo <code>countries.json</code> dentro de la carpeta <code>public</code> &nbsp;y agrega el contenido de <a href="https://github.com/myogeshchavan97/react-autosuggestion-app/blob/master/public/countries.json">este archivo dentro de ella</a>.</p><p>Crea un archivo <code>AutoComplete.js</code> dentro de la carpeta <code>components</code> &nbsp;con el siguiente código: &nbsp;</p><pre><code class="language-js">import React from 'react';

function AutoComplete({ isVisible, suggestions, handleSuggestionClick }) {
  return (
    &lt;div className={`${isVisible ? 'show suggestion-box' : 'suggestion-box'}`}&gt;
      &lt;ul&gt;
        {suggestions.map((country, index) =&gt; (
          &lt;li key={index} onClick={() =&gt; handleSuggestionClick(country)}&gt;
            {country}
          &lt;/li&gt;
        ))}
      &lt;/ul&gt;
    &lt;/div&gt;
  );
}

export default AutoComplete;</code></pre><p>En este archivo, mostramos las sugerencias al usuario una vez que el usuario escribe algo en el cuadro de entrada de texto.</p><p>Crea un archivo <code>useOutsideClick.js</code> dentro de la carpeta <code>custom-hooks</code> &nbsp;con el siguiente código: </p><pre><code class="language-js">import { useState, useRef, useEffect } from 'react';

const useOutsideClick = () =&gt; {
  const [isVisible, setIsVisible] = useState(false);
  const ref = useRef();

  const handleOutsideClick = () =&gt; {
    if (ref.current) {
      setIsVisible(false);
    }
  };

  useEffect(() =&gt; {
    document.addEventListener('click', handleOutsideClick);
    return () =&gt; {
      document.removeEventListener('click', handleOutsideClick);
    };
  }, []);

  return [ref, isVisible, setIsVisible];
};

export default useOutsideClick;</code></pre><p>Aquí, hemos creado un hook personalizado que mostrará/ocultará el cuadro de sugerencias.</p><p>Inicialmente, hemos declarado un estado para ocultar el cuadro de sugerencias estableciendo el valor en <code>false</code>:</p><pre><code class="language-js">const [isVisible, setIsVisible] = useState(false);</code></pre><p>Entonces hemos declarado un ref: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><pre><code class="language-js">const ref = useRef();</code></pre><p>Estamos devolviendo este <code>ref</code> de nuestro hook personalizado junto con el <code>isVisible</code> y <code>setIsVisible</code>:</p><pre><code class="language-js">return [ref, isVisible, setIsVisible];</code></pre><p>Entonces, dentro del componente donde sea que usemos el hook <code>useOutsideClick</code>, podemos usar esta ref para asignarla al buzón de sugerencias. Entonces, si hay varios campos de entrada, cada campo de entrada tendrá su propio cuadro de sugerencias y ocultará y mostrará la funcionalidad.</p><p>Dentro de la función <code>handleOutsideClick</code>, tenemos el siguiente código:</p><pre><code class="language-js">const handleOutsideClick = () =&gt; {
  if (ref.current) {
    setIsVisible(false);
  }
};</code></pre><p>Aquí, estamos comprobando <code>ref.current</code> porque queremos llamar a la función <code>setIsVisible</code> solo si la ref del buzón de sugerencias está disponible y no cada vez que hacemos clic en la página.</p><p>Luego, hemos agregado manejador de eventos para llamar a la función <code>handleOutsideClick</code>:</p><pre><code class="language-js">useEffect(() =&gt; {
  document.addEventListener('click', handleOutsideClick);
  return () =&gt; {
    document.removeEventListener('click', handleOutsideClick);
  };
}, []);</code></pre><p>También eliminaremos el manejador de eventos devolviendo una función del hook <code>useEffect</code> una vez que el componente está desmontado.</p><h2 id="c-mo-crear-un-componente-react-reutilizable">Cómo crear un componente React reutilizable</h2><p>Ahora, crea un archivo <code>InputControl.js</code> dentro de la carpeta <code>components</code> &nbsp;con el siguiente código:</p><pre><code class="language-js">/* eslint-disable react-hooks/exhaustive-deps */
import React, { useState, useEffect, useRef } from 'react';
import axios from 'axios';
import _ from 'lodash';
import { Form } from 'react-bootstrap';
import AutoComplete from './AutoComplete';
import useOutsideClick from '../custom-hooks/useOutsideClick';

const InputControl = ({ name, label, placeholder }) =&gt; {
  const [documentRef, isVisible, setIsVisible] = useOutsideClick();
  const [suggestions, setSuggestions] = useState([]);
  const [selectedCountry, setSelectedCountry] = useState('');
  const [searchTerm, setSearchTerm] = useState('');
  const [errorMsg, setErrorMsg] = useState('');
  const ref = useRef();

  useEffect(() =&gt; {
    ref.current = _.debounce(processRequest, 300);
  }, []);

  function processRequest(searchValue) {
    axios
      .get('/countries.json')
      .then((response) =&gt; {
        const countries = response.data;
        const result = countries.filter((country) =&gt;
          country.toLowerCase().includes(searchValue.toLowerCase())
        );
        setSuggestions(result);
        if (result.length &gt; 0) {
          setIsVisible(true);
        } else {
          setIsVisible(false);
        }
        setErrorMsg('');
      })
      .catch(() =&gt; setErrorMsg('Something went wrong. Try again later'));
  }

  function handleSearch(event) {
    event.preventDefault();
    const { value } = event.target;
    setSearchTerm(value);
    ref.current(value);
  }

  function handleSuggestionClick(countryValue) {
    setSelectedCountry(countryValue);
    setIsVisible(false);
  }

  return (
    &lt;Form.Group controlId="searchTerm"&gt;
      &lt;Form.Label&gt;{label}&lt;/Form.Label&gt;
      &lt;Form.Control
        className="input-control"
        type="text"
        value={searchTerm}
        name={name}
        onChange={handleSearch}
        autoComplete="off"
        placeholder={placeholder}
      /&gt;
      &lt;div ref={documentRef}&gt;
        {isVisible &amp;&amp; (
          &lt;AutoComplete
            isVisible={isVisible}
            suggestions={suggestions}
            handleSuggestionClick={handleSuggestionClick}
          /&gt;
        )}
      &lt;/div&gt;
      {selectedCountry &amp;&amp; (
        &lt;div className="selected-country"&gt;
          Your selected country: {selectedCountry}
        &lt;/div&gt;
      )}
      {errorMsg &amp;&amp; &lt;p className="errorMsg"&gt;{errorMsg}&lt;/p&gt;}
    &lt;/Form.Group&gt;
  );
};

export default InputControl;</code></pre><p>En este archivo, hemos creado un componente reutilizable con búsquedas y sugerencias disponibles en el componente.</p><p>Inicialmente, estamos haciendo referencia al hook <code>useOutsideClick</code>:</p><pre><code class="language-js">const [documentRef, isVisible, setIsVisible] = useOutsideClick();</code></pre><p>Estamos almacenando la ref devuelta por el hook en la variable <code>documentRef</code>.‌‌‌ Cada vez que un usuario escribe algo en el cuadro de texto, hacemos una llamada a la API para obtener una lista de países con los criterios de búsqueda coincidentes.</p><p>Pero para evitar las llamadas API innecesarias en cada carácter ingresado en el cuadro de texto, usaremos el método antirrebote de la biblioteca lodash. &nbsp;Nos permite llamar a la API solo después de que hayan pasado 300 milisegundos una vez que el usuario haya dejado de escribir usando el siguiente código:</p><pre><code class="language-js">ref.current = _.debounce(processRequest, 300);</code></pre><p>La función <code>_.debounce</code> llamada devuelve una función que hemos almacenado en la variable <code>ref.current</code>. Llamaremos a la función almacenada allí una vez que hayan pasado 300 milisegundos.</p><p>Estamos usando ref en lugar de una variable normal porque necesitamos que esta inicialización ocurra solo una vez cuando el componente está montado. &nbsp;El valor de la variable normal se perderá en cada nueva renderización del componente cuando cambie algún estado o propiedad.</p><p>Estamos llamando a la función almacenada en <code>ref.current</code> desde la función <code>handleSearch</code> pasando el valor introducido por el usuario.</p><p>Entonces, una vez que llamamos a la función almacenada en <code>ref.current</code>, la función &nbsp;<code>processRequest</code> será llamada detrás de escena.</p><p>La función <code>processRequest</code> recibirá automáticamente el valor pasado a la función <code>ref.current</code>.</p><p>Dentro de la función <code>processRequest</code>, hacemos una llamada API para obtener la lista de países.</p><pre><code class="language-js">function processRequest(searchValue) {
  axios
    .get('/countries.json')
    .then((response) =&gt; {
      const countries = response.data;
      const result = countries.filter((country) =&gt;
        country.toLowerCase().includes(searchValue.toLowerCase())
      );
      setSuggestions(result);
      if (result.length &gt; 0) {
        setIsVisible(true);
      } else {
        setIsVisible(false);
      }
      setErrorMsg('');
    })
    .catch(() =&gt; setErrorMsg('Something went wrong. Try again later'));
}</code></pre><p>Aquí, una vez que tenemos la respuesta de la API, usamos el método de filtro del arreglo para filtrar solo los países que coinciden con el término de búsqueda proporcionado.</p><p>Luego, establecemos la lista de países en el estado de sugerencias usando <code>setSuggestions(result)</code>.</p><p>A continuación, comprobamos la longitud del arreglo de resultados para mostrar u ocultar el cuadro de sugerencias.</p><p>Si verificas el JSX que devuelve el componente, se ve así:</p><pre><code class="language-js">return (
  &lt;Form.Group controlId="searchTerm"&gt;
    &lt;Form.Label&gt;{label}&lt;/Form.Label&gt;
    &lt;Form.Control
      className="input-control"
      type="text"
      value={searchTerm}
      name={name}
      onChange={handleSearch}
      autoComplete="off"
      placeholder={placeholder}
    /&gt;
    &lt;div ref={documentRef}&gt;
      {isVisible &amp;&amp; (
        &lt;AutoComplete
          isVisible={isVisible}
          suggestions={suggestions}
          handleSuggestionClick={handleSuggestionClick}
        /&gt;
      )}
    &lt;/div&gt;
    {selectedCountry &amp;&amp; (
      &lt;div className="selected-country"&gt;
        Your selected country: {selectedCountry}
      &lt;/div&gt;
    )}
    {errorMsg &amp;&amp; &lt;p className="errorMsg"&gt;{errorMsg}&lt;/p&gt;}
  &lt;/Form.Group&gt;
);</code></pre><p>Aquí, para el cuadro de texto de entrada, hemos agregado un manejador <code>handleSearch</code> onChange que se ve así:</p><pre><code class="language-js">function handleSearch(event) {
  event.preventDefault();
  const { value } = event.target;
  setSearchTerm(value);
  ref.current(value);
}</code></pre><p>Actualizamos el estado de <code>searchTerm</code> con el valor escrito por el usuario. Entonces llamamos a la función almacenada en el &nbsp;<code>ref.current</code> pasándole el valor que ingresa el usuario.</p><p>Llamar a <code>ref.current</code> internamente llama a la función <code>processRequest</code> donde en realidad llamamos a la API.</p><p>Luego, después del cuadro de texto de entrada, hemos agregado un div con la ref para mostrar las sugerencias:</p><pre><code class="language-js">&lt;div ref={documentRef}&gt;
  {isVisible &amp;&amp; (
    &lt;AutoComplete
      isVisible={isVisible}
      suggestions={suggestions}
      handleSuggestionClick={handleSuggestionClick}
    /&gt;
  )}
&lt;/div&gt;</code></pre><p>Solo mostramos sugerencias si <code>isVisible</code> es true, lo que sucede cuando obtenemos resultados de la API dentro de la función &nbsp;<code>processRequest</code>.</p><p>Aquí, pasamos las sugerencias para que se muestren en el componente <code>AutoComplete</code>.‌‌ Una vez que hagamos clic en cualquiera de las sugerencias, la función <code>handleSuggestionClick</code> se ejecuta que está actualizando el <code>selectedCountry</code> y escondiendo las sugerencias:</p><pre><code class="language-js">function handleSuggestionClick(countryValue) {
  setSelectedCountry(countryValue);
  setIsVisible(false);
}</code></pre><h2 id="c-mo-utilizar-el-componente-reutilizable">Cómo utilizar el componente reutilizable</h2><p>Ahora, abre el archivo <code>App.js</code> y agrega el siguiente código dentro de él:</p><pre><code class="language-js">import React from 'react';
import { Form } from 'react-bootstrap';
import InputControl from './components/InputControl';

const App = () =&gt; {
  return (
    &lt;div className="main"&gt;
      &lt;h1&gt;React AutoSuggestion Demo&lt;/h1&gt;
      &lt;div className="search-form"&gt;
        &lt;Form&gt;
          &lt;InputControl
            name="country"
            label="Enter Country"
            placeholder="Type a country name"
          /&gt;
        &lt;/Form&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;</code></pre><p>Ahora, inicia la aplicación ejecutando el siguiente comando desde la terminal o el símbolo del sistema:</p><pre><code class="language-js">yarn start</code></pre><p> &nbsp; &nbsp;</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/2.gif" class="kg-image" alt="2" width="600" height="400" loading="lazy"></figure><p>Como puedes ver, una vez que selecciona cualquier valor de la sugerencia, el valor seleccionado se muestra debajo del cuadro de texto.</p><p><strong>Nota:</strong> hemos creado un componente <code>InputControl</code> separado que muestra el campo de entrada junto con su cuadro de sugerencias.</p><p>Entonces podemos reutilizar el mismo componente <code>InputControl</code> nuevamente para mostrar sugerencias en otro cuadro de texto de entrada como se muestra a continuación:</p><pre><code class="language-js">import React from 'react';
import { Form } from 'react-bootstrap';
import InputControl from './components/InputControl';

const App = () =&gt; {
  return (
    &lt;div className="main"&gt;
      &lt;h1&gt;React AutoSuggestion Demo&lt;/h1&gt;
      &lt;div className="search-form"&gt;
        &lt;Form&gt;
          &lt;InputControl
            name="country"
            label="Enter Country"
            placeholder="Type a country name"
          /&gt;
          &lt;InputControl
            name="country"
            label="Enter Country"
            placeholder="Type a country name"
          /&gt;
        &lt;/Form&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;</code></pre><p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/3.gif" class="kg-image" alt="3" width="600" height="400" loading="lazy"></figure><p>Como puedes ver, hemos agregado otro componente <code>InputControl</code> &nbsp;para el país, por lo que podemos manejar la sugerencia para cada cuadro de texto de entrada por separado.</p><p>Entonces, si deseas mostrar diferentes sugerencias para otro cuadro de texto, puedes pasar un accesorio adicional al componente <code>InputControl</code> y con base en ese apoyo, muestre diferentes resultados en el buzón de sugerencias.</p><h2 id="conclusi-n">Conclusión</h2><p>Como hemos visto en este tutorial, al crear un componente reutilizable <code>InputControl</code> y usando <code>ref</code> para administrar la sugerencia de cada cuadro de texto de entrada por separado, podemos crear un componente realmente reutilizable para mostrar sugerencias de autocompletar.</p><p><strong>Puedes encontrar el código fuente completo para este tutorial en <a href="https://github.com/myogeshchavan97/react-autosuggestion-app">este repositorio</a> y la <a href="https://react-autosuggestion-app.netlify.app/">demostración en vivo aquí</a>.</strong></p><h2 id="-gracias-por-leer-">¡Gracias por leer!</h2><p>¿Quiere mantenerse actualizado con el contenido regular sobre JavaScript, React, Node.js? <a href="https://www.linkedin.com/authwall?trk=gf&amp;trkInfo=AQHgZdt_V6RCfQAAAXwes4kYLE2jFqU6wLpG5eraK7xNhdNm0qDh9DjTjG-wJtamZj-Bwv_7PVZk8MnBIaLkYsTOvJQW4SMWWkwQBX01P_Ly71iS91PcDCEfmMl3d7rSr7typ5s=&amp;originalReferer=&amp;sessionRedirect=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fyogesh-chavan97%2F">Sígueme en LinkedIn.</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Desestructuración de JavaScript y el operador de propagación: Explicado con código de ejemplo ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Nishant Kumar [https://www.freecodecamp.org/news/author/nishant-kumar/]  Artículo original JavaScript Destructuring and the Spread Operator – Explained with Example Code [https://www.freecodecamp.org/news/javascript-destructuring-and-spread-operator-explained/] Traducido y adaptado por Josue Custodio [/espanol/news/author/drifting] JavaScript tiene dos estructuras de datos impresionantes que te ayudan a escribir código limpio y eficiente.  Pero su manejo puede resu ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/desestructuracion-de-javascript-y-el-operador-de-propagacion/</link>
                <guid isPermaLink="false">614e16344a041b0918732afd</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Thu, 30 Sep 2021 01:34:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/09/Cheers--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por</strong> </strong><a href="https://www.freecodecamp.org/news/author/nishant-kumar/">Nishant Kumar</a><strong><strong> </strong></strong><br><strong><strong>Artículo original </strong></strong><a href="https://www.freecodecamp.org/news/javascript-destructuring-and-spread-operator-explained/">JavaScript Destructuring and the Spread Operator – Explained with Example Code</a><br><strong><strong>Traducido y adaptado por </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting">Josue Custodio</a></p><p>JavaScript tiene dos estructuras de datos impresionantes que te ayudan a escribir código limpio y eficiente. &nbsp;Pero su manejo puede resultar complicado a veces.</p><p>En este blog, le mostraré cómo manejar la desestructuración en arreglos y objetos en JavaScript. &nbsp;También aprenderemos a usar el operador de propagación.</p><p>Vamos a sumergirnos.</p><h2 id="-qu-es-la-desestructuraci-n-de-arreglos-en-javascript">¿Qué es la desestructuración de arreglos en JavaScript?</h2><p>Digamos que tenemos un arreglo que contiene cinco números, como este:</p><figure class="kg-card kg-code-card"><pre><code>let array1 = [1, 2, 3, 4, 5]</code></pre><figcaption>Arreglo con cinco números</figcaption></figure><p>Para obtener los elementos del arreglo, podemos hacer algo como obtener el número de acuerdo con sus índices:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">array1[0];
array1[1];
array1[2];
array1[3];
array1[4];
</code></pre><figcaption>Obteniendo los elementos del arreglo</figcaption></figure><p>Pero este método es antiguo y torpe, y hay una mejor manera de hacerlo: utilizando la desestructuración de arreglos. &nbsp;Se parece a esto:</p><figure class="kg-card kg-code-card"><pre><code>let [ indexOne, indexTwo, indexThree, indexFour, indexFive ] = array1;</code></pre><figcaption>Uso de la desestructuración de arreglos</figcaption></figure><p>Ambos métodos anteriores producirán el mismo resultado:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-105209.png" class="kg-image" alt="Screenshot-2021-08-07-105209" width="600" height="400" loading="lazy"></figure><p>Ahora, tenemos cinco elementos en el arreglo y los imprimimos. &nbsp;Pero, ¿qué pasa si queremos omitir un elemento intermedio?</p><pre><code>let [ indexOne, indexTwo, , indexFour, indexFive ] = arreglo1;</code></pre><p>Aquí, nos hemos saltado <code>indexThird</code>, y hay un espacio vacío entre indexTwo e indexFour.</p><figure class="kg-card kg-code-card"><pre><code>let [ indexOne, indexTwo, , indexFour, indexFive ] = array1;

console.log(indexOne);
console.log(indexTwo)
console.log(indexFour)
console.log(indexFive)</code></pre><figcaption>Skipping the third element</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-105709.png" class="kg-image" alt="Screenshot-2021-08-07-105709" width="600" height="400" loading="lazy"></figure><p>Puede ver que no obtenemos el tercer elemento porque lo hemos configurado como vacío.</p><h2 id="-qu-es-la-desestructuraci-n-de-objetos-en-javascript">¿Qué es la Desestructuración de Objetos en JavaScript?</h2><p>Esta desestructuración también funciona bien con objetos. &nbsp;Déjame darte un ejemplo.</p><figure class="kg-card kg-code-card"><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    salary: 200,
    height: '20 meters',
    weight: '70 KG'
}</code></pre><figcaption>Un objeto JavaScript</figcaption></figure><p>Digamos que queremos que el nombre (name), el salario (salary) y el peso (weight) de este objeto se impriman en la consola.</p><figure class="kg-card kg-code-card"><pre><code>console.log(object.name)
console.log(object.salary)
console.log(object.weight)</code></pre><figcaption>Obtener el nombre (name), el salario (salary) y el peso (weight) del objeto.</figcaption></figure><p>Podemos obtenerlos usando las claves, que son el nombre, el salario y el peso.</p><p>Pero este código a veces se vuelve difícil de entender. &nbsp;Ahí es cuando la desestructuración es útil:</p><figure class="kg-card kg-code-card"><pre><code>let { name, salary, weight } = object;

console.log(name)
console.log(salary)
console.log(weight)</code></pre><figcaption>Desestructurar objetos</figcaption></figure><p>Y ahora, podemos simplemente registrar el nombre, el salario y el peso en lugar de usar ese método antiguo.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-111356.png" class="kg-image" alt="Screenshot-2021-08-07-111356" width="600" height="400" loading="lazy"></figure><p>También podemos usar la desestructuración para establecer valores predeterminados si el valor no está presente en el objeto.</p><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    height: '20 meters',
    weight: '70 KG'
}

let { name, salary, weight } = object;

console.log(name)
console.log(salary)
console.log(weight)</code></pre><p>Aquí, tenemos nombre y el peso presentes en el objeto, pero no el salario:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-111659.png" class="kg-image" alt="Screenshot-2021-08-07-111659" width="600" height="400" loading="lazy"></figure><p>Obtendremos un valor indefinido para el salario.</p><p>Para corregir ese problema, podemos establecer valores predeterminados cuando estamos desestructurando el objeto.</p><figure class="kg-card kg-code-card"><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    height: '20 meters',
    weight: '70 KG'
}

let { name, salary = 200, weight } = object;

console.log(name)
console.log(salary)
console.log(weight)</code></pre><figcaption>Establecer el valor predeterminado para el salario (salary).</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-111907.png" class="kg-image" alt="Screenshot-2021-08-07-111907" width="600" height="400" loading="lazy"></figure><p>Puedes ver que obtenemos 200 como salario. &nbsp;Esto solo funciona cuando no tenemos esa clave en el objeto y queremos establecer un valor predeterminado.</p><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    salary: 300,
    height: '20 meters',
    weight: '70 KG'
}

let { name, salary = 200, weight } = object;

console.log(name)
console.log(salary)
console.log(weight)</code></pre><p>Agregue salario en el objeto y obtendrá 300 como salario.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-112128.png" class="kg-image" alt="Screenshot-2021-08-07-112128" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-utilizar-la-desestructuraci-n-de-objetos-con-funciones">Cómo utilizar la desestructuración de objetos con funciones</h2><p>Digamos que tenemos una función que imprime todos los datos del arreglo en la consola.</p><figure class="kg-card kg-code-card"><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    salary: 300,
    height: '20 meters',
    weight: '70 KG'
}

function printData(){
    
}

printData(object)
</code></pre><figcaption>Función para imprimir datos en la consola</figcaption></figure><p>Pasamos el objeto como parámetro en la función cuando se llama:</p><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    salary: 300,
    height: '20 meters',
    weight: '70 KG'
}

function printData(object){
    console.log(object)
}

printData(object)</code></pre><p>Normalmente, haríamos algo como esto: pasar el objeto y registrarlo en la consola.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-115047.png" class="kg-image" alt="Screenshot-2021-08-07-115047" width="600" height="400" loading="lazy"></figure><p>Pero, de nuevo, podemos hacer lo mismo utilizando la desestructuración.</p><figure class="kg-card kg-code-card"><pre><code>let object = {
    name: "Nishant",
    age: 24, 
    salary: 300,
    height: '20 meters',
    weight: '70 KG'
}

function printData({name, age, salary, height, weight}){
    console.log(name, age, salary, height, weight)
}

printData(object)</code></pre><figcaption>Usar la desestructuración en funciones</figcaption></figure><p>Aquí, estamos desestructurando el objeto en nombre, edad, salario, altura y peso en los parámetros de la función e imprimimos todo en la misma línea.</p><p>Puede ver cómo la desestructuración hace que sea mucho más fácil de entender.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-115329.png" class="kg-image" alt="Screenshot-2021-08-07-115329" width="600" height="400" loading="lazy"><figcaption>Impresión de datos de objeto mediante Desestructuración</figcaption></figure><p>Veamos un último ejemplo.</p><figure class="kg-card kg-code-card"><pre><code>function sample(a, b) {
    return [a + b, a * b]
}

let example = sample(2, 5);
console.log(example)</code></pre><figcaption>Función para sumar y multiplicar dos números</figcaption></figure><p>Aquí tenemos una función que acepta dos números. &nbsp;Devuelve un arreglo agregándolos y multiplicándolos y los registra en la consola.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-120108.png" class="kg-image" alt="Screenshot-2021-08-07-120108" width="600" height="400" loading="lazy"></figure><p>Usemos la desestructuración aquí en su lugar.</p><p>Podemos desestructurarlo en variables de suma y multiplicación como esta:</p><figure class="kg-card kg-code-card"><pre><code>let [addition, multiplication] = sample(2, 5);
console.log(addition)
console.log(multiplication)</code></pre><figcaption>Usando la desestructuración</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-120325.png" class="kg-image" alt="Screenshot-2021-08-07-120325" width="600" height="400" loading="lazy"></figure><p>Y en la salida, puede ver que obtenemos la suma y la multiplicación de ambos números.</p><h2 id="-qu-es-el-operador-de-propagaci-n-spread-en-javascript">¿Qué es el operador de propagación (Spread) en JavaScript?</h2><p>Propagación significa esparcirse o expandirse. &nbsp;Y el operador de propagación en JavaScript se indica con tres puntos.</p><p>Este operador de propagación tiene muchos usos diferentes. &nbsp;Veámoslos uno por uno.</p><h3 id="ejemplos-de-operador-de-propagaci-n">Ejemplos de operador de propagación </h3><p>Digamos que tenemos dos arreglos y queremos fusionarlas.</p><figure class="kg-card kg-code-card"><pre><code>let array1 = [1, 2, 3, 4, 5]
let array2 = [6, 7, 8, 9, 10]

let array3 = array1.concat(array2);
console.log(array3)</code></pre><figcaption>Fusionando dos matrices con el método concat</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-112601.png" class="kg-image" alt="Screenshot-2021-08-07-112601" width="600" height="400" loading="lazy"></figure><p>Obtenemos la combinación de ambas arreglos, que son array1 y array2.</p><p>Pero hay una forma más sencilla de hacer esto:</p><figure class="kg-card kg-code-card"><pre><code>let array1 = [1, 2, 3, 4, 5]
let array2 = [6, 7, 8, 9, 10]

let array3 = [...array1, ...array2]
console.log(array3)</code></pre><figcaption>Fusionar dos matrices con el operador Spread</figcaption></figure><p>En este caso, estamos usando el operador de propagación para fusionar ambos arreglos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-113020.png" class="kg-image" alt="Screenshot-2021-08-07-113020" width="600" height="400" loading="lazy"></figure><p>Y como puede ver, obtendremos el mismo resultado.</p><p>Imaginemos otro caso de uso en el que tenemos que insertar <em>array1 </em>entre los elementos de <em>array2</em>.</p><p>Por ejemplo, queremos insertar <em>array2</em> entre el segundo y tercer elemento de <em>array1</em>.</p><p>¿Entonces cómo hacemos eso? &nbsp;Podemos hacer algo como esto:</p><figure class="kg-card kg-code-card"><pre><code>let array1 = [1, 2, 3, 4, 5]
let array2 = [6, 7, ...array1, 8, 9, 10]

console.log(array2);</code></pre><figcaption>Insertar array1 entre 7 y 8 de array2</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-113502.png" class="kg-image" alt="Screenshot-2021-08-07-113502" width="600" height="400" loading="lazy"></figure><p>Y puede ver, obtenemos los elementos array1 entre 7 y 8.</p><p>Ahora, fusionemos dos objetos usando el operador de propagación.</p><figure class="kg-card kg-code-card"><pre><code>let object1 = {
    firstName: "Nishant",
    age: 24, 
    salary: 300,
}

let object2 = {
    lastName: "Kumar",
    height: '20 meters',
    weight: '70 KG'
}</code></pre><figcaption>Dos objetos listos para fusionarse</figcaption></figure><p>Tenemos dos objetos aquí. &nbsp;Uno contiene nombre, edad y salario. &nbsp;El segundo contiene apellido, altura y peso.</p><p>Vamos a fusionarlos juntos.</p><figure class="kg-card kg-code-card"><pre><code>let object1 = {
    firstName: "Nishant",
    age: 24, 
    salary: 300,
}

let object2 = {
    lastName: "Kumar",
    height: '20 meters',
    weight: '70 KG'
}

let object3 = {...object1, ...object2}
console.log(object3);</code></pre><figcaption>Fusionar los dos objetos en un tercer objeto</figcaption></figure><p>Ahora hemos combinado ambos objetos usando el operador de propagación y hemos registrado el valor en la consola.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-114101.png" class="kg-image" alt="Screenshot-2021-08-07-114101" width="600" height="400" loading="lazy"><figcaption>Combinación de objetos anteriores</figcaption></figure><p>Puedes ver que estamos obteniendo la combinación de ambos objetos</p><p>Por último, también podemos copiar un arreglo en otro utilizando el operador de propagación. &nbsp;Déjame mostrarte como funciona:</p><figure class="kg-card kg-code-card"><pre><code>let array1 = [1, 2, 3, 4, 5]
let array2 = [...array1]
console.log(array2);</code></pre><figcaption>Copiando array1 en array2</figcaption></figure><p>Aquí, estamos copiando array1 en array2 usando el operador de propagación.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screenshot-2021-08-07-120757.png" class="kg-image" alt="Screenshot-2021-08-07-120757" width="600" height="400" loading="lazy"></figure><p>Estamos registrando array2 en la consola, y estamos obteniendo los elementos de <em>array1</em>.</p><h2 id="conclusi-n">Conclusión</h2><p>¡Eso es todo amigos! &nbsp;En este artículo, aprendimos sobre la desestructuración de arreglos y objetos y el operador de propagación propagación.</p><p>También puedes ver mi video de <a href="https://www.youtube.com/watch?v=QvQ4o0K9_g0">Desestructuración de arreglos y objetos y el operador de propagación</a> en Youtube (en ingles) si quieres complementar tu aprendizaje.</p><blockquote>Feliz aprendizaje.</blockquote> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ejemplo de VLOOKUP: Cómo hacer VLOOKUP en Excel ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Gregory V. Chapman [https://www.freecodecamp.org/news/author/gregory/] Artículo original VLOOKUP Example – How to Do VLOOKUP in Excel [https://www.freecodecamp.org/news/vlookup-in-excel/] Traducido y adaptado por Josue Custodio [/espanol/news/author/drifting] Microsoft Excel incluye una variedad de funciones diferentes que ayudan a los usuarios con cálculos de cualquier tipo.  La funcionalidad de Excel es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/ejemplo-de-vlookup-como-hacer-vlookup-en-excel/</link>
                <guid isPermaLink="false">614d3bc06534fb09457126ac</guid>
                
                    <category>
                        <![CDATA[ Excel ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Wed, 29 Sep 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/09/pexels-photo-4050320-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por </strong></strong><a href="https://www.freecodecamp.org/news/author/gregory/">Gregory V. Chapman</a><br><strong><strong>Artículo original </strong></strong><a href="https://www.freecodecamp.org/news/vlookup-in-excel/">VLOOKUP Example – How to Do VLOOKUP in Excel</a><br><strong><strong>Traducido y adaptado por </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting">Josue Custodio</a></p><p>Microsoft Excel incluye una variedad de funciones diferentes que ayudan a los usuarios con cálculos de cualquier tipo. &nbsp;La funcionalidad de Excel es tan completa que los usuarios promedio ni siquiera aprovechan la mayoría de las utilidades.</p><p>Sin embargo, si a menudo se desplaza por las columnas y filas en busca de la misma información, es probable que aprecie la función VLOOKUP. VLOOKUP, que significa "búsqueda vertical", puede ayudarlo a encontrar rápidamente los datos asociados con un determinado valor que ingrese.</p><p>Por ejemplo, puede tener una tabla que contenga productos con ID y precios únicos. &nbsp;VLOOKUP puede mostrarle el precio de un determinado producto si ingresa su ID.</p><p>Puede usar VLOOKUP de muchas formas diferentes y simplificará significativamente su trabajo, especialmente cuando se trata de tablas grandes.</p><p>No necesita perder mucho tiempo buscando una celda determinada porque esta función la encontrará por usted. &nbsp;Sin embargo, los usuarios principiantes a menudo tienen dificultades para configurar VLOOKUP. &nbsp;Por lo tanto, decidí ayudarlo preparando esta guía detallada.</p><h2 id="qu-es-vlookup">Qué es VLOOKUP?</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/m-b-m-ZzOa5G8hSPI-unsplash.jpg" class="kg-image" alt="m-b-m-ZzOa5G8hSPI-unsplash" width="600" height="400" loading="lazy"></figure><p>En primer lugar, VLOOKUP es una función. &nbsp;Por lo tanto, si es nuevo en Excel, es posible que desee familiarizarse con algunas funciones básicas, como AVERAGE, SUM o TODAY. &nbsp;De esta forma le resultará fácil comprender cómo funciona esta función.</p><p>VLOOKUP es una función de base de datos, por lo que está diseñada para tablas de base de datos. &nbsp;Estas tablas son básicamente listas de diferentes elementos. &nbsp;Por ejemplo, puede utilizar esta función cuando trabaje con listas de productos, empleados, clientes, etc.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/photo_2020-06-11_20-26-54.jpg" class="kg-image" alt="photo_2020-06-11_20-26-54" width="600" height="400" loading="lazy"></figure><p>Digamos que tiene una lista de productos que consta de cuatro columnas. Puede incluir el código del artículo en la primera columna, el nombre o descripción del producto en la segunda columna y el precio y la cantidad de artículos disponibles en stock en la tercera y cuarta columnas, respectivamente.</p><p>Las tablas de la base de datos suelen tener algún tipo de identificador único para cada elemento. &nbsp;En este caso, es el código del artículo. Esta columna es necesaria para que funcione la función VLOOKUP y debe ser la primera columna de su tabla.</p><p>Si es un principiante, lo primero que debe hacer es comprender qué hace exactamente VLOOKUP. &nbsp;En pocas palabras, muestra información de una lista o base de datos basada en el identificador único ingresado por el usuario.</p><p>Si consideramos el ejemplo anterior, esta función podría mostrar el precio, la descripción o la disponibilidad de un producto en función de su código de artículo. &nbsp;Lo que mostrará exactamente depende de la fórmula que escriba. &nbsp;VLOOKUP admite coincidencias tanto exactas como aproximadas, así como comodines para coincidencias parciales.</p><h2 id="c-mo-funciona-vlookup">Cómo funciona VLOOKUP</h2><p>Aquí está la sintaxis de las fórmulas que describen la función VLOOKUP:</p><p><code>=VLOOKUP(value, table, column_index, [range])</code></p><ul><li><code>value</code> es lo que buscará esta función en la primera columna.</li><li><code>table</code><em> </em>es la tabla de la que la función recuperará la información necesaria.</li><li><code>column_index</code> es el número de la columna de la que la función recuperará la información.</li><li><code>range</code><em> </em>es un parámetro booleano que puede ser TRUE o FALSE. &nbsp;TRUE &nbsp;es el valor predeterminado y corresponde a la coincidencia aproximada. FALSE le mostrará solo coincidencias exactas.</li></ul><p>Incluso el nombre de esta función incluye "vertical", y VLOOKUP solo está destinado a tablas donde los datos están organizados en columnas verticales. &nbsp;Por lo tanto, si está organizando sus datos horizontalmente, esta función será inútil. &nbsp;En este caso, puede utilizar una función similar para la búsqueda horizontal — <a href="https://support.microsoft.com/es-es/office/buscarh-funci%C3%B3n-buscarh-a3034eec-b719-4ba3-bb65-e1ad662ed95f?ui=en-us&amp;rs=en-us&amp;ad=us">HLOOKUP</a>.</p><p>También debe tener en cuenta que esta función solo funciona de izquierda a derecha. &nbsp;En otras palabras, si el identificador único no está en la primera columna de su tabla, la función no podrá recuperar información de las columnas a la izquierda del identificador.</p><p>Cada columna tiene su número y todas las columnas están numeradas de izquierda a derecha. &nbsp;Si desea obtener un valor de una determinada columna, debe especificar su número en su fórmula. &nbsp;En la plantilla de fórmula anterior, este número se llama <code>column_index</code>.</p><p>Por ejemplo, si desea recuperar el nombre del producto del ejemplo anterior, el índice de la columna debe ser 2.</p><p>Como ya mencioné anteriormente, la función VLOOKUP admite dos modos de coincidencia: aproximado y exacto. &nbsp;Este parámetro es el cuarto argumento de la fórmula. &nbsp;La coincidencia aproximada se establece de forma predeterminada. &nbsp;Si desea elegir la coincidencia exacta, debe establecer el rango de búsqueda en <code>FALSE</code>.</p><p>Por lo tanto, las dos fórmulas siguientes recuperarán datos utilizando una coincidencia aproximada:</p><p><code>=VLOOKUP(value, table, column_index)</code></p><p><code>=VLOOKUP(value, table, column_index, TRUE)</code></p><p>Como puede ver, si desea utilizar el modo de coincidencia exacta, debe tener cuidado. &nbsp;Si no proporciona ningún valor de rango de búsqueda, la función seguirá usando el modo de coincidencia aproximado.</p><p>La siguiente fórmula forzará el modo de coincidencia exacta:</p><p><code>=VLOOKUP(value, table, column_index, FALSE)</code></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/mika-baumeister-Wpnoqo2plFA-unsplash.jpg" class="kg-image" alt="mika-baumeister-Wpnoqo2plFA-unsplash" width="600" height="400" loading="lazy"></figure><p>Asegúrese de establecer el valor en &nbsp;<code>FALSE</code> i va a utilizar el modo de coincidencia exacta. &nbsp;Lo más probable es que necesite una coincidencia exacta en la mayoría de los casos, por lo que si es nuevo en Excel, no se olvide de este detalle.</p><p>La coincidencia exacta es la elección correcta si tiene una columna con el identificador del artículo. &nbsp;También puede ser cualquier valor único que se pueda utilizar para una búsqueda exacta. &nbsp;Por ejemplo, puede ser un título único de un libro o una película, así como cualquier otra palabra clave única. &nbsp;Tenga en cuenta que VLOOKUP no distingue entre mayúsculas y minúsculas.</p><p>Sin embargo, a veces es posible que no necesite la coincidencia exacta, sino la mejor coincidencia posible. &nbsp;En este caso, puede utilizar el modo de coincidencia aproximada.</p><p>Por ejemplo, puede usar este modo cuando se trata de tablas de datos donde la información necesaria corresponde a ciertos valores numéricos y desea recuperar resultados para un valor que no está incluido en la tabla.</p><p>Puede utilizar este enfoque al realizar cálculos basados ​​en los datos existentes. &nbsp;Si ingresa un valor y la función encuentra la coincidencia exacta, recuperará información de la fila correspondiente. &nbsp;Sin embargo, si no hay una coincidencia exacta en la tabla, la función coincidirá con la fila anterior.</p><p>¿Por qué coincidiría con la fila anterior y no con otra? &nbsp;Bueno, no lo hará si no organiza su mesa de la manera correcta. &nbsp;Para permitir que VLOOKUP busque el mejor valor aproximado, debe asegurarse de que todos los valores de esta columna estén ordenados en orden ascendente. &nbsp;En este caso, la función simplemente retrocederá y recuperará el valor más cercano.</p><h2 id="errores-n-a">Errores #N/A</h2><p>Al usar la función VLOOKUP, así como muchas otras funciones en Excel, a menudo puede obtener errores # N/A. &nbsp;Este error significa que no se encontró el valor.</p><p>Puede obtener este error por varias razones. &nbsp;Estos son algunos de los casos más comunes:</p><ul><li>Ha escrito mal el valor o ha añadido un espacio extra.</li><li>El valor necesario no existe en la tabla.</li><li>Está utilizando el modo de coincidencia exacta cuando busca un valor aproximado.</li><li>No ha introducido el rango de tabla correcto.</li><li>Ha copiado VLOOKUP mientras la referencia de la tabla no está bloqueada.</li></ul><p>Si su tabla tiene una referencia absoluta, significa que las filas y columnas no cambiarán si se copian. &nbsp;Sin embargo, este no es el caso con una referencia relativa. En este caso, deberá cambiar a la<a href="https://support.microsoft.com/es-es/office/alternar-entre-referencias-relativas-absolutas-y-mixtas-dfec08cd-ae65-4f56-839e-5f0d8d0baca9?ui=en-us&amp;rs=en-us&amp;ad=us"> referencia absoluta</a>.</p><p>Puede personalizar el texto del error #N/A utilizando la <a href="https://support.microsoft.com/es-es/office/si-nd-funci%C3%B3n-si-nd-6626c961-a569-42fc-a49d-79b4951fd461?ui=en-us&amp;rs=en-ie&amp;ad=ie">función IFNA</a>. &nbsp;En este caso, debe escribir una fórmula más larga con IFNA que incluya VLOOKUP.</p><p>A continuación, se muestra un ejemplo de una fórmula que devolverá "no encontrado" en lugar de #N/A:</p><p><code>=IFNA(VLOOKUP(value, table, column_index, FALSE), "not found")</code></p><p>Y aquí hay una fórmula que devolverá un resultado en blanco:</p><p><code>=IFNA(VLOOKUP(value, table, column_index, FALSE), "")</code></p><p>Aunque puede personalizar el mensaje, puede considerar usar el error #N/A porque atraerá su atención de inmediato y le informará si algo sale mal.</p><h2 id="c-mo-utilizar-vlookup">Cómo utilizar VLOOKUP</h2><p>Puede escribir fórmulas desde cero o también puede usar el menú de Excel. &nbsp;Seleccione la celda donde desea mostrar el resultado y luego seleccione la pestaña "Fórmulas".</p><p>Después de esto, haga clic en "Insertar función". &nbsp;Verá un cuadro donde puede seleccionar categorías de funciones y elegir la función VLOOKUP. También puede usar el cuadro "Buscar una función" e ingresar "vlookup"</p><p>Seleccione la función y aparecerá el cuadro “Argumento de función”. Aquí puede ingresar los parámetros necesarios de la función. &nbsp;En esta ventana, debe especificar el identificador único que está buscando, la ubicación de la base de datos y la información que corresponde al identificador que desea recuperar.</p><p>Estos argumentos son "Lookup_value", "Table_array" y "Col_index_num". Estos campos están escritos en negrita porque estos argumentos son obligatorios.</p><p>El cuarto argumento es para el modo de búsqueda, y puede o no especificarlo. &nbsp;El modo aproximado está configurado de forma predeterminada.</p><p>O ingrese el primer argumento, que es el identificador único, puede seleccionar la celda necesaria y presionar Enter. &nbsp;En este caso, el valor de esta celda se ingresará automáticamente como el primer argumento de la función VLOOKUP.</p><p>Ahora debes ingresar el segundo argumento. &nbsp;La base de datos no debe comenzar necesariamente en la esquina superior izquierda. &nbsp;Por ejemplo, también puede tener una fila que describa columnas, que sirve como encabezado.</p><p>“Una de las mejores cosas de la función BUSCARV es que la ubicación de la base de datos también se puede personalizar”, señala Bridget Allen, contadora de <a href="https://bestwritersonline.com/">Best Writers Online.</a></p><p>Dado que VLOOKUP solo funciona con números de columnas, debe especificar qué área de la tabla desea usar para la búsqueda. &nbsp;Para esto es el cuadro "Table_array".</p><p>Por ejemplo, si su tabla comienza en la esquina superior izquierda y su primera fila es un encabezado, puede seleccionar toda la base de datos sin la primera línea. &nbsp;Si su base de datos tiene cuatro columnas (AD) y cinco elementos, la matriz de la tabla será A2: D6, porque las celdas A1-D1 contendrán el encabezado.</p><p>Puede hacer clic en la pestaña de la hoja de trabajo necesaria y seleccionar el área con la base de datos. &nbsp;Presione Entrar y el rango de celdas seleccionado se agregará automáticamente al segundo argumento de la función VLOOKUP. &nbsp;Aquí hay un ejemplo de un argumento de función:</p><p><code>‘database_name’!A2:D6</code></p><p>En este caso, "database_name" es el nombre de la pestaña de la hoja de trabajo.</p><p>Ahora solo necesita especificar qué información desea recuperar y proporcionar el número de la columna necesaria.</p><p>Por ejemplo, si desea recuperar el precio de un artículo de la tabla al principio de este artículo, debe usar la tercera fila y el valor "Col_index_num" será 3.</p><h2 id="para-terminar">Para terminar</h2><p>Microsoft Excel tiene una amplia variedad de funciones que pueden ayudar a los usuarios a lidiar con diferentes cálculos y otras tareas. VLOOKUP es una función muy útil que puede recuperar información que corresponde a un cierto valor de una tabla de base de datos.</p><p>Si es nuevo en Excel, puede experimentar dificultades con esta función porque tiene cuatro argumentos.</p><p>Sin embargo, si sigue nuestra guía, podrá seleccionar los argumentos correctos y utilizar las fórmulas correctas. &nbsp;Si usa esta función varias veces en la práctica, comprenderá rápidamente cómo funciona, por lo que podrá usar VLOOKUP siempre que lo necesite.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Hojas de estilo CSS externas: Cómo vincular CSS a HTML e importar al Head ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Ilenia Magoni [https://www.freecodecamp.org/news/author/ilenia/] Artículo original External CSS Stylesheets – How to Link CSS to HTML and Import into Head [https://www.freecodecamp.org/news/external-css-stylesheets-how-to-link-css-to-html-and-import-into-head/] Traducido y adaptado por Josue Custodio [/espanol/news/author/drifting] Se considera una buena práctica tener tus hojas de estilo CSS en un archivo externo.  Entonces, ¿cómo puedes vincular ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/hojas-de-estilo-css-externas-como-vincular-css-a-html-e-importar-a-head/</link>
                <guid isPermaLink="false">614d30db6534fb0945712606</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Josué ]]>
                </dc:creator>
                <pubDate>Tue, 28 Sep 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/09/pexels-martin-damboldt-814499.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por </strong></strong><a href="https://www.freecodecamp.org/news/author/ilenia/">Ilenia Magoni</a><br><strong><strong>Artículo original </strong></strong><a href="https://www.freecodecamp.org/news/external-css-stylesheets-how-to-link-css-to-html-and-import-into-head/">External CSS Stylesheets – How to Link CSS to HTML and Import into Head</a><br><strong><strong>Traducido y adaptado por </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/drifting">Josue Custodio</a></p><p>Se considera una buena práctica tener tus hojas de estilo CSS en un archivo externo. &nbsp;Entonces, ¿cómo puedes vincular ese CSS a tu archivo HTML?</p><p>La vinculación a un archivo CSS externo es una parte importante de cualquier modelo de página HTML. Y en este artículo, aprenderemos cómo hacerlo.</p><h2 id="c-mo-vincular-un-archivo-css-a-un-archivo-html">Cómo vincular un archivo CSS a un archivo HTML</h2><p>Puedes vincular tu archivo CSS a tu archivo HTML agregando un elemento <code>link</code> dentro del <code>head</code> de tu archivo HTML, así:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
  &lt;html&gt;
    &lt;head&gt;
      &lt;link rel="stylesheet" src="style.css"&gt;
    &lt;/head&gt;
    &lt;body&gt;
    
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p>El elemento <code>link</code> tiene muchos usos, y es importante especificar los atributos correctos para que puedas usarlo para importar una hoja de estilo CSS externa. Veamos algunos atributos importantes ahora.</p><h2 id="el-atributo-rel">El atributo <code>rel</code> </h2><p>El primero de los dos atributos indispensables es el atributo <code>rel</code>. Utilizarás este atributo para indicarle al navegador cuál es la relación con el archivo importado.</p><p>Escribirás <code>rel="stylesheet"</code> para decirle al navegador que está importando una hoja de estilo.</p><h2 id="el-atributo-src">El atributo <code>src</code> </h2><p>El segundo atributo indispensable es el <code>src</code>, que especifica el archivo a importar.</p><p>Una situación común es que el archivo CSS y el archivo HTML estén en la misma carpeta. En tal caso, puedes escribir <code>src="style.css"</code>.</p><p>Si el archivo CSS y el archivo HTML están en carpetas diferentes, debes escribir el archivo correcto que debe pasar del archivo HTML al archivo CSS.</p><p>Por ejemplo, una situación común es que el archivo CSS está en una carpeta que es hermana del archivo HTML, así:</p><pre><code>proyecto --- index.html
            css ---------- style.css</code></pre><p>En este caso, necesitarás escribir una ruta como <code>"css/styles.css"</code>.</p><h2 id="el-atributo-type">El atributo <code>type</code> </h2><pre><code class="language-html">&lt;link rel="stylesheet" src="style.css" type="text/css"&gt;</code></pre><p>Usas el atributo <code>type</code> para definir el tipo de contenido al que está enlazando. Para un archivo CSS, esto será <code>text/css</code>. Pero <code>css</code> es el único lenguaje de hoja de estilo que se utiliza en la web, no solo es opcional, sino que incluso es una buena práctica no incluirlo.</p><h2 id="el-atributo-media">El atributo <code>media</code> </h2><pre><code class="language-html">&lt;link rel="stylesheet" src="style.css" media="screen and (max-width: 600px)"&gt;</code></pre><p>El atributo de medios no es visible en el ejemplo. &nbsp;Es un atributo opcional que puedes usar para especificar cuándo importar una determinada hoja de estilo. Su valor debe ser una media type / media query (tipo de medio / consulta de medios).</p><p>Esto puede resultar útil en caso de que desees separar los estilos para diferentes dispositivos y tamaños de pantalla en diferentes archivos. Debería importar cada archivo CSS con su propio elemento <code>link</code>.</p><h2 id="conclusi-n">Conclusión</h2><p>En este artículo, has aprendido cómo agregar una hoja de estilo externa a tu página web usando el elemento <code>link</code> &nbsp;y los atributos <code>rel</code> &nbsp;<code>src</code>.</p><p>También aprendiste que puedes importar varias hojas de estilo y utilizar el atributo <code>media</code> para determinar cuándo se debe aplicar cada uno.</p><p>¡Diviértete creando páginas web!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
