nuxt javascript https://drupaladicto.com/ es `let' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz) https://drupaladicto.com/snippet/let-available-es6-use-esversion-6-or-mozilla-js-extensions-use-moz <span class="field field--name-title field--type-string field--label-hidden">`let&#039; is available in ES6 (use &#039;esversion: 6&#039;) or Mozilla JS extensions (use moz)</span> <div class="clearfix text-formatted field field--name-field-snippet-descripcion field--type-text-long field--label-above"> <div class="field__label">Descripción</div> <div class="field__item"><p>Al utilizar javascript en tus proyectos de Drupal, es posible que te muestre, dentro de tu código, un mensaje de alerta con este contenido: </p> <pre> `let' is available in ES6 (use 'esversion: 6') or Mozilla JS extensions (use moz)</pre> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Vie, 20/10/2023 - 20:46</span> <div class="clearfix text-formatted field field--name-field-instrucciones field--type-text-long field--label-above"> <div class="field__label">Instrucciones</div> <div class="field__item"><p>Para corregir el fallo, sigue los siguienes pasos:</p> <ol><li>Realiza una búsqueda, dentro del código de tu proyecto, para confirmar si existe un archivo llamado <strong>.jshintrc</strong><br /> En mi caso, el archivo está dentro de la libería <strong>jquery.select2</strong>, que estaba utilizando en mi proyecto.<br /><br /><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 52.63%;" data-ratio="52.63" data-b-token="b-fdb61459788" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img class="img-fluid media__element b-lazy b-filter" data-entity-uuid="6e942b55-2e96-4a35-a95e-dffe8efa169e" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" decoding="async" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/jslint.png?itok=UaFRvNB1" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="990" height="521" typeof="foaf:Image" /></div></div> </li> <li>Abre el archivo llamado ..jshintrc y añade en la primera línea el siguiente código:<br />   <pre> "esversion": 6, </pre> <br /><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 26.87%;" data-ratio="26.87" data-b-token="b-8ebc5629487" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img class="img-fluid media__element b-lazy b-filter" data-entity-uuid="0f066afe-7f34-4a12-9d9b-1258e3933904" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" decoding="async" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/jshint2.png?itok=kLyZWv7t" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="990" height="266" typeof="foaf:Image" /></div></div> </li> <li>Una vez guardado el cambio, si vuelve a tu archivo .js, verás que el error habrá desaparecido. <br /><br /><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 60%;" data-ratio="60" data-b-token="b-7da97a3516f" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img class="img-fluid media__element b-lazy b-filter" data-entity-uuid="c06cae09-53f0-4511-8688-642f51b07568" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" decoding="async" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/jshint3.png?itok=RjSDSxIu" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="990" height="594" typeof="foaf:Image" /></div></div> </li> </ol><p>     Si quieres un poco más de información, <a _blank="" href="https://www.todojs.com/ref/jshint/ target=">HAZ CLIC AQUÍ</a></p> </div> </div> <div class="clearfix text-formatted field field--name-field-notas field--type-text-long field--label-above"> <div class="field__label">Notas</div> <div class="field__item"><p>Si no tienes ningún archivo con este nombre, sigue los siguientes pasos:</p> <ol><li>Crea un archivo llamado <strong>.jshintrc </strong>y colócalo dentro del directorio de tu subtheme, con el resto de tus javascript.<br />  </li> <li>Añade el siguiente código y añádelo dentro del directorio libraries, con el siguiente contenido: <pre> <code>"jshint.options": { "esversion": 6, }</code></pre> </li> </ol></div> </div> <div class="field field--name-field-snippet-paginador field--type-image field--label-above"> <div class="field__label">Paginador</div> <div class="field__item"> <img src="/sites/default/files/default_images/snippet-pager.png" width="100" height="100" alt="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultores especializados en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid" /> </div> </div> <div class="field field--name-field-categoria-snippet field--type-entity-reference field--label-above"> <div class="field__label">Categoría</div> <div class="field__items"> <div class="field__item"><a href="/categoria/javascript" hreflang="es">javascript</a></div> <div class="field__item"><a href="/categoria/nuxt-javascript" hreflang="es">nuxt javascript</a></div> <div class="field__item"><a href="/categoria/nextjs" hreflang="es">next.js</a></div> <div class="field__item"><a href="/categoria/behaviors" hreflang="es">behaviors</a></div> </div> </div> <div class="field field--name-field-portada-snippet field--type-entity-reference field--label-above"> <div class="field__label">Portada</div> <div class="field__item"><article class="media media--type-imagen media--view-mode-default"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"> <img src="/sites/default/files/styles/max_325x325/public/imagenes/portada-snippet-grande.png?itok=JZyTAbRq" width="325" height="176" alt="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" title="Snippet | www.drupaladicto.com - Consultor especializado en Drupal y Symfony" loading="lazy" typeof="foaf:Image" class="img-fluid image-style-max-325x325" /> </div> </div> </article> </div> </div> Fri, 20 Oct 2023 18:46:13 +0000 webmaster 474 at https://drupaladicto.com Nuxtjs | Instalación con Lando https://drupaladicto.com/curso/nuxtjs/nuxtjs-instalacion-con-lando <span class="field field--name-title field--type-string field--label-hidden">Nuxtjs | Instalación con Lando</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-953 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-953 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-953 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-953"> <section id="video-only-953" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-674-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-674-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-674-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/S7n-U-sSnr4&amp;max_width=0&amp;max_height=0&amp;hash=JXxbkXOa6gf-5iugxOVyrJQ2F28svFL3RU2vZbNrf9g" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-674-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1196" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/S7n-U-sSnr4" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>     Vue.js tiene varias distribuciones, al igual que Drupal, en las que se incluyen aquellas funcionalidades específicas, o más utilizadas, para facilitar la configuración de cualquier proyecto. Una de estas distribuciones es Nuxt.js, por esta razón, en lugar de realizar nuestro proyecto Drupal Headless con Vue.js, lo haremos con Nuxt.js, de esta manera ahorraremos tiempo de desarrollo y podremos concentrar nuestra atención en el proceso de conexión entre Drupal y Nuxt.js.</p> <p>     Al igual que hicimos con Contenta CMS, utilizaremos Lando para nuestra aplicación con Nuxt.js, pero en esta ocasión, crearemos nuestro propio archivo de configuración .lando.yml, para tener mayor control sobre el resultado final.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 8.62%;" data-ratio="8.62" data-b-token="b-7614057b0c6" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630363079f3c5.png?itok=OOQa1qUc" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="56" typeof="foaf:Image" /></div></div> <p>    Así que nos colocaremos en el lugar donde alojaremos nuestra aplicación, y a continuación crearemos la carpeta. Una vez creada, añadiremos el archivo .lando.yml y copiaremos dentro de éste el siguiente código:</p> <pre> name: nuxtapp proxy: appserver: - nuxtapp.lndo.site services: appserver: type: node:14 command: "yarn dev --hostname 0.0.0.0 --port 80" install_dependencies_as_me: - yarn install tooling: yarn: service: appserver npm: service: appserver node: service: appserver nuxt: cmd: /app/node_modules/.bin/nuxt service: appserver </pre> <p>     Una vez guardados los cambios, podremos arrancar Lando y, de esta manera, tendremos acceso a los contenedores de Node, para ejecutar yarn, node y nuxt. Así que, al igual que ejecutamos Composer para descargar las dependencias de Drupal, en este caso utilizaremos el comando yarn, para crear nuestra aplicación y descargar todas sus dependencias:</p> <pre> lando start</pre> <p>Antes de pasar a la siguiente instalación, ejecutaremos el comando de lando que nos permite confirmar que todo funcione correctamente, una vez termine su ejecución, podremos continuar con la descarga de nuestra app nuxtj:</p> <pre> lando rebuild</pre> <pre> lando yarn create nuxt-app vaciame</pre> <p> </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 23.08%;" data-ratio="23.08" data-b-token="b-2c45fefe0f7" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303632d88403.png?itok=jcXT3BJT" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="150" typeof="foaf:Image" /></div></div> <p>     La idea es contestar a todas las preguntas de configuración y, cuando hayamos terminado la descarga, mover todos los archivos descargados, a la carpeta raíz y continuar desde allí, borrando la carpeta <strong>vaciame</strong>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 55.23%;" data-ratio="55.23" data-b-token="b-92273b54561" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630363688300f.png?itok=elRcGtfm" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="359" typeof="foaf:Image" /></div></div> <p>     Cuando se hayan descargado todos los archivos para nuestra aplicación Nuxt.js, dentro de nuestra carpeta vaciame, moveremos todo su contenido a la carpeta principal y la borraremos, a continuación ejecutaremos el comando de lando para restaurar nuestra aplicación.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 59.18%;" data-ratio="59.18" data-b-token="b-d8c193d2106" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303637990ed1.png?itok=btQglOkP" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="610" height="361" typeof="foaf:Image" /></div></div> <p>     Antes de realizar el movimiento de archivos, podrás comprobar que en ambas carpetas, <strong>principa</strong>l y <strong>vaciame</strong> exite una carmeta node_modules, por lo que deberás eliminar primero, la de tu carpeta principal y a continuación, sacar los archivos de <strong>vaciame</strong> y borrarla.</p> <pre> lando stop</pre> <pre> mv vaciame/* .</pre> <pre> mv vaciame/.* .</pre> <pre> rm -rf vaciame</pre> <p> </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 33.69%;" data-ratio="33.69" data-b-token="b-86885d56c4a" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303639917be6.png?itok=hvImE_6D" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="219" typeof="foaf:Image" /></div></div> <p>     Ahora sí, podremos ejecutar el comando de restauración de lando acceder a nuestra aplicación de Nuxt.js.</p> <pre> lando restart </pre> <p> </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 49.24%;" data-ratio="49.24" data-b-token="b-cc989608b52" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630363b9197ae.jpg?itok=Bfs5azoV" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="461" height="227" typeof="foaf:Image" /></div></div> <p>     Felicidades!!!, ya ahora ya sabes cómo crear una aplicación con Nuxt.js y Lando en tu entorno local. En el siguiente artículo realizaremos las modificaciones necesarias para conectar, nuestro Backend de Drupal Contenta CMS con nuestra aplicación en Nuxt.js.</p> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:46</span> Thu, 16 Mar 2023 10:46:59 +0000 webmaster 380 at https://drupaladicto.com Nuxtjs | Páginas, navegación y enlaces https://drupaladicto.com/curso/nuxtjs/nuxtjs-paginas-navegacion-y-enlaces <span class="field field--name-title field--type-string field--label-hidden">Nuxtjs | Páginas, navegación y enlaces</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-954 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-954 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-954 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-954"> <section id="video-only-954" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-675-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-675-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-675-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/f-eofgfGbF8&amp;max_width=0&amp;max_height=0&amp;hash=JAHGYErSDTcv1rc_85alfJ1XHaJqXdkAr9xseeRAJxY" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-675-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1195" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/f-eofgfGbF8" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>    Ahora que ya hemos avanzado en el montaje y la presentación de algunos datos dinámicos en Nuxt, todavía no nos hemos movido de la página index, que nos viene por defecto en cualquier instalación. </p> <p>     Por esta razón, hoy explicaremos cómo añadir una barra de navegación y el footer en nuestro proyecto, además de la posiblidad de ampliarlo, con la creacíon de páginas que facilitarán a nuestros usuarios, poder moverse por toda nuestra aplicación y acceder, de esta manera, a la información que les interese cuando nos visiten.</p> <h3>     Cómo añadir la barra de navegación y el footer para todo el proyecto Nuxtjs</h3> <p>          Ya mencionamos en el anterior capítulo, que gracias a que seleccionamos Bootstrap vue, como framework para la parte frontal de nuestro proyecto Nuxt, podremos utilizar sus clases para obtener diseños responsivos mucho más adaptados a dispositivos móviles, también se nos ha añadido el Bootstrap original, padre de Bootstrap vue, y esto podemos comprobarlo en el archivo package.json de nuestra instalación.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 71.91%;" data-ratio="71.91" data-b-token="b-cdcd68447cc" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630365cc66aed.png?itok=rqGqLltu" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="413" height="297" typeof="foaf:Image" /></div></div> <p>        En este caso añadiremos, tanto la barra de navegación como el footer para todo el proyecto, utilizando los componentes de Bootstrap. Por lo tanto, lo primero que haremos será crear el nuevo componente al que llamaremos Navegacion.vue y dentor pegaremos el siguiente código:</p> <pre> &lt;template&gt; &lt;div&gt; &lt;nav class="navbar navbar-expand-lg navbar-dark bg-dark"&gt; &lt;NuxtLink class="navbar-brand" to="#"&gt;Mi Web&lt;/NuxtLink&gt; &lt;button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"&gt; &lt;span class="navbar-toggler-icon"&gt;&lt;/span&gt; &lt;/button&gt; &lt;div class="collapse navbar-collapse ml-auto" id="navbarNav"&gt; &lt;ul class="navbar-nav ml-auto"&gt; &lt;li class="nav-item active"&gt; &lt;NuxtLink class="nav-link" to="/"&gt;Home &lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/NuxtLink&gt; &lt;/li&gt; &lt;li class="nav-item"&gt; &lt;NuxtLink class="nav-link" to="/productos" &gt;Productos&lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/NuxtLink&gt; &lt;/li&gt; &lt;li class="nav-item"&gt; &lt;NuxtLink class="nav-link" to="/mis-productos"&gt;Mis productos&lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/NuxtLink&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/nav&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; export default { name: "Nav.vue" } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt; </pre> <h3>     Explicación:</h3> <p>        Lo único verdaderamente novedoso en este componente, con respecto a los anteriores, es que hemos añadido los enlaces de la barra de navegación, para acceder a las páginas que todavía no hemos creado. Como podrás observar, en lugar de las etiquetas tradicionales <strong>&lt;a href="#"&gt;Texto&lt;/a&gt;</strong>, que solemos ver en páginas credas empleando html,<strong> </strong>Nuxtjs utiliza sus propias etiquetas para la generación de sus rutas y enlaces.</p> <p>        En lugar de utilzar <strong>href="#"</strong>, emplea <strong>to="#"</strong>, para indicar la ruta de acceso a la página o contenido que llevará el enlace, en el siguiente ejemplo, verás la clase para los enlaces de Bootstrrap "nav-link", dentro de la etiqueta de NuxtLink, además de la especificación a la url que apuntará dicho enlace.</p> <pre> &lt;NuxtLink class="nav-link" to="/mis-productos"&gt;&lt;/NuxtLink&gt;</pre> <h2>     Cómo crear páginas en Nuxtjs</h2> <p>        Si exploramos los archivos generados con nuestra instalación por defecto de Nuxtjs, podremos confirmar que exite la carpeta <strong>pages</strong>, que es donde se ubica nuestra página principal <strong>index.vue</strong></p> <p>        Para facilitarno la creación de Páginas y rutas, Nuxtjs nos ofrece un método bastante simple y práctico, que consiste en crear el archivo con el nombre que deseamos para nuestra página y lo guardemos dentro de esta carpeta. </p> <p>        Esto es todo lo que vamos a necesitar y Nuxtjs se encargará automáticamente de generar una ruta de acceso correspondiente al nombre que hayamos seleccionado para nuestro archivo.</p> <p>        Hagamos una prueba, tomando como referencia las páginas a las que apuntará nuestro componente Navegacion.vue, vamos a crear dos archivos, correspondientes a cada una de estas páginas, obviamente, la página index.vue ya la tenemos creada y se podrá acceder desde el primer enlace, donde está colocada la barra inclinada o slash to="/", así que nos toca crear la página <strong>productos</strong> y <strong>mis-productos.</strong></p> <p><strong>        Para la página productos, nos colocaremos en la carpeta pages y añadiremos un nuevo componente básico, con el nombre productos.vue, luego </strong>pegaremos dentro el siguiente código:</p> <pre> &lt;template&gt; &lt;div class="container text-center p-5 mt2"&gt; &lt;h1&gt;Esta es la página de productos&lt;/h1&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; export default { name: "productos" } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt; </pre> <p>     Una vez hayamos guardado el nuevo archivo, podremos acceder en el navegador escribiendo, a continuación de nuestra url <strong>/productos</strong>, y deberíamos ver un resultado como la siguiente imagen:</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 71.91%;" data-ratio="71.91" data-b-token="b-cedd919b948" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630365f88af5c.png?itok=WeFsI9Ay" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="413" height="297" typeof="foaf:Image" /></div></div> <p>     Ahora que ya sabes cómo crear una página básica, te animo a que pongas a prueba tus conocimientos, creando la página que falta en esta primera fase, cuya url será <strong>/mis-productos</strong>, deberías obtener un resultado como el siguiente:</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 185.19%;" data-ratio="185.19" data-b-token="b-4314aecc307" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63036618bf088.png?itok=b-u8OA5J" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="351" height="650" typeof="foaf:Image" /></div></div> <h2>     Cómo añadir componentes globales dentro del proyecto Nuxtjs</h2> <p>        Ahora que ya hemos creado el componente con la barra de navegación, sólo nos queda llamarlo desde el lugar adecuado, para que se muestre correctamente y podamos navegar dentro del proyecto.</p> <p>        Para que nuestra barra de navegación, en este caso, esté visible desde cualquiera nuestras páginas, sólo tendremos que añadir la etiqueta correspondiente dentro del arhivo que está dentro de la carpeta <strong>.nuxt/layouts/</strong> llamado <strong>default.vue</strong>.</p> <h3>       Añadiendo la barra de navegación</h3> <p>        Ya que pondremos nuestra barra de navegación en la parte superior de todas las páginas, añadiremos la etiqueta <strong>&lt;Navegacion /&gt;</strong>, justo encima de la etiqueta llamada <strong>&lt;Nuxt /&gt;</strong>, que es la encargada de imprimir todos los elementos de nuestro proyecto.</p> <p>        Para realizar este cambio, es posible que tengamos que modificar los permisos para escribir. Una vez modificados los permisos, podremos pegar el código, sustituyendo por los nombres de los componentes que hayas decidido utilizar:</p> <pre> &lt;template&gt; &lt;div&gt; &lt;Navegacion /&gt; &lt;Nuxt /&gt; &lt;/div&gt; &lt;/template&gt;</pre> <p>     Si volvemos a nuestro proyecto en el navegador, ahora veremos que la barra de navegación estará presente en todas las páginas para poder acceder a ellas.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 118.35%;" data-ratio="118.35" data-b-token="b-1a08b88a248" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303663ad1e2d.png?itok=CPnoBETw" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="516" typeof="foaf:Image" /></div></div> <h3>    Añadiendo el Footer</h3> <p>         En el caso del Footer, repetiremos los pasos que hemos hecho para la cabecera, es decir, primero crearemos el componente al que llamaremos Footer.vue, a continuación, pegaremos el siguiente código:</p> <pre> &lt;template&gt; &lt;div class="footer"&gt; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"&gt; &lt;link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous"&gt; &lt;link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"&gt; &lt;body&gt; &lt;div id="container"&gt; &lt;div id="part1"&gt; &lt;div id="companyinfo"&gt; &lt;a id="sitelink" href="#"&gt;Drupaladicto.com&lt;/a&gt; &lt;p id="title"&gt;Cool and Perfect Snippet code&lt;/p&gt; &lt;p id="detail"&gt;We create awesome code snippets that will help you in creating your own beautiful site. &lt;/p&gt; &lt;/div&gt; &lt;div id="explore"&gt; &lt;p id="txt1"&gt;Explore&lt;/p&gt; &lt;a class="link" href="#"&gt;Home&lt;/a&gt; &lt;a class="link" href="#"&gt;About&lt;/a&gt; &lt;a class="link" href="#"&gt;Snippet&lt;/a&gt; &lt;a class="link" href="#"&gt;Careers&lt;/a&gt; &lt;/div&gt; &lt;div id="visit"&gt; &lt;p id="txt2"&gt;Visita&lt;/p&gt; &lt;p class="text"&gt;Drupaladicto &lt;/p&gt; &lt;p class="text"&gt;78 Bhulabhai Desai Road &lt;/p&gt; &lt;p class="text"&gt;Mumbai 400 026 &lt;/p&gt; &lt;p class="text"&gt;Phone: (22) 2363-3611 &lt;/p&gt; &lt;p class="text"&gt;Fax: (22) 2363-0350 &lt;/p&gt; &lt;/div&gt; &lt;div id="legal"&gt; &lt;p id="txt3"&gt;Legal&lt;/p&gt; &lt;a class="link1" href="#"&gt;Terms and Conditions&lt;/a&gt; &lt;a class="link1" href="#"&gt;Private Policy&lt;/a&gt; &lt;/div&gt; &lt;div id="subscribe"&gt; &lt;p id="txt4"&gt;Subscribe to US&lt;/p&gt; &lt;form&gt; &lt;input id="email" type="email" placeholder="Email"&gt; &lt;/form&gt; &lt;a class="waves-effect waves-light btn"&gt;Subscribe&lt;/a&gt; &lt;p id="txt5"&gt;Connect With US&lt;/p&gt; &lt;i class="fab fa-facebook-square social fa-2x"&gt;&lt;/i&gt; &lt;i class="fab fa-linkedin social fa-2x"&gt;&lt;/i&gt; &lt;i class="fab fa-twitter-square social fa-2x"&gt;&lt;/i&gt; &lt;/div&gt; &lt;/div&gt; &lt;div id="part2"&gt; &lt;p id="txt6"&gt;&lt;i class="material-icons tiny"&gt; copyright&lt;/i&gt;copyright 2019 BBbootstrap - All right reserved&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;/body&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; export default { name: "Footer" } &lt;/script&gt; &lt;style scoped&gt; #container { width: 100%; height: 330px } #part1 { width: 100%; height: 280px; background-color: #292929 } #part2 { width: 100%; height: 50px; background-color: black; position: relative; top: -15px } #companyinfo { width: 14%; height: 280px; position: relative; left: 8%; top: 30px } #sitelink { font-size: 35px; color: #f44336 } #sitelink:hover { color: #e65100 } #title { color: gray; position: relative; top: 0px; font-size: 14.1px } #detail { color: #aaa7a7; font-size: 16px } #explore { width: 14%; height: 280px; position: relative; top: -235px; left: 29% } #txt1, #txt2, #txt3, #txt4, #txt5 { color: white; font-size: 20px } .link { display: flex; width: 90px; height: 40px; color: #aaa7a7; background-color: transparent; border-top: 2px solid white; position: relative; top: -10px } .link:hover, .link1:hover { color: #e65100 } #visit { width: 14%; height: 280px; position: relative; top: -515px; left: 42% } .text { color: #aaa7a7; font-size: 14px; margin-top: -10px } #legal { width: 14%; height: 280px; position: relative; top: -800px; left: 59.5% } .link1 { display: flex; width: 150px; height: 40px; color: #aaa7a7; background-color: transparent; border-top: 2px solid white; position: relative; top: -10px; margin-top: 7px } #subscribe { position: relative; top: -1080px; left: 78%; width: 14%; height: 280px } #email { color: white; position: relative; top: -20px } .btn { position: relative; top: -10px } #txt5 { position: relative; top: 0px } .social { position: relative; top: -5px; margin-right: 10px; color: white; cursor: pointer } .fa-facebook-square:hover { color: #3B579D } .fa-linkedin:hover { color: #007BB6 } .fa-twitter-square:hover { color: #2CAAE1 } #txt6 { color: white; position: relative; top: 13px; left: 8%; width: 80%; color: #aaa7a7 } .material-icons { position: relative; top: 3px } @media only screen and (max-width:1000px) { #companyinfo { width: 20% } #sitelink { font-size: 30px } #txt5, #txt4 { font-size: 17px } #txt5, .social { position: relative; top: -5px } } @media only screen and (max-width:850px) { #companyinfo { position: relative; left: 3% } #txt6 { position: relative; left: 3% } #txt1, #txt2, #txt3, #txt4, #txt5 { font-size: 15px } #explore { position: relative; top: -240px; left: 26% } #sitelink { font-size: 25px } #detail { font-size: 13px } .link { width: 60px } #visit { position: relative; top: -520px; left: 37% } .text { font-size: 13px } #legal { position: relative; top: -800px; left: 54% } #subscribe { position: relative; top: -1080px; left: 76%; width: 20% } #txt5, .social { position: relative; left: -110%; top: px } #email, .btn { position: relative; top: 0px } #part1 { height: 250px } } &lt;/style&gt; </pre> <p>     Una vez guardado el contenido en el componente &lt;Footer /&gt;, podremos abrir el archivo default.vue, que hemos modificado hace un momento y simplemente, añadiremos la llamada al nuevo componente footer. </p> <p>     A continuación te presento una imagen con todos los pasos y el resultado que deberías obtener una vez termiandos los cambios.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 195.78%;" data-ratio="195.78" data-b-token="b-084d150d7fb" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Drupal 9 headless Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63036664bafd4.png?itok=cSHMSM2l" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="332" height="650" typeof="foaf:Image" /></div></div> <p>     En el próxiimo capítulo hablaremos sobre la creación de páginas dinámicas, ya que la idea es que podamos navegar, dentro de la página detalle de cada producto, al hacer clic sobre su imagen.</p> <p>     Para esta segunda parte, tendremos que modificar la página <strong>productos.vue</strong>, por eso prefiero explicarlo más adelante, para que puedas asimilar lo que hemos explicado en este artículo y realizar los cambios que consideres necesarios en los componentes añadidos.</p> <p>Fuente: <a href="https://nuxtjs.org/docs/2.x/directory-structure/layouts" target="_blank">https://nuxtjs.org/docs/2.x/directory-structure/layouts</a></p> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:35</span> Thu, 16 Mar 2023 10:35:24 +0000 webmaster 379 at https://drupaladicto.com Nuxt.js | Consumo y presentación de datos ( Parte 2) https://drupaladicto.com/curso/nuxtjs/nuxtjs-consumo-y-presentacion-de-datos-parte-2 <span class="field field--name-title field--type-string field--label-hidden">Nuxt.js | Consumo y presentación de datos ( Parte 2)</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-950 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-950 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-950 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-950"> <section id="video-only-950" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-671-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-671-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-671-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/b7cLLp59dhw&amp;max_width=0&amp;max_height=0&amp;hash=XrfjWNOo0dnauDfCC0QHMKnpFdAFYdRsq9vVBT843Mg" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-671-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1194" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/b7cLLp59dhw" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>    Es inevitable sentirnos satisfechos de lo mucho que hemos aprendido en tan poco tiempo, ya hemos logrado instalar y configurar los primeros pasos de un proyecto utilizando en framework Nuxtjs, paralelamente, vamos aplicando estilos de Bootstrap, para lograr una web responsiva, y lo más importante, que podremos reutilizar en cualquier otro desarrollo en un futuro próximo.</p> <p>     Hoy vamos a continuar con la importación de datos, desde un archivo local, en este caso, para que podamos entender todo el proceso, antes de pasar a las siguientes etapas, cuyo objetivo final, será el uso de API, para conectarnos con alguna web externa y obtengamos los mismos resultados.  </p> <p>     Antes de continuar, sería muy recomendable que, basándote en los ejemplos explicados, intentaras obtener las imágenes e informaciones de los productos, y mostralas dentro de los componentes correspondientes, que será nuestro propósito fundamental, en este ejercicio. De esta forma, podrás confirmar tus conocimientos y experiencia acumulada y reforzarás aquellos puntos débiles que descubras durante el proceso.</p> <h2>   Consumo y presentación de datos dinámicos (Parte 2)</h2> <h3>     Paso 1 - Imágenes de productos  </h3> <p>     Lo primero que tendríamos que hacer, es descargarnos o buscar las imágenes que se mostrarán una vez creado el componente de los productos, al igual que hicimos al principio del curso, las guardaremos dentro de la carpeta assets, yo he creado una carpeta "/imagenes/productos"  y, partiendo de los nombres que ya tenemos en nuestro archivo, nombraremos las imágenes, para que puedan mostrarse dinámicamente una vez pasemos los datos al componente.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 73.04%;" data-ratio="73.04" data-b-token="b-616a6836abe" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035fcf20c1c.png?itok=YNv_veuL" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="471" height="344" typeof="foaf:Image" /></div></div> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 81.8%;" data-ratio="81.8" data-b-token="b-752ce8436bc" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035ffa0b65a.png?itok=zWLB32g4" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="610" height="499" typeof="foaf:Image" /></div></div> <p>     <strong>Paso 2 - Creación de componente fichaProducto</strong></p> <p>        Ahora que ya hemos añadido las imágenes que vamos a mostrar en cada una de las fichas de los productos, el próximo paso será crear un nuevo componente, con el que podremos importar y mostrar el segundo objeto de nuestro arreglo, donde están guardadas las informaciones de todos los productos detacados, según cada bloque.</p> <p>        En este caso, primero crearemos el componente al que llamaremos <strong>fichaProducto.vue</strong>, crearemos la estructura con el código fijo, para comprobar si todo se muestra correctamente y a continuación, sustituremos los valores por los equivalentes.</p> <p>        Nos colocaremos en la carpeta compenents y añadiremos el nuevo componente <strong>fichaProducto.vue</strong>, y dentro copiaremos el siguiente código:</p> <pre> &lt;template&gt; &lt;b-card title="Title" img-src="@/assets/imagenes/productos/1.jpg" img-alt="Image" img-top&gt; &lt;b-card-text&gt; This card has supporting text below as a natural lead-in to additional content. &lt;/b-card-text&gt; &lt;template #footer&gt; &lt;small class="text-muted"&gt;Last updated 3 mins ago&lt;/small&gt; &lt;/template&gt; &lt;/b-card&gt; &lt;/template&gt; &lt;script&gt; export default { name: "fichaProducto" } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt;</pre> <p>     <strong>Explicación</strong></p> <p>        En este código, estamos crando el modelo de la tarjeta que mostraremos con los productos, utilizando <a href="https://bootstrap-vue.org/docs/components/card">clases cards de Bootstrap Vue</a>, por lo que tendremos realizar cambios en el contenedor, para completar, tanto la llamada al nuevo componente, como la estructura que envolverá las tarjetas con las informaciones de los productos, sustituyendo el apartado que teníamos definido en el anterior capítulo. El código en el contenedor <strong>losMasVendidos</strong>, quedará de la siguiente manera:</p> <pre> &lt;template&gt; &lt;section class="p-5 bg-white"&gt; &lt;div class="container-lg"&gt; &lt;h2&gt;{{ SeccionProductos.titulo }}&lt;/h2&gt; &lt;p&gt;{{ SeccionProductos.resumen }}&lt;/p&gt; &lt;div class="row g-4 text-center"&gt; &lt;b-card-group&gt; &lt;fichaProducto/&gt; &lt;/b-card-group&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;/template&gt; &lt;script&gt; export default { name: "losMasVendidos", props: ['SeccionProductos'] } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt;</pre> <p>     Y el resultado obtenido, debería ser parecido a la siguiente imagen, donde estamos mostrando SÓLO EL MODELO, de la tarjeta con informaciones fijas de un producto, tomando una de las imágenes que previamente hemos guardado dentro de la carpeta "assets/imagenes/productos":</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 198.78%;" data-ratio="198.78" data-b-token="b-b86181f7c6a" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630360252ec5f.png?itok=ZQoww_DN" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="327" height="650" typeof="foaf:Image" /></div></div> <p>    <strong> Paso 3 - Actualización código, importación datos dinámicos en fichaProducto</strong></p> <p>     En el siguiente paso, vamos a sustituir en el componente fichaProducto.vue, los valores por las variables equivalentes para obtener los datos desde el archivo productos.js, queando de la siguiente forma:</p> <pre> &lt;template&gt; &lt;b-card title="Title" :img-src="require(`@/assets/imagenes/productos/${ producto.imagen || '1.jpg' }`)" img-alt="Image" img-top&gt; &lt;b-card-text&gt; {{ producto.titulo }} &lt;/b-card-text&gt; &lt;template #footer&gt; &lt;small class="text-muted"&gt;{{ producto.intro }}&lt;/small&gt; &lt;/template&gt; &lt;/b-card&gt; &lt;/template&gt; &lt;script&gt; export default { name: "fichaProducto", props: ['producto'] } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt;</pre> <p>     <strong>Explicación</strong></p> <p>        Esta vez hemos sustituido los valores que habíamos escrito por las variables equivalentes en cada uno de los apartados:</p> <p>      <strong> :img-src="require(`@/assets/imagenes/productos/${ producto.imagen || '1.jpg' }`)"</strong></p> <p><strong>       </strong>  al añadir los dos puntos, al igual que en casos anteriores, estamos indicando el paso de parámetros dinámicamente, y dentro hemos puesto el require con la dirección a la carpeta de imágenes concatenándola con la propiedad "producto", que estamos recibiendo en  " props: ['producto'] " y así accedemos a las imágenes de cada elemento. A continuación está la condición en caso de que el producto no tenga imagenes, para que muestre la imagen por defecto.</p> <p>    <strong> {{ producto.titulo }}</strong> y <strong>{{ producto.intro }}</strong></p> <p>       Con estas llamadas, mostrarmos la información correspondiente, tal y como las tenemos en nuestro array de elementos dentro del archivo producto.js.</p> <p>     Paso 4 - Actualización de código e importación de datos componente</p> <p> </p> <p>     Por último, pasaremos los datos dentro del componente &lt;fichaProducto /&gt; que hemos llamado en el ListadoProductos, quedamos el componente con la siguiente estructura:</p> <pre> &lt;template&gt; &lt;section class="p-5 bg-white"&gt; &lt;div class="container-lg"&gt; &lt;h2&gt;{{ SeccionProductos.titulo }}&lt;/h2&gt; &lt;p&gt;{{ SeccionProductos.resumen }}&lt;/p&gt; &lt;div class="row g-4 text-center"&gt; &lt;b-card-group&gt; &lt;fichaProducto v-for="producto in SeccionProductos.fichas_productos" :key="producto.id" :producto="producto" /&gt; &lt;/b-card-group&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;/template&gt; &lt;script&gt; export default { name: "losMasVendidos", props: ['SeccionProductos'] } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt;</pre> <p>     Si visitamos nuevamente nuestra página, ahora tendríamos que ver el listado de productos destacados con sus respectivas imágenes, parecido al siguiente:</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 106.73%;" data-ratio="106.73" data-b-token="b-7ceb6968a4b" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303604cbb946.png?itok=htwIQ2-2" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="505" height="539" typeof="foaf:Image" /></div></div> <p>Repositorio: <a href="https://github.com/drupaladicto/nuxtjs">https://github.com/drupaladicto/nuxtjs</a></p> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:32</span> Thu, 16 Mar 2023 10:32:57 +0000 webmaster 378 at https://drupaladicto.com Nuxt.js | Consumo y presentación de datos (Parte 1) https://drupaladicto.com/curso/nuxtjs/nuxtjs-consumo-y-presentacion-de-datos-parte-1 <span class="field field--name-title field--type-string field--label-hidden">Nuxt.js | Consumo y presentación de datos (Parte 1)</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-951 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-951 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-951 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-951"> <section id="video-only-951" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-672-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-672-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-672-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/J1bKU1W9WfU&amp;max_width=0&amp;max_height=0&amp;hash=nub82mVeiktvNzHZDNG0NEFVU_Oj34ueueHzWsH2J6g" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-672-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1193" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/J1bKU1W9WfU" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>     Seguimos avanzando en nuestro curso intensivo de Nuxtjs y, ahora que hemos aprendido, <a href="https://www.drupaladicto.es/curso/prerrequisitos-e-instalacion-de-nuxtjs">cómo descargar e instalar Nuxtjs</a> y <a href="https://www.drupaladicto.es/curso/componentes">cómo crear y trabajar con componentes</a>, es el momento perfecto para comenzar a practicar el uso de datos, para mostrarlos dinámicamente dentro de un componente, aportando mayor flexibilidad y versatilidad a nuestro proyecto.</p> <h2>   Componentes dinámicos y consumo de datos</h2> <p>        Cómo dijimos en los primeros capítulos, la mayor ventaja que nos ofrecen los componentes, es la posibilidad de reutilizarlos, dentro de cualquier lugar del proyecto, minimizando así el tiempo necesario para realizar correcciones de código, aplicación de estilos o cualquier otra actividad relacionada con ellos.</p> <p>        En la siguiente imagen, podremos ver dos listados diferentes de productos, pero a la vez, muy parecidos entre ellos. En realidad, ambos comparten la misma estructura, un título, una pequeña descripción y a continuación varias imágenes de productos con sus respectivas informaciones. Por lo tanto, si aplicamos el uso de componentes, en seguida nos daremos cuenta que podremos obtener muy fácilmente el resultado esperado.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 87.04%;" data-ratio="87.04" data-b-token="b-1e116081b74" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035b684ac94.png?itok=sglm1JHH" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="625" height="544" typeof="foaf:Image" /></div></div> <h2>    Primer paso Creación y testeo del componente padre    </h2> <p>        Hagamos la prueba, dentro de la carpeta <strong>components</strong>, crearemos un nuevo archivo llamado <strong>losMasVendidos.vue</strong> y dentro pegaremos el siguiente código para realizar las primeras comprobaciones, se trata de la estructura principal, la que tendrá el título, el subtítulo y el espacio donde, al final, mostraremos los productos:</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 86.26%;" data-ratio="86.26" data-b-token="b-f12001f7d0e" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035bb66aa1c.png?itok=8mE0Rd5z" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="473" height="408" typeof="foaf:Image" /></div></div> <pre> &lt;template&gt; &lt;section class="p-5 bg-white"&gt; &lt;div class="container-lg"&gt; &lt;h2&gt;Los más vendidos&lt;/h2&gt; &lt;p&gt;Estas son las últimas tendencias de nuestros clientes&lt;/p&gt; &lt;div class="row g-4 text-center"&gt; &lt;div class="col-md-6 col-lg-3"&gt; Producto &lt;/div&gt; &lt;div class="col-md-6 col-lg-3"&gt; Producto &lt;/div&gt; &lt;div class="col-md-6 col-lg-3"&gt; Producto &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;/template&gt; &lt;script&gt; export default { name: "losMasVendidos" } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt; </pre> <p>     Una vez guardados los cambios en el componente <strong>losMasVendidos.vue</strong>, abriremos la página <strong>index.vue</strong> y añadiremos la etiqueta con el nombre del componente, para comprobar que se muestra según lo esperado.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 81.16%;" data-ratio="81.16" data-b-token="b-6a07c98800c" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035beb6af97.png?itok=DtHy76YW" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="329" height="267" typeof="foaf:Image" /></div></div> <p>     Si guardamos los cambios y volvemos a la página para comprobar los resultados, deberíamos ver algo parecido a la siguiente imagen, tanto en formato escritorio, como en móvil.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 111.01%;" data-ratio="111.01" data-b-token="b-e14c28d73c8" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035c0c9e7e5.png?itok=ZaJVhQlb" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="484" typeof="foaf:Image" /></div></div> <p>    Hasta aquí, ya tenemos la primera parte resuelta, que sería la manera en la que podremos mostrar un listado de productos, dentro de un bloque, con un diseño responsivo y funcional; pero para sacar provecho a la capacidad de reutilización de los componentes, nuestro código, tal como está, no nos permitiría usar el mismo componente para mostrar ambos bloques de productos, o sea, "<strong>Los más vendidos</strong>" y "<strong>Super Oferta</strong>". Por eso, en esta ocasión vamos a obtener los datos desde una fuente externa a los componentes.</p> <p>     Más adelante, veremos como hacerlo desde una fuente externa a la web, pero por ahora, para conocer la manera de mostrar datos dinámicamente, utilizaremos un archivo, en formato <strong>json</strong>, que guardaremos dentro de la carpeta <strong>assets</strong>.</p> <h2>     Cómo obtener datos dinámicamente y mostrarlos en un componente</h2> <p>         Llegados a este punto, crearemos un nuevo archivo con el nombre <strong>productos.js</strong> y pegaremos el siguiente código dentro de él.</p> <pre> export const productos = [ { id: 1, titulo: "Los más vendidos", resumen: "Estas son las últimas tendencias de nuestros clientes", fichas_productos: [ { id:5, titulo: "Producto", intro: "Lorem eleifend mus. Cupidatat alias purus quas debitis laoreet tempus conubia ornare dictumst quia porta cupiditate", imagen: "5.jpg" }, { id:8, titulo: "Producto", intro: "Lorem eleifend mus. Cupidatat alias purus quas debitis laoreet tempus conubia ornare dictumst quia porta cupiditate", imagen: "8.jpg" }, { id:11, titulo: "Producto", intro: "Lorem eleifend mus. Cupidatat alias purus quas debitis laoreet tempus conubia ornare dictumst quia porta cupiditate", imagen: "11.jpg" } ] }, { id: 2, titulo: "Super ofertas", resumen: "Compra tres productos y te llevaremos 6 a casa", fichas_productos: [ { id:1, titulo: "Producto", intro: "Lorem eleifend mus. Cupidatat alias purus quas debitis laoreet tempus conubia ornare dictumst quia porta cupiditate", imagen: "1.jpg" }, { id:2, titulo: "Producto", intro: "Lorem eleifend mus. Cupidatat alias purus quas debitis laoreet tempus conubia ornare dictumst quia porta cupiditate", imagen: "2.jpg" }, { id:3, titulo: "Producto", intro: "Lorem eleifend mus. Cupidatat alias purus quas debitis laoreet tempus conubia ornare dictumst quia porta cupiditate", imagen: "3.jpg" } ] } ] </pre> <h2>     Explicación del archivo productos.js</h2> <p>          El código que hemos copiado, comienza con la creación de la <strong>constante productos</strong>, la cuál será accesible desde cualquier componente gracias al <strong>export.</strong></p> <p><strong>export const productos = [</strong></p> <p>         Dentro de nuestra constante, tenemos dos objetos principales, que a su vez, tienen dentro un arreglo de tres objetos, equivalentes a la información de los productos con todos sus elementos.</p> <h2>     Obteniendo los datos desde el archivo productos.js</h2> <p>          Para acceder a los datos guardados en nuestro archivo productos.js y poder mostrarlos dentro de nuestro componente, tendremos que hacer varias operaciones, que explicaremos paso a paso:</p> <h3>     1.- Importar el archivo dentro de nuestro elemento principal</h3> <p>    En este caso, todos nuestros componentes se están mostrando dentro de la página <strong>index.vue</strong>, por lo tanto, si queremos acceder a la información para pasarla luego a los componentes, vamos a importarla dentro de ella usando el siguiente enunciado, dentro de las etiquetas &lt;script&gt;&lt;/script&gt;<br />  </p> <pre> import { productosDestacados } from "@/assets/productos.js"</pre> <p><br />   Con esta línea estamos indicando el nombre de la constante que hemos definido al principio del archivo productos.js y, a continuación, estamos indicando la ubicación del archivo a través del from (el @ está indicando la ubicación al documento root del proyecto)<br />  </p> <h3>     2.- Preparamos los datos para mostrarlos en los componentes.</h3> <p><br /> Si queremos incluir información para mostrarla dentro de una página o de un componente, lo haremos utilizando el apartado que nos viene por defecto en las etiquetas &lt;script&gt;&lt;/script&gt;<br /><br /> En este caso, hemos añadido un método llamado data, que devolverá un arreglo con clave valor, al que asignamos la constante que hemos importado en el primer paso. De esta forma, podremos acceder a toda la información y pasarla como argumento dentro de los componentes que aparecen dentro de la página index.vue:</p> <p> </p> <pre> export default { data(){ return { LosDestacados : productosDestacados } } } </pre> <h3>     3.- Pasando los valores dentro del componente:</h3> <p>   Por último, aprovechando el componente llamado &lt;losMasVendidos /&gt;, y por medio de un ciclo for, pasaremos los valores y podremos darle formato personalizado.</p> <p> </p> <pre> &lt;losMasVendidos v-for="destacados in LosDestacados" :key="destacados.id" :SeccionProductos="destacados" /&gt;</pre> <p>Con este código, estamos accediendo al primer nivel de los objetos dentro de la contante <strong>productosDestacados, </strong>especificando que la clave que identifica cada objeto será el<strong> id</strong>, y por último estamos añadiendo una propiedad llamada <strong>SeccionProductos, </strong>con la que podremos acceder dentro del propio componente<strong> losMasVendidos</strong>, para mostrar los valores que esperamos, en esta primera fase, el <strong>título</strong> y descripción de cada <strong>bloque de productos destacados.</strong><br /><br /> Si guardamos los cambios y volvemos a nuestra página inicio en el navegador, veremos que no ha cambiado nada, esto se debe a que todavía no hemos sustituido los valores que pusimos manualmente dentro del componente<strong> losMasVendidos.vue</strong></p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 111.37%;" data-ratio="111.37" data-b-token="b-c8425195ba2" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035c3e443fd.png?itok=eErY6EpS" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="422" height="470" typeof="foaf:Image" /></div></div> <h3>     4.- Recibiendo los datos dentro del componente</h3> <p>Para recibir los datos y poder imprimirlos dentro del componente, usaremos lo que en Vuex se conoce como <strong>props</strong>, para ello añadiremos el nombre de la o las propiedades que hayamos declarado y de esta manera ya tendremos acceso para mostrarlas como nos haga falta, al igual que hicimos dentro de la página index.vue, utilizaremos la sección definida entre las estiquetas &lt;script&gt;&lt;/script&gt;</p> <p> </p> <pre> &lt;script&gt; export default { name: "losMasVendidos", props: ['SeccionProductos'] } &lt;/script&gt;</pre> <h3>     5.- Imprimiendo los valores recibidos dentro del componente</h3> <p>En este último paso, una vez verificados los valores que hemos definido en nuestro archivo productos.js y que desamos mostrar dentro del componente, solo tendremos que añadirlos en el siguiente formato: {{ NombrePropiedad.valor_deseado }}, el componente completo debería quedar de la siguiente manera:</p> <p> </p> <pre> &lt;template&gt; &lt;section class="p-5 bg-white"&gt; &lt;div class="container-lg"&gt; &lt;h2&gt;{{ SeccionProductos.titulo }}&lt;/h2&gt; &lt;p&gt;{{ SeccionProductos.resumen }}&lt;/p&gt; &lt;div class="row g-4 text-center"&gt; &lt;div class="col-md-6 col-lg-3"&gt; Producto &lt;/div&gt; &lt;div class="col-md-6 col-lg-3"&gt; Producto &lt;/div&gt; &lt;div class="col-md-6 col-lg-3"&gt; Producto &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;/template&gt; &lt;script&gt; export default { name: "losMasVendidos", props: ['SeccionProductos'] } &lt;/script&gt; &lt;style scoped&gt; &lt;/style&gt; </pre> <p> </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 111.37%;" data-ratio="111.37" data-b-token="b-d87befea123" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Headless con Nuxt y Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035c8a37206.png?itok=VzFp_xIB" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="422" height="470" typeof="foaf:Image" /></div></div> <p>Repositorio: <a href="https://github.com/drupaladicto/nuxtjs">https://github.com/drupaladicto/nuxtjs</a></p> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:28</span> Thu, 16 Mar 2023 10:28:42 +0000 webmaster 377 at https://drupaladicto.com Nuxt.js | Componentes https://drupaladicto.com/curso/nuxtjs/nuxtjs-componentes <span class="field field--name-title field--type-string field--label-hidden">Nuxt.js | Componentes</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-949 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-949 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-949 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-949"> <section id="video-only-949" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-670-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-670-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-670-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/TD3DKJ6dDRg&amp;max_width=0&amp;max_height=0&amp;hash=v8PRIEZoVOiVZ9I-Q8eElQlCrsQN1bM4uOn3vKsxZUI" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-670-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1192" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/TD3DKJ6dDRg" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>     Continuando con el contenido de este <strong>Curso intensivo de Nuxtjs</strong>, ahora nos toca abordar el tema de los <strong>Componenentes</strong>. Al igual que otros Frameworks, la idea fundamental consiste en crear estructuras de código, cuyo principal objetivo es la posibilidad de reutilizarlo, tantas veces como sea posible, esto mejora considerablemente la manera de ampliar, mejorar o detectar errores relacionados con el proyecto.</p> <p>     Por ejemplo, si tenemos que crear una web, donde nuestra página principal constará de varias partes, como por ejemplo, la barra de navegación, un pequeño listado de productos y el Footer, que podrían repetirse en otras páginas, lo más lógico será convertir esas partes en componentes, que podamos volver a mostrar, según nuestras necesidades, añadiendo la línea de código correspondiente a la llamada.</p> <p>     En el siguiente gráfico, podremos ver un ejemplo más detallado sobre lo que representa la simplificación de una estructura, dividiéndola en diferentes componentes, que podremos reutilizar y aprovechar dentro de toda la web, a medida que vayamos avanzando en el desarrollo:</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 56.8%;" data-ratio="56.8" data-b-token="b-b46d918ceaf" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303561808b09.png?itok=6mPhvhvr" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="625" height="355" typeof="foaf:Image" /></div></div> <p>     Nuxtjs, por defecto, dentro de su estructura, viene con una carpeta para guardar los componentes, llamada <strong>COMPONENTS</strong>. Si abrimos nuestro proyecto utilizando el IDE de nuestra preferencia, podremos ver que dentro de esta carpeta ya existe un componente llamado<strong> Logo.vue</strong>, que corresponde al logo que se muestra en la página de bienvenida una vez arrancado <strong>Nuxtjs</strong>, usando el comando <strong>npm run dev</strong>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 159.71%;" data-ratio="159.71" data-b-token="b-d03de7861d6" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303565a82ee1.png?itok=zGkwTjt2" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="407" height="650" typeof="foaf:Image" /></div></div> <p>     Antes de abrir el archivo, observemos que se considera como buena práctica, nombrar a los <strong>componentes</strong> usando el <strong>CamelCase</strong>, mayúsculas iniciales y la extensión <strong>.vue</strong>, ya que, como dijimos en el primer artículo, <strong>Nuxtjs</strong> es un Framework basado en <strong>Vuex;</strong> esto significa que, al igual que como pasa con <strong>Drupal 8 y posteriores</strong>, basado en <strong>Symfony</strong>, podremos usar comandos de uno dentro del otro.</p> <p>     Si exploramos el componente <strong>Logo.vue</strong>, veremos que la estructura básica de cualquier componente será similar, la parte correspondiente a la plantilla o presentación de su contenidos, encerrada entre las etiquetas <strong>&lt;template&gt;&lt;/template&gt;</strong> y en la parte inferior, todo lo relacionado con los estilos entre las etiquetas <strong>&lt;style&gt;&lt;/style&gt;</strong>, más adelante veremos también la zona relacionada con la ejecución de métocos, props, etc, que estará entre las etiquetas <strong>&lt;script&gt;&lt;/script&gt;</strong>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 93.81%;" data-ratio="93.81" data-b-token="b-a0e410ceb60" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303567c214b6.png?itok=3LaT_jtP" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="409" typeof="foaf:Image" /></div></div> <h2>     Cómo mostrar componentes dentro de una página</h2> <p>          Si abrimos la carpeta llamada <strong>PAGES</strong>, donde al igual que sucede con los componentes, se guardarán todas las páginas de nuestro proyecto, veremos <strong>index.vue</strong>, que es la página principal de nuestra instalación de Nuxt, donde vemos el logo con el nombre de nuestro proyecto al acceder a la url por defecto <strong>http://localhost:3000/</strong>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 93.81%;" data-ratio="93.81" data-b-token="b-f3a1107b924" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303569bde21a.png?itok=g7o3zgbD" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="409" typeof="foaf:Image" /></div></div> <p>          Si exploramos esta página, veremos que dentro la llama a nuestro componente <strong>Logo.vue</strong>. Para ello simplemente tendremos que añadir la <strong>etiqueta html</strong> con el nombre del componente, en este caso <strong>&lt;Logo /&gt;. </strong>Esto es gracias a que dentro del archivo de configuración principal de Nuxtjs, <strong>nuxt.config.js</strong>, tenemos configurado la importación automática de los componentes.</p> <p>          Otra novedad con relación al componente, es la presencia del enunciado <strong>export default { }</strong> , que explicaremos más adelante, dentro la zona de <strong>&lt;script&gt;&lt;/script&gt;</strong> en la parte inferior de la página.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 119.27%;" data-ratio="119.27" data-b-token="b-a36a7047302" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630356bbdea59.png?itok=Z6m1GExi" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="520" typeof="foaf:Image" /></div></div> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 83.47%;" data-ratio="83.47" data-b-token="b-a085bbd0760" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630356d13af77.png?itok=Y0Z_6dUC" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="472" height="394" typeof="foaf:Image" /></div></div> <h2>   Ejecutando Vuex dentro de Nuxtjs</h2> <p>          Vamos a comprobar un ejemplo sencillo donde utilizaremos código Vuex, en la página <strong>index.vue</strong>, añadiremos un <strong>bucle for</strong> de Vuex, para repetir el componente varias veces dentro de la página. Para ello simplemente escribirmeos lo siguiente:</p> <pre> &lt;Logo v-for="logo in 5" :key="logo" /&gt;</pre> <p>         Una vez guardados los cambios, si volvemos a nuestra página principal en el navegador, el resultado será la presentación del componente, Logo.vue, cinco veces en la página.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 119.27%;" data-ratio="119.27" data-b-token="b-fc2b26a6f0c" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630356f660dcc.png?itok=1_XHRVUY" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="520" typeof="foaf:Image" /></div></div> <h2>    Creando nuestro primer componente</h2> <p>          Para nuestro ejemplo, vamos a crear una página formada por varios componentes, el primero de ellos será el área que compone la cabecera de la página. Ésta estará formada por un par de textos, un botón que al final llamará a un calendario, en la parte izquierda y una imagen circular en la parte derecha.</p> <p>          Como hemos descargado <strong>Bootstrap-vue</strong> para realizar cambios en el diseño de nuestro proyecto, podremos implementar fácilmente los estilos suficientes para conseguir el aspecto esperado.</p> <p>          Si quieres conocer más acerca de las opciones disponibles en Bootstrap-vue, visita su<a href="https://bootstrap-vue.org/" target="_blank"> Página Oficial</a> y explorar todas sus posibilidades.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 49.44%;" data-ratio="49.44" data-b-token="b-b30ba321887" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630357164504e.png?itok=3J21-5Dg" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="449" height="222" typeof="foaf:Image" /></div></div> <p>          Dependiendo del IDE que estés utilizando para trabajar en tu proyecto, existen diversas opciones y plugins que nos permiten crear fácilmente la estructura principal de un componente u otros elementos dentro de nuestro proyecto Nuxtjs. En mi caso, con PHP Storm, sólo tendré que activar el plugin y una vez colocado dentro de la carpeta <strong>components</strong>, haré clic derecho para crear un <strong>NUEVO COMPONENTE</strong>, al que le pondré el nombre de <strong>Cabecera.vue</strong>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 111.01%;" data-ratio="111.01" data-b-token="b-691a8aefcb9" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63035731948f1.png?itok=ytPb_AS_" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="436" height="484" typeof="foaf:Image" /></div></div> <p>     Una vez generado el archivo, sólo tendrás que sustituir las partes que cambiarán, para que se vea tal y como esperamos. Si lo prefieres, podrás copiar y pegar el siguiente código dentro de tu archivo <strong>Cabecera.vue, </strong>ubicado en tu carpeta <strong>components</strong> y a continuación, sustituiremos el componente <strong>Logo.vue</strong> dentro de la página <strong>index.vue</strong>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 102.36%;" data-ratio="102.36" data-b-token="b-243e3f5730a" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-6303576260fc8.png?itok=cZ2or4qU" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="381" height="390" typeof="foaf:Image" /></div></div> <pre> &lt;template&gt; &lt;div&gt; &lt;section class="bg-white text-dark p-5 p-lg-0 pt-lg-5 text-center text-sm-start"&gt; &lt;div class="container"&gt; &lt;div class="d-sm-flex align-items-center justify-content-between"&gt; &lt;div class="p-2"&gt; &lt;h1 id="titular-hero"&gt;A TU PUERTA&lt;/h1&gt; &lt;p class="lead"&gt;Sollicitudin litora modi aenean blandit natoque mollis lacus vehicula eligendi volutpat sodales auctor&lt;/p&gt; &lt;a href="#" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#formulario"&gt;Empieza Ahora&lt;/a&gt; &lt;/div&gt; &lt;div id="img-hero" v-responsive="{ small: el =&gt; el.width &lt;= 500 }"&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; export default { name: "Cabecera", } &lt;/script&gt; &lt;style scoped&gt; @media (max-width: 760px) { #img-hero { height: 300px!important; } } #titular-hero { font-family: 'Erica One', cursive; font-size: 4rem; } #img-hero { border: 2px solid; border-radius: 800px; background-image: url("~/assets/imagenes/frutas.jpg"); width: 100%; height: 450px; background-size: cover; background-repeat: no-repeat; background-position: center; } &lt;/style&gt;</pre> <p>     Felicidades, si todo ha ido correctamente, ya tienes tu primer componente, con diseño responsivo en tu proyecto Nuxtjs.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 165.82%;" data-ratio="165.82" data-b-token="b-c2732d8eb7e" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Curso Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-630357abc9652.png?itok=u4FhQhpi" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="392" height="650" typeof="foaf:Image" /></div></div> <p>REPO <a href="https://github.com/drupaladicto/nuxtjs">https://github.com/drupaladicto/nuxtjs</a></p> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:24</span> Thu, 16 Mar 2023 10:24:51 +0000 webmaster 376 at https://drupaladicto.com Nuxt.js | Prerrequisitos e instalación https://drupaladicto.com/curso/nuxtjs/nuxtjs-prerrequisitos-e-instalacion <span class="field field--name-title field--type-string field--label-hidden">Nuxt.js | Prerrequisitos e instalación</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-952 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-952 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-952 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-952"> <section id="video-only-952" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-673-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-673-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-673-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/VdrcsffSrtQ&amp;max_width=0&amp;max_height=0&amp;hash=AOptTMquFTfJ85Jf3-VLfpPSCz5GRSgltDG5ByHIxao" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-673-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--text-only paragraph--view-mode--default" id="txonly-1191" style="background-color: ;border: solid px;border-color: #096ba0;border-radius: 5px;padding: 10px;"> <div class="clearfix text-formatted field field--name-to-text field--type-text-long field--label-visually_hidden"> <div class="field__label visually-hidden">Texto</div> <div class="field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/VdrcsffSrtQ" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>    En este <strong>Curso Intensivo de Nuxtjs</strong>, no profundizaremos sobre la teoría, porque para ello tienes disponible la <a href="https://nuxtjs.org/">Página Oficial de Nuxtjs</a>, mi propósito fundamental es explicarte, de la mejor manera posible, todo lo que necesitas para comenzar a explorar el desarrollo de aplicaciones web, utilizando este magnífico Framework, fruto de una evolución de Vuex, y que ofrece una manera mucho más simple, en mi opinión, de aplicar múltiples mejoras en cuanto al diseño y funcionalidad de las webs.</p> <p>     Sin más que añadir por el momento, vamos a comenzar ya con la primera parte del curso:</p> <h2>     Prerrequisitos e instalación de NuxtJS</h2> <p>          Lo primero que vamos a necesitar, es un entorno de desarrollo estable, en el que podamos ejecutar todo nuestro código sin complicarnos la vida; en mi caso, como trabajado con Windows 10, he optado por utilizar el <strong>Subsitema de Linux</strong> con <strong>WSL2</strong> en mi ordenador, si no lo has utilizado, <a href="https://www.drupaladicto.es/actualidad/como-instalar-drupal-9-usando-docker-en-windows-10-home" target="_blank">aquí te explico cómo hacerlo</a>.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div data-b-token="b-6ee5ba55308" class="media media--blazy media--image media--ratio media--ratio--11 is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034dd8d0a77.png?itok=aYIM73ZY" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="325" height="325" typeof="foaf:Image" /></div></div> <p>          El siguiente requisito para comenzar a trabajar con Nuxtjs, una vez configurado nuestro entorno, será descarga e<a href="https://nodejs.org/en/" target="_blank"> Instalar NodeJS</a>, si ya lo tenías instalado, te recomiendo actualizar a la versión más reciente ya que se hicieron varias correcciones sobre errores de compatibilidad con Nuxtjs.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 77%;" data-ratio="77" data-b-token="b-514fca85028" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034e0754b35.png?itok=1ZswUGoH" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="413" height="318" typeof="foaf:Image" /></div></div> <p>         Antes de comenzar con la instalación de Nuxtjs, te recomiendo que compruebes las versiones de <strong>Nodejs</strong> y <strong>Npm</strong> que tienes instaladas, para ello puedes usar el comando:</p> <pre> node -v</pre> <pre> npm -v</pre> <p> </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 45.54%;" data-ratio="45.54" data-b-token="b-b82d527dc41" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034e3dc6a19.png?itok=Id7iz0Ts" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="296" typeof="foaf:Image" /></div></div> <h2>     Instalación del proyecto con Nuxt</h2> <p>           Ahora que ya tenemos todo a punto, listos para comenzar con nuestro proyecto, nos colocaremos en la carpeta destinada para ello, y crearemos una nueva carpeta a la que daremos todos los permisos para evitar fallos durante el proceso de instalación.</p> <p>          Una vez realizados estos pasos, podremos comenzar con la descarga e instalación de la estructura principal de nuestro proyecto, yo he creado una carpeta llamada <strong>proyectoNuxt</strong>, y dentro de esta tendré otra carpeta a la que llamaré<strong> cliente</strong>, que será donde alojaré todos los archivos de mi instalación con Nuxtjs, de esta forma, una vez realizada mi instalación, podré trabajar conectándome, por ejemplo a otros proyectos mediante API, manteniendo una estructura organizada.</p> <pre> sudo mkdir proyectoNuxt</pre> <pre> sudo chmod -R 777 proyectoNuxt</pre> <pre> cd proyectoNuxt/</pre> <p> </p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 38.39%;" data-ratio="38.39" data-b-token="b-1a0ad5dc8f6" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034e5c74117.png?itok=2ZwzFpnB" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="422" height="162" typeof="foaf:Image" /></div></div> <p>    Si vamos a la <a href="https://nuxtjs.org/docs/2.x/get-started/installation">Página Oficial de Nuxt</a>, comprobaremos que para instalarlo podremos utilizar <strong>npm</strong> o <strong>yarm</strong>, en mi caso optaré por la primera opción pero puedes hacerlo con la que prefieras.</p> <p>     Estando dentro de la carpeta donde alojaremos la instalación, ejecutaremos el siguiente comando, que crerá la carpeta <strong>cliente</strong> y dentro alojará todos los archivos de nuestra instalación de <strong>Nuxtjs</strong>:</p> <pre> npx create-nuxt-app cliente</pre> <p>     De inmediato, comenzará la descarga de todos los archivos necesarios para que comencemos a trabajar con <strong>Nuxtjs</strong>. Y una vez descargado se nos realizarán varias preguntas sobre el proyecto que vamos a comenzar, para terminar con las configuraciones correspondientes:</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 15.08%;" data-ratio="15.08" data-b-token="b-daddedb0cc5" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034e9540d1d.png?itok=EKiCehCD" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="98" typeof="foaf:Image" /></div></div> <p>     Tendremos la oportunidad de seleccionar varias opciones, previas a nuestra instalación, como el uso de algún Framework de testeo o de Frontend, si usaremos control de versiones, etc.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 32.46%;" data-ratio="32.46" data-b-token="b-70d8bbe62f4" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034ec0d734c.png?itok=1a1A9ONq" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="650" height="211" typeof="foaf:Image" /></div></div> <p>     Una vez hayamos seleccionado las opciones que consideramos importantes para nuestro proyecto, entonces, continuará la descargar y configuración final del <strong>Nuxtjs</strong> y se mostrará en pantalla un conjunto de informaciones, dentro de las que están los comandos fundamentales para arrancar nuestro proyecto y comenzar con la diversión.</p> <p>     En nuestro caso, nos moveremos a la nueva carpeta <strong>cliente</strong> y una vez allí, ejecutaremos el comando</p> <pre> npm run dev </pre> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 61.14%;" data-ratio="61.14" data-b-token="b-aa08c6033a2" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034fa1ac4cf.png?itok=yz6Uptb-" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="422" height="258" typeof="foaf:Image" /></div></div> <p>     Si todo ha ido bien, entonces veremos la url "<strong>http://localhost:3000/</strong>", para acceder a nuestro proyecto, si la copiamos en el navegador deberíamos ver la página de bienvenida de Nuxtjs.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 71.91%;" data-ratio="71.91" data-b-token="b-1a238816ab1" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034fc0d9355.png?itok=imZT0ShS" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="413" height="297" typeof="foaf:Image" /></div></div> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 66.82%;" data-ratio="66.82" data-b-token="b-a0f33a56976" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034fd4b0e58.png?itok=iMnZQKgr" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="422" height="282" typeof="foaf:Image" /></div></div> <p>     Y si abrimos, utilizando el <strong>IDE</strong> de nuestra preferencia, los archivos donde tenemos alojado nuestro proyecto, podremos comprobar la estructura de <strong>Nuxtjs</strong>, que explicaremos en detalle a medida que avancemos en el desarrollo del curso.</p> <p></p><div class="media-wrapper media-wrapper--blazy media-wrapper--image"> <div style="padding-bottom: 79.62%;" data-ratio="79.62" data-b-token="b-0f630e59708" class="media media--blazy media--image media--ratio media--ratio--fluid is-b-loading"><img alt="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" title="Nuxt.js | www.drupaladicto.com - Consultor especializado en drupal y symfony" decoding="async" class="media__element b-lazy b-filter img-fluid" loading="lazy" data-src="/sites/default/files/styles/max_1300x1300/public/inline-images/file-63034fefcfa45.png?itok=MQqmTlei" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%201%201'%2F%3E" width="422" height="336" typeof="foaf:Image" /></div></div> <p>REPO <a href="https://github.com/drupaladicto/nuxtjs">https://github.com/drupaladicto/nuxtjs</a></p> </div> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:22</span> Thu, 16 Mar 2023 10:22:05 +0000 webmaster 375 at https://drupaladicto.com Nuxtjs | Presentación https://drupaladicto.com/curso/nuxtjs/nuxtjs-presentacion <span class="field field--name-title field--type-string field--label-hidden">Nuxtjs | Presentación</span> <div class="field field--name-field-contenidos-cap-gratis field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <style>#video-only-955 .play-btn:hover::after { border-left: 15px solid #1fd7d9; transform: scale(20); border-left: 15px solid #fff; } #video-only-955 .play-btn::before { border: 5px solid #1fd7d9; } #video-only-955 .play-btn { background: radial-gradient(#1fd7d9 50%, rgba(66, 109, 202, 0.4) 52%); }</style> <div class="paragraph paragraph--type--video-only paragraph--view-mode--default" id="vol-955"> <section id="video-only-955" class="about area-padding video-block-wrapper"> <div class="col video-box"> <div class="portada"> <img src="/sites/default/files/styles/diapositiva_1200x650/public/2023-07/portada-gratuito-grande_2.jpg?itok=8dBQYXT7" class="img-fluid" alt=""> <div class="field field--name-vo-youtube-video field--type-entity-reference field--label-visually_hidden"> <div class="field__label visually-hidden">Video de Youtube</div> <div class="field__item"><article class="media media--type-remote-video media--view-mode-diapositiva-1200x650"> <div class="field field--name-field-media-oembed-video field--type-string field--label-visually_hidden"> <div class="field__label visually-hidden">URL de Video remoto</div> <div class="field__item"><div class="modal micromodal-slide" id="modal-media-676-0-field-media-oembed-video" aria-hidden="true"> <div class="modal__overlay" tabindex="-1" data-micromodal-close> <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-media-676-0-field-media-oembed-video-content"> <a class="modal__btn" data-micromodal-close aria-label="Close this dialog window">X</a> <main class="modal__content" id="modal-media-676-0-field-media-oembed-video-content"> <div class="videoWrapper"><iframe src="/media/oembed?url=https%3A//youtu.be/Cy-HuGx0_R8&amp;max_width=0&amp;max_height=0&amp;hash=3lcxiX1HAGYcCYiryydpItEWOjHmeA8LVYrcOi5JXfo" frameborder="0" allowtransparency="" class="media-oembed-content" title="Time Value of Money"></iframe></div> </main> </div> </div> </div> <div><a class="myButton" data-micromodal-trigger="modal-media-676-0-field-media-oembed-video"><span class="btn play-btn">.</span></a></div> </div> </div> </article> </div> </div> </div> </div> </section> </div> </div> <div class="field__item"> <div class="paragraph paragraph--type--bloque-parrafo paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-field-textos-curso field--type-text-long field--label-hidden field__item"><h2><strong>Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... <a href="https://youtu.be/Cy-HuGx0_R8" target="_blank">HAZ CLIC AQUI</a></strong></h2> <p>     Nuxt.js es un framework basado en Vuex, cuyo propósito es ofrecer una alternativa más compacta, para la realización de proyectos que ofrezcan un aspecto atractivo y práctico, con poco tiempo de carga de la información y la capacidad para interactuar con el backend a través del mismo navegador.</p> <p>Si quieres aprender más sobre este framework,visita su <a href="https://nuxtjs.org/" target="_blank">página oficial</a></p> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:16</span> Thu, 16 Mar 2023 10:16:10 +0000 webmaster 374 at https://drupaladicto.com Curso intensivo Nuxtjs https://drupaladicto.com/curso/curso-intensivo-nuxtjs-resumen <span class="field field--name-title field--type-string field--label-hidden">Curso intensivo Nuxtjs</span> <div class="field field--name-field-portada-ce field--type-entity-reference field--label-hidden field__item"><article class="media media--type-imagen media--view-mode-default"> <div class="field field--name-field-media-image field--type-image field--label-visually_hidden"> <div class="field__label visually-hidden">Imagen</div> <div class="field__item"><svg xmlns="http://www.w3.org/2000/svg" id="a" viewBox="0 0 650 650"> <rect y="0" width="650" height="650" style="fill:#054065; stroke:#1d1d1b; stroke-miterlimit:10;"></rect> <text transform="translate(183.61 309.27)" style="fill:#fff; font-family:Montserrat-Light, Montserrat; font-size:99.05px; font-weight:300;"> <tspan x="0" y="0" style="letter-spacing:-.02em;">C</tspan> <tspan x="69.04" y="0">u</tspan> <tspan x="135.3" y="0" style="letter-spacing:0em;">r</tspan> <tspan x="174.03" y="0">so</tspan> <tspan x="-58.14" y="90">G</tspan> <tspan x="18.42" y="90" style="letter-spacing:-.05em;">r</tspan> <tspan x="52.69" y="90">atui</tspan> <tspan x="241.97" y="90" style="letter-spacing:-.02em;">t</tspan> <tspan x="279.51" y="90">o</tspan> </text> </svg></div> </div> </article> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/luis-alberto-mejia" typeof="schema:Person" property="schema:name" datatype="">webmaster</span></span> <span class="field field--name-created field--type-created field--label-hidden">Jue, 16/03/2023 - 11:10</span> <div class="clearfix text-formatted field field--name-field-descripcion-ce field--type-text-long field--label-hidden field__item"><p>     En este Curso Introducción a Nuxt.js, te enseño lo básico sobre el trabajo con NUXT, que es una variación de NEXT, para que puedas hacerte una idea, en el caso de que apuestes por utilizar drupal como Headless. (Decidí explicar NUXT, porque luego se creó una variante de este, enfocada específicamente a Drupal, llamada DRUXT)</p> </div> <div class="field field--name-field-tipo-ce field--type-list-string field--label-hidden field__item">Curso Gratuito</div> <div class="field field--name-field-suscribete-youtube field--type-link field--label-hidden field__item"><a href="https://www.youtube.com/drupaladicto">Suscríbete al canal</a></div> <div class="field field--name-field-categoria-ce field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/categoria/nuxt" hreflang="es">nuxt</a></div> <div class="field__item"><a href="/categoria/nuxt-javascript" hreflang="es">nuxt javascript</a></div> <div class="field__item"><a href="/categoria/headless" hreflang="es">headless</a></div> <div class="field__item"><a href="/categoria/desacoplado" hreflang="es">desacoplado</a></div> <div class="field__item"><a href="/categoria/descabezado" hreflang="es">descabezado</a></div> <div class="field__item"><a href="/categoria/drupal-9" hreflang="es">drupal 9</a></div> <div class="field__item"><a href="/categoria/frontend" hreflang="es">frontend</a></div> </div> <div class="field field--name-field-comenzar-curso field--type-string field--label-hidden field__item">/curso/curso-intensivo-nuxtjs</div> Thu, 16 Mar 2023 10:10:10 +0000 webmaster 372 at https://drupaladicto.com