<?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[ Augustin Afric - 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[ Augustin Afric - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 13 Jun 2026 19:46:19 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/augustinafric/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Formulario HTML – Ejemplos de tipo de entrada y botón de envío ]]>
                </title>
                <description>
                    <![CDATA[ Los formularios son una de las partes más importantes de la web. Sin ellos, no habría una manera fácil de recopilar datos, buscar recursos o registrarse para recibir información valiosa. Puede incrustar formularios en sitios web con el elemento HTML form. Dentro del elemento de formulario, se anidan varias entradas. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/formulario-html-ejemplos-de-tipo-de-entrada-y-boton-de-envio/</link>
                <guid isPermaLink="false">63b7f181a0461907f4174421</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Augustin Afric ]]>
                </dc:creator>
                <pubDate>Thu, 16 Feb 2023 02:21:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/form-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/html-form-input-type-and-submit-button-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">HTML Form – Input Type and Submit Button Example</a>
      </p><p>Los formularios son una de las partes más importantes de la web. Sin ellos, no habría una manera fácil de recopilar datos, buscar recursos o registrarse para recibir información valiosa.</p><p>Puede incrustar formularios en sitios web con el elemento HTML <code>form</code>. Dentro del elemento de formulario, se anidan varias entradas. Estas entradas también se conocen como controles de formulario.</p><p>En este tutorial, exploraremos el elemento HTML <code>form</code>, los diversos tipos de entrada que toma y cómo crear un botón de envío con el que se envían los datos.</p><p>Al final, sabrá cómo funcionan los formularios y podrá crearlos con confianza.</p><h2 id="sintaxis-b-sica-del-formulario-html"><strong>Sintaxis básica del formulario HTML</strong></h2><pre><code class="language-html">&lt;form action="mipaginaweb.com" method="POST"&gt;
    &lt;!--La entrada de cualquier tipo y áreas de texto entra aquí--&gt;
&lt;/form&gt;
</code></pre><h2 id="tipos-de-entrada-de-formularios-html"><strong>Tipos de entrada de formularios HTML</strong></h2><p>Usas la etiqueta <code>&lt;input&gt;</code> &nbsp;para crear varios controles en HTML. Es un elemento en línea y toma atributos como <code>type</code>, <code>name</code>, <code>minlength</code>, <code>maxlength</code>, <code>placeholder</code>, y así. Cada uno de estos tiene valores específicos que toman.</p><p>El atributo <code>placeholder</code> es importante, ya que ayuda al usuario a comprender el propósito del input antes de escribir algo.</p><p>Hay 20 tipos inputs diferentes, y los veremos uno por uno.</p><h3 id="type-text"><strong>Type text</strong></h3><p>Este tipo de input toma un valor de "texto", por lo que crea una sola línea de entrada de texto.</p><pre><code class="language-html">&lt;input type="text" placeholder="Introduce nombre" /&gt;
</code></pre><p>Un input con el type="text" se parece a la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/textInput.png" class="kg-image" alt="textInput" width="600" height="400" loading="lazy"></figure><h3 id="type-password"><strong>Type Password</strong></h3><p>Como su nombre lo indica, una entrada con un tipo de contraseña crea una contraseña. Es automáticamente invisible para el usuario, a menos que sea manipulado por JavaScript.</p><pre><code class="language-html">&lt;input type="password" placeholder="Enter your password" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/passwordInput.png" class="kg-image" alt="passwordInput" width="600" height="400" loading="lazy"></figure><h3 id="type-email"><strong><strong>T</strong>ype Email</strong></h3><p>Cualquier entrada con el tipo de correo electrónico define un campo para ingresar una dirección de correo electrónico.</p><pre><code class="language-html">&lt;input type="email" placeholder="Enter your email" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeEmail.png" class="kg-image" alt="typeEmail" width="600" height="400" loading="lazy"></figure><h3 id="type-number"><strong><strong>T</strong>ype Number</strong></h3><p>Este tipo de entrada permite al usuario insertar solo números.</p><pre><code class="language-html">&lt;input type="number" placeholder="Enter a number" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/numberInput.png" class="kg-image" alt="numberInput" width="600" height="400" loading="lazy"></figure><h3 id="type-radio"><strong><strong>T</strong>ype Radio</strong></h3><p>A veces, los usuarios tendrán que elegir una de las numerosas opciones. Un campo de entrada con sus atributos de tipo establecidos en "radio" le permite hacer esto.</p><pre><code class="language-html"> &lt;input type="radio" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeRadio.png" class="kg-image" alt="typeRadio" width="600" height="400" loading="lazy"></figure><h3 id="type-checkbox"><strong><strong>T</strong>ype<strong> Checkbox</strong></strong></h3><p>Por lo tanto, con un tipo de entrada de radio, los usuarios podrán elegir una de numerosas opciones. ¿Qué pasa si quieres que elijan tantas opciones como sea posible? Eso es lo que una entrada con un atributo de tipo establecido en <code>checkbox</code> hace.</p><pre><code class="language-html">&lt;input type="checkbox" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeCheckbox.png" class="kg-image" alt="typeCheckbox" width="600" height="400" loading="lazy"></figure><h3 id="type-submit"><strong><strong>T</strong>ype<strong> Submit</strong></strong></h3><p>Utilice este tipo para agregar un botón de envío a los formularios. Cuando un usuario hace clic en él, envía automáticamente el formulario. Toma un atributo de valor, que define el texto que aparece dentro del botón.</p><pre><code class="language-html">&lt;input type="submit" value="Enter to Win" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeSubmit.png" class="kg-image" alt="typeSubmit" width="600" height="400" loading="lazy"></figure><h3 id="type-button"><strong><strong>Type Button</strong></strong></h3><p>Una entrada con un tipo establecido en button crea un botón, que puede ser manipulado por el tipo de detector de eventos onClick de JavaScript. Crea un botón como un tipo de entrada de envío, pero con la excepción de que el valor está vacío de forma predeterminada, por lo que debe especificarse.</p><pre><code class="language-html">&lt;input type="button" value="Submit" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeButton.png" class="kg-image" alt="typeButton" width="600" height="400" loading="lazy"></figure><h3 id="type-file"><strong><strong>Type File</strong></strong></h3><p>Esto define un campo para el envío de archivos. Cuando un usuario hace clic en él, se le solicita que inserte el tipo de archivo deseado, que puede ser una imagen, un PDF, un archivo de documento, etc.</p><pre><code class="language-html">&lt;input type="file" /&gt;
</code></pre><p>El resultado de un input con el type="file" se ve así:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/fileInput.png" class="kg-image" alt="fileInput" width="600" height="400" loading="lazy"></figure><h3 id="type-color"><strong><strong>Type Color</strong></strong></h3><p>Este es un tipo de entrada elegante introducido por HTML5. Con él, el usuario puede enviar su color favorito, por ejemplo. El negro (#000000) es el valor predeterminado, pero se puede anular configurando el valor en el color deseado.</p><p><br>Muchos desarrolladores lo han utilizado como truco para llegar a seleccionar diferentes tonos de color disponibles en formatos RGB, HSL y alfanuméricos.</p><pre><code class="language-html">&lt;input type="color" /&gt;
</code></pre><p>Este es el resultado de un tipo de entrada de color:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/colorInput.png" class="kg-image" alt="colorInput" width="600" height="400" loading="lazy"></figure><h3 id="type-search"><strong><strong>Type Search</strong></strong></h3><p>La entrada con el tipo de búsqueda define un campo de texto como un tipo de entrada de texto. Pero esta vez tiene el único propósito de buscar información. Se diferencia de escribir texto en que aparece un botón de cancelar una vez que el usuario comienza a escribir.</p><pre><code class="language-html">&lt;input type="search" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeSearch.png" class="kg-image" alt="typeSearch" width="600" height="400" loading="lazy"></figure><h3 id="type-url"><strong><strong>Type URL</strong></strong></h3><p>Cuando el atributo de tipo de una etiqueta de entrada se establece en URL, muestra un campo donde los usuarios pueden ingresar una URL.</p><pre><code class="language-html">&lt;input type="url" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeURL.png" class="kg-image" alt="typeURL" width="600" height="400" loading="lazy"></figure><h3 id="type-tel"><strong><strong>Type Tel</strong></strong></h3><p>Un tipo de entrada de tel le permite recopilar números de teléfono de los usuarios.</p><pre><code class="language-html">&lt;input type="tel" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/typeTel.png" class="kg-image" alt="typeTel" width="600" height="400" loading="lazy"></figure><h3 id="type-date"><strong><strong>Type Date</strong></strong></h3><p>Es posible que se haya registrado en un sitio web donde solicitó la fecha de un evento determinado. La web probablemente usó una entrada con el valor de tipo establecido "date" para lograr esto.</p><pre><code class="language-html">&lt;input type="date" /&gt;
</code></pre><p>Así es como se ve una entrada con tipo de fecha:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/dateInput.png" class="kg-image" alt="dateInput" width="600" height="400" loading="lazy"></figure><h3 id="type-datetime-local"><strong><strong>Type Datetime-local</strong></strong></h3><p>Esto funciona como el tipo de entrada fecha, pero también le permite al usuario elegir una fecha con una hora en particular.</p><pre><code class="language-html">&lt;input type="datetime-local" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/datelocalInput.png" class="kg-image" alt="datelocalInput" width="600" height="400" loading="lazy"></figure><h3 id="type-week"><strong><strong>Type Week</strong></strong></h3><p>El tipo de entrada de semana permite al usuario seleccionar una semana específica.</p><pre><code class="language-html">&lt;input type="week" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/weekInput.png" class="kg-image" alt="weekInput" width="600" height="400" loading="lazy"></figure><h3 id="type-month"><strong><strong>Type Month</strong></strong></h3><p>La entrada con el tipo de mes completa los meses para que el usuario elija cuando se hace clic.</p><pre><code class="language-html">&lt;input type="month" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/monthInput.png" class="kg-image" alt="monthInput" width="600" height="400" loading="lazy"></figure><h3 id="textarea"><strong><strong>Textarea</strong></strong></h3><p>Hay ocasiones en las que un usuario necesitará completar varias líneas de texto que no serían adecuadas en un tipo de entrada de texto(ya que especifica un campo de texto de una línea).</p><p><code>textarea</code> permite al usuario hacer esto porque define múltiples líneas de entrada de texto. Toma sus propios atributos, tales como <code>cols</code> – para el número de columnas, y <code>rows</code> para el número de filas.</p><pre><code class="language-html">&lt;textarea cols="50" rows="20"&gt;&lt;/textarea&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/textarea.png" class="kg-image" alt="textarea" width="600" height="400" loading="lazy"></figure><h3 id="multiple-select-box"><strong><strong>Multiple Select Box</strong></strong></h3><p>Esto es como un botón de radio y una casilla de verificación en un solo paquete. Está incrustado en la página con dos elementos: un elemento <code>select</code> y <code>option</code>, que siempre está anidado dentro de <code>select</code>.</p><p>De forma predeterminada, el usuario solo puede elegir una de las opciones. Pero con múltiples atributos, puede permitir que el usuario seleccione más de una de las opciones.</p><pre><code class="language-html">&lt;select&gt;
      &lt;option value="HTML"&gt;Select a Language&lt;/option&gt;
      &lt;option value="HTML"&gt;HTML&lt;/option&gt;
      &lt;option value="CSS"&gt;CSS&lt;/option&gt;
      &lt;option value="JavaScript"&gt;JavaScript&lt;/option&gt;
      &lt;option value="React"&gt;React&lt;/option&gt;
&lt;/select&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/selectDemo.gif" class="kg-image" alt="selectDemo" width="600" height="400" loading="lazy"></figure><h3 id="c-mo-etiquetar-entradas-html">Cómo etiquetar entradas HTML</h3><p>Es importante asignar etiquetas a los controles de formulario. Cuando están correctamente conectados al campo de entrada a través de su atributo <code>for</code> y el atributo <code>id</code>, es más fácil de usar para el usuario, ya que simplemente puede hacer clic en la etiqueta para acceder a la entrada.</p><pre><code class="language-html">&lt;label for="name"&gt;Name&lt;/label&gt;
&lt;input type="text" id="name" /&gt; &lt;br /&gt;
&lt;label for="check"&gt;Agree with terms&lt;/label&gt;
&lt;input type="checkbox" id="check" /&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/labelDemo.gif" class="kg-image" alt="labelDemo" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-funcionan-los-formularios-html">Cómo funcionan los formularios HTML</h2><p>Cuando un usuario completa un formulario y lo envía con el botón Enviar, los datos en los controles del formulario se envían al servidor a través de métodos de solicitud HTTP <code>GET</code> o <code>POST</code>.</p><p>Entonces, ¿cómo se indica el servidor? El elemento de formulario toma un atributo de acción, que debe tener su valor especificado en la URL del servidor. También toma un atributo de método, donde se especifica el método HTTP que utiliza para transmitir los valores al servidor.</p><p>Este método podría ser <code>GET</code> o <code>POST</code>. Con el método <code>GET</code>, los valores ingresados por el usuario son visibles en la URL cuando se envían los datos. Pero con <code>POST</code>, los valores se envían en encabezados HTTP, por lo que esos valores no son visibles en la URL.</p><p>Si no se usa un atributo de método en el formulario, se asume automáticamente que el usuario quiere usar el método GET, porque es el predeterminado.</p><p>Entonces, ¿cuándo debería usar los métodos <code>GET</code> o <code>POST</code>? Usa el método <code>GET</code> para enviar datos no confidenciales o recuperar datos de un servidor (por ejemplo, durante búsquedas). Utilizar el <code>POST</code> al enviar archivos o datos confidenciales.</p><h2 id="mini-proyecto-crea-un-formulario-de-contacto-b-sico">Mini Proyecto: Crea un formulario de contacto básico</h2><p>Tomemos lo que hemos aprendido sobre los formularios y usémoslo para hacer un formulario de contacto simple. También presentaré algunos conceptos nuevos a medida que avanzamos.</p><h3 id="el-html-"><strong>El<strong> HTML:</strong></strong></h3><pre><code class="language-html">&lt;form action=servidor-ejemplo.com"&gt;
      &lt;fieldset&gt;
        &lt;legend&gt;Contacto&lt;/legend&gt;
        &lt;div class="form-control"&gt;
          &lt;label for="name"&gt;Nombre&lt;/label&gt;
          &lt;input type="name" id="name" placeholder="Introduce tu nombre" required /&gt;
        &lt;/div&gt;

        &lt;div class="form-control"&gt;
          &lt;label for="email"&gt;Email&lt;/label&gt;
          &lt;input
            type="email"
            id="email"
            placeholder="Introduce tu Email"
            required
          /&gt;
        &lt;/div&gt;

        &lt;div class="form-control"&gt;
          &lt;label for="message"&gt;Mensaje&lt;/label&gt;
          &lt;textarea
            id="message"
            cols="30"
            rows="10"
            placeholder="Introduce tu mensaje"
            required
          &gt;&lt;/textarea&gt;
        &lt;/div&gt;
        &lt;input type="submit" value="Enviar" class="submit-btn" /&gt;
      &lt;/fieldset&gt;
&lt;/form&gt;
</code></pre><h3 id="-qu-est-pasando-en-este-c-digo-html">¿Qué está pasando en este código HTML?</h3><p>Primero, un elemento <code>form</code> está envolviendo todos los demás elementos. Tiene una acción establecida para <code>“servidor-ejemplo.com”</code>, un servidor ficticio donde se recibirán los datos del formulario.</p><p>Después del elemento de forma, todos los demás elementos también están rodeados por un elemento <code>fieldset</code> con la etiqueta <code>legend</code> debajo.</p><p>Usamos el elemento <code>fieldset</code> para agrupar las entradas relacionadas, y la etiqueta <code>legend</code> contiene un título que transmite de qué se trata el formulario.</p><p>Los campos <code>name</code>, <code>email</code>, y <code>textarea</code> están todos en un elemento <code>div</code> con la clase asignada "form-control". Por lo tanto, se comportan como un elemento de bloque para facilitar el estilo con CSS.</p><p>También están validados con el atributo <code>required</code>, en consecuencia, el formulario no se envía cuando esos campos están vacíos o cuando el usuario no ingresa los valores en el formato apropiado.</p><p>Después de todo eso, tendremos el resultado en la siguiente captura de pantalla:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/unstyledForm.png" class="kg-image" alt="unstyledForm" width="600" height="400" loading="lazy"></figure><p>¿Qué tan feo es eso? ¡Necesitamos aplicar algo de estilo!</p><h3 id="el-css-"><strong>El<strong> CSS:</strong></strong></h3><pre><code class="language-css">body {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100vh;
    font-family: cursive;
  }

 input,
    textarea {
    width: 100%;
    padding: 5px;
    outline: none;
  }

  label {
    line-height: 1.9rem;
  }

  input[type="submit"] {
   transform: translate(2.2%);
   padding: 3px;
   margin-top: 0.6rem;
   font-family: cursive;
   font-weight: bold;
  }

 fieldset {
   padding: 20px 40px;
 }
</code></pre><h3 id="-qu-hace-el-c-digo-css-aqu-">¿Qué hace el código CSS aquí?</h3><p>Centramos todo en el cuerpo horizontalmente con Flexbox y verticalmente con una altura de ventana del 100 %. Usamos una familia tipográfica de cursiva.</p><p>Le dimos a las entradas y a <code>textarea</code> un ancho del 100% para que tomen todo el ancho del contenedor padre. Las etiquetas tienen una altura de línea mínima de 1,9 rem (30,4 px), por lo que no se quedan demasiado cerca de sus respectivas entradas.</p><p>Diseñamos específicamente el botón (botón de tipo de entrada) con la propiedad de transformación para empujarlo hacia el centro, ya que estaba un poco descentrado. Le dimos un relleno de 3px para tener más espacio alrededor. Luego seleccionamos una familia de fuentes cursiva para él con un peso de negrita.</p><p>Porque el botón estaba demasiado cerca del <code>textarea</code>, establecemos un margen superior de 0,6 rem para empujarlo un poco hacia abajo.</p><p>Le dimos a nuestro elemento fieldset un relleno de 20 px en la parte superior e inferior, con 40 px a la izquierda y a la derecha para separar el borde que crea alrededor de los elementos de formulario en los que está envuelto.</p><p>Al final de todo, tenemos el hermoso formulario de la imagen:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/styledForm.png" class="kg-image" alt="styledForm" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n"><strong><strong>Conclusi</strong>ó<strong>n</strong></strong></h2><p>Espero que este tutorial te haya ayudado a comprender cómo funcionan los formularios. Ahora debe tener el conocimiento que necesita para integrar formularios en sus sitios web para que pueda comenzar a recopilar datos.</p><p>Gracias por leer, y sigue picando código.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo usar y crear directivas personalizadas en Angular ]]>
                </title>
                <description>
                    <![CDATA[ Después de jugar con Angular durante mucho tiempo, finalmente se me ocurrió una explicación comprensible de las directivas de Angular. En este artículo, primero entenderemos qué es exactamente una directiva y cómo usarla en Angular. También crearemos nuestras propias directivas personalizadas. ¿Entonces que estamos esperando? Profundicemos en ello. ¿Qué es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-y-crear-directivas-personalizadas-en-angular/</link>
                <guid isPermaLink="false">63a0b4fc84f230093051d863</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Augustin Afric ]]>
                </dc:creator>
                <pubDate>Fri, 06 Jan 2023 19:11:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/12/1_A4-tgMN9OZ6gIoRVFDJj_g.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/angular-directives-learn-how-to-use-or-create-custom-directives-in-angular-c9b133c24442/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/angular-directives-learn-how-to-use-or-create-custom-directives-in-angular-c9b133c24442/</a>
      </p><p>Después de jugar con Angular durante mucho tiempo, finalmente se me ocurrió una explicación comprensible de las directivas de Angular. En este artículo, primero entenderemos qué es exactamente una directiva y cómo usarla en Angular. También crearemos nuestras propias directivas personalizadas. ¿Entonces que estamos esperando? Profundicemos en ello.</p><h3 id="-qu-es-una-directiva-angular">¿Qué es una directiva angular?</h3><p>Las directivas son las funciones que se ejecutarán cada vez que el compilador Angular las encuentre. Las directivas angulares mejoran la capacidad de los elementos HTML al adjuntar comportamientos personalizados al DOM.</p><p>Las directivas angulares se clasifican en tres categorías.</p><ol><li><strong>Directivas de atributo</strong></li><li><strong>Directivas estructurales</strong></li><li><strong><strong>Componen</strong>tes</strong></li></ol><h3 id="directivas-de-atributo">Directivas de Atributo</h3><p>Las directivas de atributos son responsables de manipular la apariencia y el comportamiento de los elementos DOM. Podemos usar directivas de atributos para cambiar el estilo de los elementos DOM. Estas directivas también se usan para ocultar o mostrar condicionalmente elementos DOM particulares. Angular proporciona muchas directivas de atributos integradas como<strong> NgStyle</strong>, <strong>NgClass</strong>, etc. También podemos crear nuestras propias directivas de atributos personalizadas para la funcionalidad deseada.</p><h3 id="directivas-estructurales">Directivas Estructurales</h3><p>Las Directivas Estructurales son las encargadas de cambiar la estructura del DOM. Funcionan agregando o eliminando elementos del DOM, a diferencia de las directivas de atributos, que solo cambian la apariencia y el comportamiento del elemento.</p><p>Puede diferenciar fácilmente entre la directiva estructural y la de atributos mirando la sintaxis. El nombre de la Directiva estructural siempre comienza con un prefijo de asterisco (*), mientras que la Directiva de atributos no contiene ningún prefijo. Las tres directivas estructurales integradas más populares que proporciona Angular son <strong>NgIf</strong>, <strong>NgFor</strong> y <strong>NgSwitch</strong>.</p><h3 id="componentes">Componentes</h3><p>Los componentes son directivas con plantillas. La única diferencia entre los Componentes y los otros dos tipos de directivas es la Plantilla. Las directivas estructurales y de atributos no tienen plantillas. Entonces, podemos decir que el Componente es una versión más limpia de la Directiva con una plantilla, que es más fácil de usar.</p><h3 id="usando-directivas-integradas-de-angular">Usando directivas integradas de Angular</h3><p>Hay muchas directivas integradas disponibles en Angular que puede usar fácilmente. En esta sección, usaremos dos directivas incorporadas muy simples.</p><p>La directiva <strong>NgStyle</strong> es una directiva de atributo que se utiliza para cambiar el estilo de cualquier elemento DOM en función de alguna condición.</p><pre><code>&lt;p [ngStyle]="{'background': isBlue ? 'blue' : 'red'}"&gt; Soy una directiva de atributo&lt;/p&gt;</code></pre><blockquote>En el fragmento de código anterior, estamos agregando un fondo azul si el valor de la variable <code>isBlue</code> es true. Si el valor de la variable <code>isBlue</code> es falso, entonces el fondo del elemento anterior será rojo.</blockquote><p>La directiva <strong>NgIf</strong> es una directiva estructural que se utiliza para agregar elementos al DOM de acuerdo con alguna condición.</p><pre><code>&lt;p *ngIf="show"&gt;Soy una directiva estructural&lt;/p&gt;</code></pre><blockquote>En el fragmento de código anterior, todo el párrafo permanecerá en el DOM si el valor de la variable <code>show</code> es true, de lo contrario, se iniciará desde el DOM.</blockquote><h3 id="crear-una-directiva-de-atributos-personalizada">Crear una directiva de atributos personalizada</h3><p>Crear una directiva personalizada es como crear un componente Angular. Para crear una directiva personalizada, debemos reemplazar el decorador <code>@Component</code> con el decorador <code>@Directive</code>.</p><p>Entonces, comencemos con la creación de nuestra primera directiva de atributos personalizados. En esta directiva, vamos a resaltar el elemento DOM seleccionado configurando el color de fondo de un elemento.</p><p>Crea un fichero <code>app-highlight.directive.ts</code> en la carpeta <code>src/app</code> y añade el siguiente fragmento de código.</p><pre><code>import { Directive, ElementRef } from '@angular/core';</code></pre><pre><code>@Directive({</code></pre><pre><code>    selector: '[appHighlight]'</code></pre><pre><code>})</code></pre><pre><code>export class HighlightDirective {</code></pre><pre><code>    constructor(private eleRef: ElementRef) {</code></pre><pre><code>        eleRef.nativeElement.style.background = 'red';</code></pre><pre><code>    }</code></pre><pre><code>}</code></pre><p>Aquí, estamos importando <code>Directive</code> y <code>ElementRef</code> desde "@angular/core". La directiva proporciona la funcionalidad del decorador <code>@Directive</code> en el que proporcionamos su selector de propiedades a <code>appHighLight</code> para que podamos usar este selector en cualquier lugar de la aplicación. También estamos importando <code>ElementRef</code> que es responsable de acceder al elemento DOM.</p><p>Ahora, para que funcione la directiva <code>appHighlight</code>, debemos agregar nuestra directiva al arreglo de declaraciones en el archivo <code>app.module.ts</code>.</p><pre><code>import ...;</code></pre><pre><code>import { ChangeThemeDirective } from './app-highlight.directive';</code></pre><pre><code>@NgModule({</code></pre><pre><code>declarations: [</code></pre><pre><code>AppComponent,</code></pre><pre><code>ChangeThemeDirective</code></pre><pre><code>],</code></pre><pre><code>imports: [</code></pre><pre><code>...</code></pre><pre><code>],</code></pre><pre><code>providers: [],</code></pre><pre><code>bootstrap: [AppComponent]</code></pre><pre><code>})</code></pre><pre><code>export class AppModule { }</code></pre><p>Ahora vamos a usar nuestra directiva personalizada recién creada. Estoy agregando la directiva <code>appHightlight</code> en <code>app.component.html</code> pero puede usarla en cualquier parte de la aplicación.</p><pre><code>&lt;h1 appHightlight&gt;Highlight Me !&lt;/h1&gt;</code></pre><p>El resultado del fragmento de código anterior se verá así.</p><h3 id="creaci-n-de-una-directiva-estructural-personalizada">Creación de una directiva estructural personalizada</h3><p>En la sección anterior, creamos nuestra primera directiva de atributos. El mismo enfoque se utiliza para crear la directiva estructural.</p><p>Entonces, comencemos con la creación de nuestra directiva estructural. En esta directiva, vamos a implementar la directiva <code>*appNot</code> que funcionará justo al contrario de <code>*ngIf</code>.</p><p>Crea un fichero <code>app-not.directive.ts</code> en la carpeta <code>src/app</code> y añade el siguiente código.</p><pre><code>import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';</code></pre><pre><code>@Directive({</code></pre><pre><code>    selector: '[appNot]'</code></pre><pre><code>})</code></pre><pre><code>export class AppNotDirective {</code></pre><pre><code>constructor(</code></pre><pre><code>    private templateRef: TemplateRef&lt;any&gt;,</code></pre><pre><code>    private viewContainer: ViewContainerRef) { }</code></pre><pre><code>    @Input() set appNot(condition: boolean) {</code></pre><pre><code>        if (!condition) {</code></pre><pre><code>            this.viewContainer.createEmbeddedView(this.templateRef);</code></pre><pre><code>        } else {</code></pre><pre><code>            this.viewContainer.clear();        }</code></pre><pre><code>    }</code></pre><pre><code>}</code></pre><p>En el fragmento de código anterior, estamos importando <code>Directive, Input, TemplateRef y ViewContainerRef</code> desde <code>@angular/core.</code></p><p><code>Directive</code> proporciona la misma funcionalidad para el decorador <code>@Directive</code>. El decorador <code>Input</code> se utiliza para la comunicación entre los dos componentes. Envía datos de un componente a otro mediante el enlace de propiedades.</p><p><code>TemplateRef</code> representa la plantilla incorporada que se utiliza para instanciar las vistas incorporadas. Estas vistas incorporadas están vinculadas a la plantilla que se va a renderizar.</p><p><code>ViewContainerRef</code> es un contenedor donde se pueden adjuntar una o más vistas. Nosotros podemos usar la función <code>createEmbeddedView()</code> para adjuntar la plantilla incorporada al contenedor.</p><p>Ahora, para hacer que la directiva <code>appNot</code> funcione, necesitamos agregar nuestra directiva al arreglo de declaraciones en el <code>app.module.ts</code>.</p><pre><code>import ...;</code></pre><pre><code>import { AppNotDirective } from './app-not.directive';</code></pre><pre><code>@NgModule({</code></pre><pre><code>declarations: [</code></pre><pre><code>AppComponent,</code></pre><pre><code>AppNotDirective</code></pre><pre><code>],</code></pre><pre><code>imports: [</code></pre><pre><code>...</code></pre><pre><code>],</code></pre><pre><code>providers: [],</code></pre><pre><code>bootstrap: [AppComponent]</code></pre><pre><code>})</code></pre><pre><code>export class AppModule { }</code></pre><p>Ahora es el momento de usar nuestra directiva estructural recién creada.</p><p>Estoy agregando la directiva <code>appNot</code> en <code>app.component.html</code> pero puede usarla en cualquier parte de la aplicación.</p><pre><code>&lt;h1 *appNot="true"&gt;True&lt;/h1&gt;&lt;h1 *appNot="false"&gt;False&lt;/h1&gt;</code></pre><p>La directiva <code>*appNot</code> está diseñada de tal manera que agrega el elemento de plantilla en el DOM si el valor de <code>*appNot</code> es <code>false</code> , justamente lo contrario de la directiva <code>*ngIf</code>.</p><p>El resultado del fragmento de código anterior se verá así.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/Gq-nb90cSoMpnte266GnWRQb3RuUqVESuRAe" class="kg-image" alt="Gq-nb90cSoMpnte266GnWRQb3RuUqVESuRAe" width="702" height="78" loading="lazy"></figure><p>Espero que este artículo haya respondido a la mayoría de sus preguntas sobre las directivas de Angular. Si tiene alguna consulta o duda, no dude en comunicarse conmigo en el cuadro de comentarios.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Renderizando del lado del cliente vs. renderizando del lado del servidor: por qué no todo es blanco y negro ]]>
                </title>
                <description>
                    <![CDATA[ Desde el principio de los tiempos, el método convencional para mostrar su HTML en una pantalla fue mediante el uso de la renderización desde el servidor. Era la única manera. Cargabas tus páginas .html en tu servidor, luego tu servidor las convertía en documentos útiles en los navegadores de tus ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/lado-del-cliente-vs-lado-del-servidor/</link>
                <guid isPermaLink="false">639214ca980b9a08b63a6774</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Augustin Afric ]]>
                </dc:creator>
                <pubDate>Wed, 21 Dec 2022 22:48:35 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/12/post-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/what-exactly-is-client-side-rendering-and-hows-it-different-from-server-side-rendering-bd5c786b340d/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/what-exactly-is-client-side-rendering-and-hows-it-different-from-server-side-rendering-bd5c786b340d/</a>
      </p><p>Desde el principio de los tiempos, el método convencional para mostrar su HTML en una pantalla fue mediante el uso de la renderización desde el servidor. Era la única manera. Cargabas tus páginas .html en tu servidor, luego tu servidor las convertía en documentos útiles en los navegadores de tus usuarios.</p><p>La renderización desde el servidor también funcionó muy bien en ese momento, ya que la mayoría de las páginas web eran en su mayoría solo para mostrar imágenes y texto estáticos, con poca interactividad.</p><p>A día de hoy ese ya no es el caso. Se podría argumentar que los sitios web en estos días son más como aplicaciones que fingen ser sitios web. Puede usarlos para enviar mensajes, actualizar información en línea, comprar y mucho más. La web es mucho más avanzada de lo que solía ser.</p><p>Por lo tanto, tiene sentido que la renderización desde el servidor esté comenzando lentamente a quedar relegada al creciente método de renderización de páginas web en el lado del cliente.</p><p>Entonces, ¿qué método es la mejor opción? Como con la mayoría de las cosas en desarrollo, realmente depende de lo que planee hacer con su sitio web. Debe comprender los pros y los contras, luego decidir por sí mismo qué ruta es mejor.</p><h2 id="c-mo-funciona-la-renderizaci-n-desde-el-servidor">Cómo funciona la renderización desde el servidor</h2><p>La renderización desde el servidor es el método más común para mostrar información en la pantalla. Funciona convirtiendo archivos HTML del servidor en información utilizable para el navegador.</p><p>Cada vez que visita un sitio web, su navegador realiza una solicitud al servidor que contiene los contenidos del sitio web. La solicitud generalmente solo toma unos pocos milisegundos, pero eso depende en última instancia de una multitud de factores:</p><ul><li>Tu velocidad de internet</li><li>la ubicación del servidor</li><li>cuántos usuarios intentan acceder al sitio web</li><li>y qué tan optimizado está el sitio web, por nombrar algunos</li></ul><p>Una vez que se procesa la solicitud en el servidor, su navegador recupera el HTML completamente renderizado y lo muestra en la pantalla. Si luego decide visitar una página diferente en el sitio web, su navegador volverá a solicitar la nueva información. Esto ocurrirá cada vez que visite una página de la que su navegador no tenga una versión en caché.</p><p>No importa si la nueva página solo tiene algunos elementos que son diferentes a la página actual, el navegador solicitará la nueva página completa y volverá a mostrar todo desde cero.</p><p>Tomemos como ejemplo este documento HTML que se ha colocado en un servidor imaginario con una dirección HTTP de <code>example.testsite.com</code>.</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;title&gt;Ejemplo de sitio web&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Mi sitio Web&lt;/h1&gt;
    &lt;p&gt;Esto es un ejemplo de mi nuevo sitio web&lt;/p&gt;
    &lt;a href="http://example.testsite.com/other.html."&gt;Link&lt;/a&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p>Si tuviera que escribir la dirección del sitio web que usamos como ejemplo en la URL de su navegador, su navegador haría una solicitud al servidor que utiliza esa URL y esperaría una respuesta de algún texto para mostrar en el navegador. En este caso, lo que verías visualmente sería el título, el contenido del párrafo y el link.</p><p>Ahora, suponga que desea hacer clic en el enlace de la página renderizada que contiene el siguiente código.</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;title&gt;Ejemplo de sitio web&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Mi sitio Web&lt;/h1&gt;
    &lt;p&gt;Esto es un ejemplo de mi nuevo sitio web&lt;/p&gt;
    &lt;p&gt;Esto es más contenido desde other.html&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p>La única diferencia entre la página anterior y esta es que esta página no tiene un enlace y en su lugar tiene otro párrafo. La lógica dictaría que solo se debería renderizar el nuevo contenido y dejar el resto. Por desgracia, no es así como funciona la renderización desde el servidor. Lo que sucedería en realidad sería que se renderiza toda la página de nuevo, y no solo el contenido nuevo.</p><p>Si bien estos dos ejemplos pueden no parecer gran cosa, la mayoría de los sitios web no son tan simples. Los sitios web modernos tienen cientos de líneas de código y son mucho más complejos. Ahora imagine navegar por una página web y tener que esperar a que se muestren todas y cada una de las páginas al navegar por el sitio. Si alguna vez ha visitado un sitio de WordPress, habrá visto lo lentos que pueden ser. Esta es una de las razones del porqué.</p><p>Por el lado positivo, la renderización desde el servidor es excelente para SEO. Su contenido está cargado antes, por lo que los motores de búsqueda pueden indexarlo y rastrearlo sin problemas. Algo que no ocurre con el renderizado del lado del cliente. Al menos no simplemente.</p><h2 id="como-funciona-la-renderizaci-n-por-el-lado-del-cliente">Como funciona la renderización por el lado del cliente</h2><p>Cuando los desarrolladores hablan de renderización del lado del cliente, se refieren a la renderización de contenido en el navegador mediante JavaScript. Entonces, en lugar de obtener todo el contenido del documento HTML en sí, está obteniendo un documento HTML básico con un archivo JavaScript que renderizara el resto del sitio usando el navegador.</p><p>Este es un enfoque relativamente nuevo para renderizar sitios web, y realmente no se volvió popular hasta que las bibliotecas de JavaScript comenzaron a incorporarlo en su estilo de desarrollo. Algunos ejemplos notables son Vue.js y React.js.</p><p>Volviendo al sitio web que creamos anteriormente, <code>example.testsite.com</code>, suponga que ahora tiene un archivo index.html con las siguientes líneas de código.</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset="utf-8"&gt;
  &lt;title&gt;Ejemplo de sitio web&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div id="root"&gt;
    &lt;app&gt;&lt;/app&gt;
  &lt;/div&gt;
  &lt;script src="https://vuejs.org"type="text/javascript"&gt;&lt;/script&gt;
  &lt;script src="location/of/app.js"type="text/javascript"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>Puede ver de inmediato que hay algunos cambios importantes en la forma en que index.html funciona cuando se procesa con el cliente.</p><p>Para empezar, en lugar de tener el contenido dentro del archivo HTML, tiene un contenedor div con un ID "root". También tiene dos elementos script justo encima de la etiqueta &lt;/body&gt;. Uno que cargará la biblioteca JavaScript de Vue.js y otro que cargará un archivo llamado app.js.</p><p>Esto es radicalmente diferente al uso de la renderización desde el servidor porque el servidor ahora solo es responsable de cargar una parte mínima del sitio web. El código principal repetitivo. Todo lo demás es manejado por una biblioteca de JavaScript del lado del cliente, en este caso, Vue.js y código de JavaScript personalizado.</p><p>Si hiciera una solicitud a la URL con solo el código anterior, obtendría una pantalla en blanco. No hay nada que cargar, ya que el contenido real debe procesarse mediante JavaScript.</p><p>Para solucionarlo, necesita las siguientes líneas de código en el archivo app.js.</p><pre><code class="language-js">var data = {
        title:"Mi sitio web",
        message:"Esto es un ejemplo de mi sitio web"
      }
  Vue.component('app', {
    template:
    `
    &lt;div&gt;
    &lt;h1&gt;{{title}}&lt;/h1&gt;
    &lt;p id="moreContent"&gt;{{message}}&lt;/p&gt;
    &lt;a v-on:click='newContent'&gt;Link&lt;/a&gt;
    &lt;/div&gt;
    `,
    data: function() {
      return data;
    },
    methods:{
      newContent: function(){
        var node = document.createElement('p');
        var textNode = document.createTextNode('Esto es más contenido desde other.html');
        node.appendChild(textNode);
        document.getElementById('moreContent').appendChild(node);
      }
    }
  })
  new Vue({
    el: '#root',
  });</code></pre><p>Ahora, si visita la URL, verá el mismo contenido que vio en el ejemplo del lado del servidor. La diferencia clave es que si hiciera clic en el enlace de la página para cargar más contenido, el navegador no realizará otra solicitud al servidor. Está procesando elementos con el navegador, por lo que utilizará JavaScript para cargar el contenido nuevo y Vue.js se asegurará de que solo se procese el contenido nuevo.</p><p>Esto es mucho más rápido, ya que solo está cargando una sección muy pequeña de la página para obtener el nuevo contenido, en lugar de cargar toda la página.</p><p>Sin embargo, con el uso de la renderización del lado del cliente, el contenido no se procesa hasta que la página se carga en el navegador y el SEO del sitio web se verá afectado. Hay formas de evitar esto, pero no es tan fácil como lo es con la renderización desde el servidor.</p><p>Otra cosa a tener en cuenta es que su sitio web/aplicación no podrá cargarse hasta que TODO el JavaScript se descargue en el navegador. Lo cual tiene sentido, ya que contiene todo el contenido que se necesitará. Si sus usuarios están utilizando una conexión a internet lenta, podría hacer que su tiempo de carga inicial sea un poco largo.</p><h2 id="las-ventajas-y-los-contras-de-cada-enfoque">Las ventajas y los contras de cada enfoque</h2><p>Así que ahí lo tienes. Esas son las principales diferencias entre el renderizado del lado del servidor y del lado del cliente. Solo usted, el desarrollador, puede decidir qué opción es mejor para su sitio web o aplicación.</p><p>A continuación se muestra un desglose rápido de los pros y los contras de cada enfoque:</p><h4 id="ventajas-renderizando-desde-el-servidor-"><strong>Ventajas renderizando desde el servidor:</strong></h4><ol><li>Los motores de búsqueda pueden rastrear el sitio para un mejor SEO.</li><li>La carga de la página inicial es más rápida.</li><li>Ideal para sitios estáticos.</li></ol><h4 id="contras-renderizando-desde-el-servidor-"><strong>Contras renderizando desde el servidor:</strong></h4><ol><li>Solicitudes frecuentes al servidor.</li><li>Una renderización generalmente lenta.</li><li>Recargas de página completa.</li><li>Interacciones de sitios web pobres.</li></ol><h4 id="ventajas-renderizando-desde-el-cliente-"><strong>Ventajas renderizando desde el cliente:</strong></h4><ol><li>Muchas interacciones en los sitios web.</li><li>Renderizado rápido del sitio web después de la carga inicial.</li><li>Ideal para aplicaciones web.</li><li>Sólida selección de bibliotecas de JavaScript.</li></ol><h4 id="contras-renderizando-desde-el-cliente-"><strong>Contras renderizando desde el cliente:</strong></h4><ol><li>SEO bajo si no se implementa correctamente.</li><li>La carga inicial puede requerir más tiempo.</li><li>En la mayoría de los casos, requiere una biblioteca externa.</li></ol> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
