Vue. js 3 y Firebase para principiantes | Chris Dixon | Skillshare
Buscar

Velocidad de reproducción


  • 0.5x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 2x

Vue. js 3 y Firebase para principiantes

teacher avatar Chris Dixon, Web Developer & Online Teacher

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      ¡Te damos la bienvenida a la clase!

      1:31

    • 2.

      Qué necesitarás

      1:38

    • 3.

      Cómo crear una configuración de herramienta

      5:42

    • 4.

      Imágenes de proyecto

      2:16

    • 5.

      ¿Vistas O Componentes?

      1:39

    • 6.

      Vistas y rutas

      6:29

    • 7.

      RouterLink y RouterView

      6:16

    • 8.

      Rutas con nombre

      2:15

    • 9.

      Rutas anidadas

      4:23

    • 10.

      La vista sobre los aspectos y los componentes de los niños

      9:10

    • 11.

      Vistas nombradas

      6:20

    • 12.

      Proyecto UI- Intro de sección

      0:25

    • 13.

      El menú de UI

      4:14

    • 14.

      La interfaz de usuario de la cesta

      3:03

    • 15.

      Fuentes y estilos base

      7:31

    • 16.

      Estilismo de menú y cesta

      5:37

    • 17.

      Estilismo de cabecera

      4:34

    • 18.

      Admin: Agregar un nuevo formulario de pizza

      5:54

    • 19.

      Admin: Componente de pizzas

      3:36

    • 20.

      Admin: Componente de los pedidos

      4:25

    • 21.

      Vista de casa

      7:33

    • 22.

      Estilismo de forma y mesa

      10:26

    • 23.

      ¿Opciones O Composición?

      3:37

    • 24.

      El vínculo de nuevos objetos y datos

      5:46

    • 25.

      Ref’s y agregación a la cesta

      7:33

    • 26.

      Cómo retumbar las pizzas

      5:30

    • 27.

      Verificación de los artículos de cesta duplicados

      4:30

    • 28.

      Eliminación y cambio de la cantidad

      4:18

    • 29.

      Propiedades computadas

      3:34

    • 30.

      Archivos Composable

      5:12

    • 31.

      ¿Qué es Firebase?

      1:48

    • 32.

      Instalación de Firebase

      7:30

    • 33.

      Agregación de pizzas

      7:30

    • 34.

      Cómo conseguir pizzas

      9:17

    • 35.

      Listado y eliminación de pizzas en Admin

      11:01

    • 36.

      Creación de órdenes

      8:15

    • 37.

      Pedidos de búsqueda

      7:57

    • 38.

      Cómo extender los pedidos

      4:24

    • 39.

      Eliminar los pedidos

      4:43

    • 40.

      Mostrar y ocultar los bloques de administrador

      5:07

    • 41.

      La función de registro

      7:27

    • 42.

      Cómo crear el formulario de inicio

      8:57

    • 43.

      Estilismo modal

      8:41

    • 44.

      Palanca modal

      4:16

    • 45.

      Cómo iniciar sesión

      9:34

    • 46.

      Detección de cambios de interés

      5:07

    • 47.

      Estilización de la vista de sobre

      5:18

    • 48.

      Completación de la vista de administrador

      4:55

    • 49.

      Restricción de nuevas pizzas

      2:14

    • 50.

      Cómo agregar al usuario

      6:45

    • 51.

      Filtros y propiedades globales

      8:52

    • 52.

      Actualizaciones de la pizza

      4:53

    • 53.

      Actualizaciones de pedidos en tiempo real

      2:30

    • 54.

      Cancelar la suscripción a las actualizaciones

      2:49

    • 55.

      Agregación de nuevos usuarios

      7:37

    • 56.

      Recuperación de usuarios de administradores

      5:37

    • 57.

      Actualización de los usuarios regulares

      10:48

    • 58.

      Actualización de los usuarios regulares a la parte 2

      6:42

    • 59.

      Reglas de Firebase

      17:10

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

192

Estudiantes

4

Proyectos

Acerca de esta clase

Vue 3 es un marco increíble para crear aplicaciones web! Aprenderás todo al respecto en esta clase centrada en la versión 3 de Vue.js. Esta clase está completamente basada en proyectos, y juntos construimos una aplicación de pizza!

Descubre todo lo que necesitas saber desde la estructuración de una aplicación utilizando páginas y componentes hasta las últimas funciones, como la API de composición y la configuración de script. Aprenderás sobre la reactividad de la Vue 3 y cómo utilizar características nuevas y existentes, como ganchos de ciclo de vida, vigilantes y propiedades computadas.

Las imágenes de un proyecto se pueden encontrar aquí.

Si te quedas atascado, también puedes comparar tu código al proyecto final en diferentes etapas utilizando el siguiente enlace:

https://github.com/chrisdixon161/vue3-firebase-for-beginners-project-stages

La clase está diseñada para ser amigable con los desarrolladores nuevos en Vue.js o Firebase, sin embargo, para aprovechar al máximo esta clase. Deberías tener algo de experiencia con JavaScript, ya sea con JavaScript regular o con otro framework como React o Vue 2.

Cubriremos el itinerario para cambiar entre páginas, cómo habilitar rutas infantiles y utilizando varios componentes de vista de enrutador con nombre.

También utilizamos Firebase como un servicio de backend para nuestro proyecto. Instalamos una base de datos para almacenar nuestros pedidos, elementos de menú y datos de usuarios utilizando la última versión web 9 (modular). Esta base de datos también estará en tiempo real, lo que significa que nuestro proyecto se mantiene al día de cualquier cambio en la base de datos a medida que sucedan. Aprenderás sobre muchos métodos para crear, leer, actualizar y eliminar datos.

La autenticación de Firebase también se configurará para administrar a nuestros usuarios. Permitiremos cuentas de usuario y también múltiples niveles de acceso. Esto permitirá a los usuarios habituales realizar pedidos y a los usuarios de administrador para administrar los elementos de menú, los pedidos y otros usuarios.

Conoce a tu profesor(a)

Teacher Profile Image

Chris Dixon

Web Developer & Online Teacher

Top Teacher

Hello, My name is Chris and I am a Web Developer from the UK. I am an experienced trainer leading web development bootcamps and also teaching online courses.

My main areas of interest are Vue.js, WordPress, Shopify, Javascript, eCommerce, and business. I am passionate about what I do and about teaching others. 

Whatever your reason for learning to build websites you have made an excellent career choice.

My personal motivation was to become my own boss and have more freedom and flexibility in my life. I also enjoy the technical challenge it provides and the way it constantly evolves. I built my first website back in 1999 and I have watched the web evolve into what it is today.

I try to make my courses enjoyable and try to remember what it was like wh... Ver perfil completo

Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. ¡Te damos la bienvenida a la clase!: [MUSIC] Vue.js es un marco front-end increíble y fácil para construir aplicaciones web. En este curso, lo vamos a utilizar para construir una aplicación de pizzería repleta de características. Descubriremos todas las nuevas características de Vue Versión 3 mientras construimos este proyecto. Además, vincularemos nuestro proyecto a Firebase, para aplicar un back-end a nuestra app. Esto nos brinda una base de datos en tiempo real para almacenar a nuestros usuarios, nuestros pedidos y pizzas del menú. También se utilizará para proporcionar cuentas de usuario y autenticación, incluidos los usuarios administrativos y regulares. El proyecto tiene muchas características como un menú y una canasta, agregar artículos también y la capacidad de hacer pedidos. Contamos con un área de administración donde los usuarios autorizados pueden agregar y eliminar pizzas del menú. Tus pedidos se pueden mostrar y también eliminar, junto con la posibilidad de establecer otras cosas como lo hacen los administradores. Todos estos datos son impulsados de nuestra base de datos. Hola. Soy Chris y soy un desarrollador web con experiencia. También he enseñado a más de 100 mil alumnos, tanto en línea como en persona también. Si quieres construir increíbles aplicaciones front-end con Vue Versión 3 y también hacer uso de Firebase Database and Authentication, entonces esta es la clase para ti. Espero verte en la primera lección. 2. Qué necesitarás: Para este cluster no hay compras adicionales que necesitarías hacer. Todos estos programas que vamos a utilizar serán gratuitos y de código abierto. Entonces solo hay de hecho algunas cosas que vamos a necesitar. Pero antes de hacerlo, echemos ahora un vistazo a los requisitos para que no nos abrumes demasiado. Dado que esta es una clase de desarrollo web, al menos deberías conocer los conceptos básicos y se asumirá que conoces bastante bien HTML y CSS y además cómodo usando JavaScript. No necesitas ser un experto, pero al menos necesitas conocer lo básico. Tengo clases disponibles en cada uno de estos si necesitas repasar primero. Además, si tienes experiencia de otros frameworks de JavaScript o bibliotecas como Angular o React, o incluso Vue Versión uno o 2, esto será un gran beneficio, pero no esencial. Además, estaremos haciendo un uso menor de la terminal, pero si no lo has usado en el pasado, no te preocupes por ello. Sólo vamos a hacer uso de unos sencillos comandos. Visual Studio Code, será el editor de texto que voy a utilizar a lo largo de este curso. Actualmente es muy popular en el mundo del desarrollo web, pero puedes usar cualquier otro editor que prefieras. Si lo necesitas, el enlace de descarga está aquí para seguir, y también es completamente gratuito. Otro beneficio es que viene con un terminal incorporado, que usaremos para configurar nuestro proyecto e instalar los paquetes que pueda necesitar. Pero también si te sientes cómodo con la terminal y tal vez tengas tus propios externos como Item, esto también está completamente bien de usar. Con esto en mente, pasemos al siguiente video donde veremos cómo podemos configurar nuestro proyecto usando Vite. 3. Configuración de herramientas con Vite: Para comenzar nuestro proyecto, comenzaremos con una configuración local. Podemos ejecutar Vue.js en nuestro propio equipo. Para ello, haremos uso de una herramienta de compilación llamada Vite. De hecho, Vite fue creado por Evan You quien también creó Vue.js. Esta herramienta de compilación nos permitirá hacer uso de componentes de archivo único de vista, que es cuando escribimos una parte de nuestro sitio web llamada los componentes en un solo archivo. Esto mantendrá las cosas bien y organizadas para nosotros cuando estemos creando nuestro proyecto. Pero también significa que necesitamos una herramienta de compilación para tomar todas estas piezas separadas de componentes y agruparlas para hacer nuestra aplicación. Vites también nos brinda muchos otros beneficios, como un servidor de desarrollo, reemplazo de módulo caliente, que actualizará instantáneamente el proyecto en el navegador sin necesidad de actualizar la página, haremos un cambio. También hay muchas otras ventajas. Necesitarás instalar Node.js Si aún no lo has hecho. Puedes hacer esto desde nodejs.org. Sigue adelante y descarga la última versión para tu sistema operativo. Estoy usando un libro para Mac si estás usando Windows, debería detectarlo automáticamente para. Si no, simplemente haga clic en la otra descarga. Esta descarga también incluirá npm, que usaremos para configurar nuestro proyecto y también agregar paquetes a medida que los necesitemos. A continuación, pasa al terminal, que puedes usar un terminal independiente si lo prefieres. O puedes usar el integrado en Visual Studio Code. La sencillez, ésta es la que voy a utilizar. Entra en el código de Visual Studio, en las opciones, terminal, y luego nuevo terminal. Ahora vamos a tener este terminal en la parte inferior, que podemos usar para escribir comandos. Si eres nuevo en la terminal, no es nada de qué preocuparnos solo necesitamos unos simples comandos. Puedes usar un terminal para navegar por los archivos y carpetas de tu computadora, igual que puedes hacer con el mouse haciendo clic dentro de una ventana. Aquí, sin embargo, usamos comandos pero tendremos que navegar hacia donde queremos agregar nuestro proyecto. Quiero que sea sencillo y agregarlo al escritorio para facilitar el acceso. Actualmente estoy en el directorio home para mi usuario. Podemos usar el comando LS para listar todos los archivos y carpetas dentro de este directorio. Entonces podemos usar el comando cd para cambiar a cualquiera de estos directorios que desee. Para mi va al escritorio, que podemos ver listado aquí. cd para cambiar en ella al escritorio. Esto también distingue entre mayúsculas y minúsculas. Golpe's “Enter”. Ahora podemos ver que estamos dentro del directorio de Escritorio. Pero si quieres, puedes cambiar a cualquier otro directorio que quieras. Pero justo antes de crear el proyecto, necesitamos volver a verificar que tenemos los nodos y npm correctamente instalados. Para ello, vamos a escribir nodo dash v, que significa versión. Veremos devuelto el número de versión que está instalado. Mi versión actual es la Número 18. Necesitarás al menos el nodo Versión 15 para continuar. Obviamente, cualquier número de versión superior a 15, estarás bien para ir. Pero si ve un mensaje de error o una advertencia, deberá regresar y asegurarse de que el nodo esté correctamente instalado. A continuación, podemos volver a verificar npm, entonces npm dash v. No vemos ningún problema aquí. Para crear un proyecto de vista JS usando Vite, necesitamos ejecutarlo con este comando. Esto es npm en él. Ver. A más tardar. Su entrar. Nos está pidiendo instalar los siguientes paquetes, que es Create View. Esto está bien. Presiona “Y” o presiona “Enter”. Entonces hicimos una serie de preguntas. En primer lugar, el nombre del proyecto, mío será pizza planet. Puedes cambiar esto si queremos. No vamos a hacer uso de TypeScript. Vamos a golpear No, no necesitamos soporte de JSX, así que vamos a ir por, No. ¿Quieres agregar el router de vista? Sí, lo hacemos. Pronto echaremos un vistazo a esto. Si queremos administración estatal, vamos a seleccionar No ya que usamos una administración estatal dentro de archivos componibles. También echaremos un vistazo a cómo hacer esto a lo largo de la clase. No vamos a estar cubriendo el intestino, así que golpearemos No y No. Sí. Largo. Eso puede ser sí. Depende de ti. Más guapa? Sí. Bien, y ya estamos todos hechos. Recuerda, que antes usamos el comando cd para cambiarnos al directorio de escritorio bien ahora hemos creado un nuevo directorio llamado pizza planet, y esto ahora está dentro de nuestro escritorio. Lo que tenemos que hacer, como dice aquí, ahora necesitamos cambiarnos al directorio pizza planet, así cd, pizza dash planet o el nombre del proyecto de su elección. Luego necesitamos ejecutar npm install, que instalará todos los paquetes necesitamos para nuestros proyectos Vue. Bien, los paquetes ya están todos instalados. Para poner en marcha nuestro servidor de desarrollo, necesitamos ejecutar npm, ejecutar dev. Es Enter. Esto luego nos dará una dirección web para abrir dentro del navegador. Podemos copiar esto o clic de Comando o Control, que lo abrirá dentro del navegador. Este es nuestro iniciador de proyectos, lo que significa que todo está funcionando correctamente. Desde que configuramos el router de vista, que vamos a hablar un poco más adelante. También veremos un enlace Inicio y un Acerca para cambiar entre. 4. Imágenes de proyectos: A lo largo de este proyecto, utilizaremos algunas imágenes del proyecto. Puedes descargar los tuyos si lo prefieres, o puedes usar exactamente los mismos que estoy usando. Si quieres seguir y usar los mismos, dentro de GitHub, tengo este repositorio que está disponible en github.com/, mi nombre de usuario, que es chrisdixon161/pizza-planet-v3-images con un guión entre cada palabra. Se trata de un repositorio sencillo. Todo lo que tenemos dentro es esta carpeta de imágenes con las seis imágenes que vamos a agregar a nuestro proyecto. Si quieres usar estos, solo tienes que hacer clic en el botón Código. Descarga el archivo zip. Una vez terminado esto, puedes hacer clic en esto para abrirla. Entonces tenemos que agregar esto a nuestro proyecto. En primer lugar, ve a Visual Studio Code o a tu editor de texto. Lo que tenemos que hacer es abrir nuestro proyecto dentro de aquí. Arrastre sobre la carpeta del proyecto que creamos en el video anterior. El mío se almacena en el escritorio. Arrastre esto al código de Visual Studio. Ahora vemos todos los archivos y carpetas de nuestro proyecto V dentro de la barra lateral. También es posible que necesitemos reabrir la terminal. El Terminal y luego ir a Nuevo. Actualmente estamos dentro de un proyecto pizza-planeta. Podemos ejecutar npm, run dev, que volverá a abrir esto con este enlace. Comando o control clic. Bueno. Todo está bien. Entonces si entramos en nuestras imágenes, y luego en nuestra carpeta de proyectos, que acabamos de abrir en Visual Studio, vamos a la carpeta fuente, a los assets, y luego podremos arrastrar la carpeta images dentro de aquí. Sostén esto abajo. También podemos verlos en una barra lateral si abrimos la fuente, en los activos, y ahí nuestras imágenes que vamos a usar para este proyecto. Nuevamente, si quieres usar tus propias imágenes, puedes agregarlas a una carpeta de imágenes dentro de aquí y usarlas a medida que avanzamos en el proyecto. Pero ahora con estos disponibles para usar, vamos a pasar a la sección de enrutamiento, donde echaremos un vistazo a cómo podemos cambiar entre páginas. 5. ¿Vistas O Componentes?: En esta sección echaremos un vistazo a algunas rutas básicas para permitirnos cambiar entre diferentes páginas dentro de nuestra aplicación. Pero justo antes de hacer esto, así que quiero echar un vistazo rápido a dos archivos diferentes que vamos a estar usando. Estas son vistas y componentes. Veamos cuál es la diferencia entre estos dos. En primer lugar, tenemos la idea de los puntos de vista. Se trata de archivos que contienen el contenido de cada página de visualización. Una aplicación o sitio web típico usaría enlaces como Home, About Us y Contact Us y cada uno de estos enlazará a una nueva página. Es así como vamos a hacer uso de las vistas. Al lado de los componentes, y los componentes son generalmente piezas más pequeñas de nuestra aplicación, que pueden ser un elemento independiente o se pueden reutilizar en varias páginas de vistas. Un componente podría ser cualquier bloque de contenido como un mapa de ubicación, un producto en una tienda de comercio electrónico, o incluso un simple bloque de texto. Los componentes también se pueden reutilizar repitiendo el contenido varias páginas o pasando datos dinámicos de un componente. Los archivos de componentes y los archivos de vista son los mismos. También tienen el mismo contenido y estructura ya que ambos son componentes de vista. Pero tenerlos en diferentes carpetas mantiene las cosas organizadas. Para recapitular, una vista es una página que podemos usar para alternar en nuestra aplicación. Generalmente, un componente es una pieza más pequeña, a menudo más reutilizable de nuestra página. Generalmente los almacenamos en sus propias carpetas llamadas vistas y componentes para hacerlas más organizadas. Esto es lo que vamos a estar echando un vistazo a continuación. 6. Vistas y rutas: Dentro del navegador, tenemos nuestro proyecto abierto. Hemos mirado brevemente este Hogar y los enlaces Acerca de que se proporcionan. Cambiamos entre estas dos páginas o estas dos vistas que acabamos de conocer. Podemos ver estos dos archivos de vista dentro del Editor. Saltar al código de Visual Studio con el proyecto abierto dentro de la carpeta fuente donde escribiremos todo nuestro código. Tenemos esta carpeta llamada views. Esto tiene el About y el HomeView que acabamos de cambiar entre dentro del proyecto. Dentro de estos archivos te resultará bastante familiar si has usado Vue.js en el pasado. Son solo archivos componentes donde tenemos la sección de script, donde escribimos todo nuestro código JavaScript e importamos cualquier archivo que pueda necesitar. Entonces también un área de plantilla justo aquí. Esta es la zona donde escribimos nuestro HTML. También podemos tener una sección de estilo que podemos ver si vamos a la AboutView. Encima de esto dentro de la carpeta fuente, tenemos esta carpeta router con una página index.js. Tenemos esto ya que elegimos instalar el paquete de enrutadores Vue cuando configuramos por primera vez este proyecto. La clave aquí está en la parte superior del archivo donde importamos cualquiera de nuestras vistas. Aquí podemos ver que estamos importando el HomeView desde la carpeta views. Entonces abajo dentro de CreateRouter tendrá esta matriz de rutas. Cada una de estas rutas es un objeto como vemos aquí. Vemos la ruta del archivo, que es slash hacia adelante. Este es el directorio home. Podemos darle el nombre de este router, que nos referiremos durante nuestro proyecto. Luego vincula esto a un componente particular de vista que acabamos de importar. Después de esto, también tenemos la sección Acerca de. Quizás se esté preguntando por qué no hemos importado el AboutView arriba en la parte superior junto con el HomeView. Bueno, muchas veces haríamos esto y también importante el AboutView, al igual que hicimos con los componentes Home. Pero en cambio, esto está demostrando un enfoque ligeramente diferente donde usamos algo llamado carga perezosa. Cargamos perezoso la página para descargar solo el contenido de la página cuando el usuario realmente los necesita. Esta descripción general de la página del enrutador, ahora vamos a crear las vistas que necesitamos para nuestro proyecto entonces podemos volver y agregar esto a nuestra matriz. En la fuente, en la carpeta views, todavía podemos hacer uso de HomeView y AboutView para nuestros proyectos. Solo aclaremos el contenido del interior para que no necesitemos los componentes de bienvenida. Ya que hemos eliminado esto, también podemos eliminar la referencia a ella justo aquí. En lugar de colocar un encabezado de Nivel 3 tal vez envíe un mensaje de texto a una casa. Volveremos y agregaremos contenido a estas vistas pero por ahora, podemos usar el encabezado Level 3 para ver qué página estamos cambiando entre. El AboutView, quita el estilo. No tenemos una sección de guiones. Tenemos el envoltorio, H3, y el texto de aproximadamente. Dentro de las vistas, necesitamos dos archivos más. Haga clic en el icono “Archivo” justo sobre la parte superior. También necesitamos el AdminView, que usa la extenación.vue. Crea una plantilla, un encabezado. Esto es para el Admin. Presentamos la vista final que vamos a usar es el MenuView. Esta será utilizada para mostrar todas las pizzas que tenemos de nuestra base de datos y también una cesta de compras también. Otra plantilla, el encabezado del menú. Entonces podemos cerrarlos e importarlos dentro de nuestro router, así el índice del router. Todos estos están en el mismo directorio que un HomeView. Copiemos y peguemos esto tres veces más. El Menú y el MenuView. El siguiente es el Admin del AdminView y el último es el Acerca de. Como los hemos importado en la parte superior de nuestro archivo, básicamente podemos duplicar la sección Inicio. Justo debajo de esto, crea un nuevo objeto separarlo por una coma. El camino que queremos usar es una cadena y esto va a ser el menú de slash hacia adelante. Esto significa que si entramos en nuestro proyecto y al final, escribiendo el menú de barras inclinadas hacia adelante, veremos la vista de menú dentro del navegador. A continuación, el nombre, que es el enlace del menú. usaremos pronto en nuestro proyecto. El componente que queremos mostrar es el menú que importamos justo arriba. A continuación, tenemos el Admin, escribimos nuevo objeto y lo separamos con una coma. Este quiere acceder dentro del navegador con el administrador de slash forward, el nombre del enlace admin y los componentes admin. Bueno. El último que necesitamos es Acerca de. El camino hacia adelante y el orden que colocamos esto no hace ninguna diferencia en nuestro proyecto. El nombre de este enlace, el enlace Acerca de y finalmente los componentes. Bueno. Todo esto está hecho. Asegúrate de tener una coma entre cada una de estas rutas. Dale un ahorro a esto. Si ahora pasamos al navegador, actualice. En el menú de slash hacia adelante, tenemos los textos del menú de nuestros componentes. También contamos con Admin. Ves el texto de administración, Acerca de, luego la diagonal hacia adelante para el directorio de inicio. Actualmente, todavía vemos el contenido de nuestras cuatro vistas junto con el contenido existente a la izquierda. ¿Cómo sabe nuestra app dónde queremos que se muestren estas vistas? Bueno, la respuesta a esto se encuentra dentro del RouterView, que vamos a ver a continuación junto con agregar estas nuevas vistas a nuestros enlaces de navegación. 7. RouterLink y RouterView: Dentro de nuestra carpeta fuente en el proyecto, abre la App.vue. Dentro de este archivo, aquí hay dos cosas principales a tener en cuenta. Uno de ellos es que tenemos esta área de navegación, y esta contiene dos enlaces de enrutador. Esto tiene el texto de home y también sobre, y estos son los dos enlaces que vemos dentro de nuestro proyecto. Lo primero aquí es estos enlaces no son los ocho elementos habituales, que veremos en HTML regular. En cambio, están rodeados dentro de este enlace de enrutador. Así es como el router de vista maneja los enlaces a otras páginas o componentes. Utiliza estos en lugar de los elementos a para que el router pueda cambiar las URL de la página sin recargar la página. También podemos controlar la URL que estamos enlazando para incluir rutas dinámicas, que pueden incluir variables, en lugar de simplemente tener los textos simples como los que tenemos aquí, también podemos insertar variables también. Además, verá este componente de vista de enrutador abajo en la parte inferior. Este es el outlet que muestra el contenido de nuestra página, que tenemos dentro de las vistas. Aquí es donde se muestra el contenido de nuestra página, dándonos un control total en lugar de simplemente reemplazar el contenido de la página completa. Aquí vemos que este componente de vista de enrutador se coloca junto al encabezado. Es por ello que los vemos lado a lado dentro del navegador. Además, observa que si sube a la parte superior del archivo, tanto el enlace del enrutador la vista del enrutador se importan desde el paquete view router. Con este conocimiento, podemos eliminar el código estándar de aquí y crear nuestros propios enlaces dentro de los componentes de encabezado. Vamos a limpiar esta app.vue. Sacaremos nuestro enlace de enrutador, ya no necesitamos esto. También elimina este contenido de encabezado también. No necesitamos este ejemplo de HelloWorld dentro de nuestro proyecto, pero podemos reutilizar este archivo y convertirlo para que sea el componente header. Llamaremos a esto el encabezado de la aplicación, renombraremos el archivo AppHeader.vue. Entonces dentro de la plantilla podemos colocar este AppHeader exactamente donde queremos que esté esto. Dado que este archivo App.vue es el componente principal de nuestro proyecto, podemos usar esto para darle alguna estructura a esto. Dentro de nuestros proyectos siempre queremos que esta vista de router renderice la página. Pero justo por encima de esto, también podemos colocar en el AppHeader. Esto significa que en cada página nuestro proyecto tendrá el encabezado en la parte superior, seguido del contenido de la página. A continuación, recuerde que hemos cambiado este nombre de archivo para que sea AppHeader.vue. Esto está dentro de la carpeta de componentes. Salta dentro de aquí. Después renombrar el ejemplo de HelloWorld para que sea AppHeader. También podemos eliminar estos iconos. [inaudible] creó el proyecto. No necesitamos esto para nuestro proyecto. Vamos a saltar a este archivo AppHeader.vue. Despejamos todos los contenidos. Actualmente no necesitamos un guión. Vamos a quitar esto. Elimina todos los estilos predeterminados. Tenemos todos los contenidos entre las plantillas. Voy a reemplazar esto con un encabezado HTML. Encabezado de fila coloca esto dentro de un elemento de Nivel 1 con el título de subrayado de vista de qoute de clase. En lugar de simplemente agregar el texto de pizza planet para el título de nuestro sitio, también podemos colocarlo dentro del enlace del enrutador. Este tiene una etiqueta de apertura y cierre. Después dentro de los iconos de Tilder, el texto de pizza planet. Se puede ver que tenemos este subyacente qué datos es un error con este componente. Esto se debe a que necesitamos agregar los dos prop como atributo. Dado que este es el título del sitio, esto solo va a enlazar de nuevo a la página principal, que es slash hacia adelante. El siguiente una sección de navegación con nuestros enlaces de navegación. Estos enlaces de navegación van a enlazar a nuestros puntos de vista. Vamos a lugares justo debajo de nuestro rubro Nivel 1 . Los elementos de navegación. Se trata de una serie de vínculos relativos. La clase de enlace que enlazaremos a nuestro CSS muy pronto. Los dos atributos. Este será el enlace de inicio, por lo que podemos vincular a la barra diagonal hacia adelante y el texto de visualización de inicio. Duplica esto tres veces más. El siguiente es para el menú, que enlaza a /menú. El último es vincular al administrador debajo de la navegación y colocar el encabezado Nivel 2 con el texto del lugar Número 1 para pizza Vamos a guardar y verificar esto. Todo está funcionando. Ahora tenemos el encabezado de la aplicación en la parte superior y luego deberíamos ver el contenido de la vista del enrutador justo debajo. Refrescar. Ahí está nuestro nivel uno rumbo. Tenemos nuestros enlaces, tenemos el encabezado Nivel 2, pero aún tenemos el contenido de esta página al lado. El contenido en el que queremos que se muestre, pero no tenemos lo requerido en el estilo. Esto sucede debido al estilo que se establece en nuestro proyecto VP por defecto. Podríamos eliminar esto y usar el nuestro propio.. En la barra lateral. Salta a la carpeta de activos, varias hojas de estilo dentro de aquí. Vamos a eliminar el base.css. También podemos eliminar el logo, pero no podemos hacer uso de este archivo CSS principal, sino que limpiaremos el contenido y agregaremos el nuestro propio. Seleccione todos los contenidos y elimine este archivo. Se guarda en el navegador. Esta es nuestra sección de cabecera. Ahora en la parte superior. Ahora tengo el contenido de la página justo debajo o también podemos cambiar entre el contenido de esta página con estos enlaces de encabezado. 8. Rutas con nombre: Como acabamos de descubrir dentro del enlace del enrutador, vinculamos a varias páginas con estos dos atributos. Luego dentro de él, se coloca en una URL codificada para enlazarla. Esto funciona completamente bien, pero también tenemos disponible algo llamado rutas de nombre. El nombre de la ruta puede ser un beneficio si usamos el mismo enlace varias veces. Imagina dentro de nuestro proyecto teníamos muchos enlaces a esta página de menú, pero en cambio en el futuro si tal vez quisiéramos cambiar esta URL del menú de slash hacia adelante para que fuera algo hacia adelante slash pizzas, necesitamos cambiar todos estos enlaces manualmente. Alternativamente, podemos enlazar al nombre, que le dimos dentro del archivo del router, así saltando al router en el index.js. Recuerda que cada uno de estos enlaces tiene un nombre específico. Podemos pasar esto como un objeto, en lugar de la diagonal hacia adelante, colocando las llaves para crear un objeto. El nombre propiedad, que es igual a casa. Al igual que cualquier otro atributo de vista Js, si estamos colocando en datos dinámicos dentro de aquí, como nuestro nombre, también necesitamos colocar en los dos puntos, que es v bind para hacer esto dinámico. Esto le dice a un router de vista, que esto no es para ser leído como una cadena de texto, sino que en su lugar echarle un vistazo este nombre que tenemos en nuestro archivo de router. También podemos hacer esto con el resto de los enlaces. Copia esto y podemos colocarlo en la parte superior de nuestro título. El segundo. Esto fue para nuestro MnuLink, que coincide con el nombre dentro de nuestro archivo de enrutador. El número tres. Este fue el AboutLink. Luego, por último, el AdminLink. Guarde esto y diríjase a nuestro proyecto y debería actualizarse automáticamente ya que estamos usando vite para nuestro servidor de desarrollo. Da clic en todos los enlaces y ahora todo sigue funcionando igual que antes, pero ahora lo que estamos usando son estas rutas de nombre. 9. Rutas anidadas: Nuestra configuración actual permite una estructura de enrutador como esta. Tenemos nuestros RouterLinks en el encabezado, y luego reemplazamos el contenido de estas vistas donde lo queríamos usando el RouterView. Esto lleva a una estructura de URL bastante simple. Tendríamos nuestra URL principal y cada vista agregaría al final el nombre de admin, menu, o sobre, por ejemplo. Pero a veces, nuestra estructura puede necesitar ir aún más profunda. Una de estas vistas también puede necesitar enlaces y un lugar para mostrar el contenido. Un ejemplo de esto está en nuestra página de proyectos Acerca de Nosotros. A la izquierda está la vista Acerca de nosotros, y podemos colocar en cualquier contenido que queramos. Además, también podemos proporcionar enlaces adicionales como vemos aquí con el historial, entrega y las ubicaciones. la derecha, tenemos la estructura deseada que sería la vista Acerca de Nosotros y luego los enlaces anidados de historia, entrega y ubicaciones siguientes. Para estructurar esto, nuevamente necesitamos hacer uso del enrutador view usando los routerLinks y el routerView para colocar el contenido en la página Acerca de nosotros exactamente donde queremos que esté. Vamos a adentrarnos en el proyecto y podemos comenzar a configurar las cosas. Estos historial, ubicaciones y secciones de entrega que acabamos de ver serán componentes entre los que podemos cambiar. Vamos a configurarlos en la carpeta de componentes. Ya tenemos esta configuración, así que crea un nuevo archivo, y este va a ser delivery.vue. El siguiente, esto va a ser historia.Vue. Entonces la siguiente son las ubicaciones, todas con la extensión de.vue, y también podemos eliminar los componentes que no necesitas, que es elWelcome.vue, mover este, y también WelcomeItem. Bueno. Ahora vamos a entrar en nuestros tres nuevos componentes, y podemos agregar alguna estructura básica. Necesitamos la plantilla y cada uno de estos tres componentes va a ser bastante simple. Simplemente crearemos un envoltorio. Vamos a añadir un título en la parte superior, una imagen, y también un poco de texto aleatorio. El div, mira la clase C de info_block. Esto se sumará a los tres nuevos componentes, h3. Voy a hacer uso de los iconos de tilde y esto es Delivery Info. Después de esto una fuente de imagen. Vamos a entrar en la carpeta assets donde se ubicará nuestra carpeta de imágenes y luego en la imagen que quieres es el box.jpg. De nuevo, puedes usar tus propias imágenes si lo prefieres. Simplemente reemplace cualquiera de estos que desee. El texto alt, pizza en caja. Después también una clase de info_img. Justo después de la imagen, agregaremos algo de texto en los elementos p, y puedes reemplazarlo con cualquier texto que quieras. Pero por simplicidad, solo voy a agregar algo de texto lorem ipsum aleatorio. Si estás usando Visual Studio, simplemente puedes escribir la palabra lorem y luego pulsar “Enter”. Esto nos dará algún texto ficticio que podemos colocar en nuestro proyecto. Para mantener las cosas consistentes, copiemos todos estos contenidos y luego entremos en la historia. Pega esto y todo lo que tenemos que hacer aquí es cambiar el título de entrega a ser historia. La imagen, esta es la chef image.jpg. El texto alt del chef haciendo pizza. Dale un ahorro a esto. El siguiente fueron localizaciones. Nuevamente pega en los contenidos y cambia el título. La imagen para esta son las tablas. También cambia el texto alt. Se trata de las mesas al aire libre. Bueno. Estos son los tres componentes que usaremos para cambiar entre en la vista sobre y esto es lo que vamos a estar viendo a continuación. 10. La vista sobre y los componentes para niños: Ahora vamos a la página de vista Acerca de donde ahora podemos usar un router para cambiar entre nuestros tres nuevos componentes. También necesitamos algo de estructura y contenido en esta página junto con los enlaces del enrutador y la vista del enrutador. Eliminemos el encabezado Nivel 3 y coloquemos en un div con la clase de aproximadamente. Esta será la envoltura para estos componentes y luego lo colocaremos en varias secciones. La sección superior, si vamos al acerca, ésta se va a colocar en dos zonas. Si pasamos a la vista acerca, ésta se va a colocar en dos secciones. La sección superior será una introducción sobre esta página donde tendremos algunos textos sobre la pizza, la historia, colocaremos en una imagen, y luego debajo de esta agregaremos una segunda sección que contendrá nuestros enlaces de enrutador para cambiar entre nuestros componentes de libertad. La primera sección con la clase de introducción, y anidada dentro tendremos dos cosas. En primer lugar es un div, y el segundo de todo es la imagen. El div va a contener el texto y luego agregaremos la imagen justo debajo, y luego agregaremos una nueva sección abajo en la parte inferior, y esta contendrá nuestros enlaces. Comencemos con este primer div dándole a esto una clase de info envoltorio de texto subrayado es entre cada palabra. Nivel 3 rumbo con el título de pizza de calidad desde hace 30 años. Vamos a ver esto. Ahí está nuestro título, y luego por debajo de nuestro encabezado Nivel 3, colocar en un p elementos con el texto de nada más que los ingredientes de la mejor calidad con un ambiente agradable. Ahí vamos, colocados en una clase para que podamos agregar algo de CSS más tarde de info text. A continuación, la imagen. En primer lugar, una clase nuevamente para el estilo de info_image o img. El origen salta a la carpeta assets donde está contenida nuestra carpeta images, y esta va a la calzone.jpg. El viejo texto calzone imagen de primer plano. Ahí vamos. Esta es la sección superior ahora completa. Por supuesto que pronto vamos a hacer que se vea un poco mejor con un poco de estilo, pero por ahora, saltemos a nuestra segunda sección, que va a ser para nuestros enlaces. Esto necesita una clase de envoltorio de más información, un título de Nivel 3, y esto va a decir haga clic en los enlaces a continuación para obtener más información. Entonces podemos comenzar a construir nuestros enlaces lugares en los elementos HTML nav, lista desordenada. Cada uno de estos enlaces se va a colocar dentro del enlace del enrutador. Cada uno tendrá la clase de link, pero nuestro estilo. Usamos los dos puntos porque vamos a hacer dinámicos los dos atributos colocándolos en un objeto, y este objeto va a apuntar al nombre, que vamos a suponer dar a cada uno de estos componentes. Este primero será el enlace de historia y el texto de visualización de nuestra historia. Duplicemos esto dos veces más. El segundo va a ser para el enlace de entrega. Un texto de entrega. El número 3 va a ser el enlace de ubicaciones. Cualquier texto de ubicaciones. Bueno. Esto es todo lo que necesitamos, ahora tenemos nuestros enlaces gratuitos ubicados debajo de toda nuestra información en la parte superior. Vamos a ver esto. En la página Acerca de. Los contenidos desaparecen, esto puede ser solo porque no tenemos coincidencia para nuestros nombres, porque aún no lo hemos creado. Vamos a saltar a la consola y ya podemos comprobar esto. No tenemos ninguna coincidencia para nuestro nombre así que vayamos al router y hagamos esto ahora. El router index.js. Primero necesitamos importar nuestros tres componentes, que es historia, ubicaciones y entrega. La parte superior, import delivery esta vez en la carpeta de componentes el componente es delivery.vue. Duplica esto dos veces más. El siguiente es para la historia. El último es para ubicaciones. Al igual que con todas nuestras otras rutas, necesitamos agregar estos tres componentes en un camino. Pero recuerda, el camino para estos va a ser anidado dentro del link about así que lo que queremos. De hecho, sólo podemos eliminar el segundo sobre. Tenemos el nombre del componente, eso es así que simplemente podemos eliminar el que se colocó en por defecto. Tenemos este enlace Acerca y lo que queremos es el camino a tratar, y luego hacia adelante slash, queremos las ubicaciones, la entrega, y también la historia. ¿Cómo vamos con esto? Bueno, actualmente la barra diagonal hacia adelante sobre el enlace solo apunta a un solo componente. También podemos anidar dentro múltiples componentes agregando la propiedad children. Para la propiedad children ya que estamos enlazando a múltiples componentes, esto necesita ser colocado dentro de una matriz. Cada matriz contiene un objeto que está estructurado exactamente igual que cada una de estas rutas, por lo que insertaremos la ruta, el nombre y también los componentes. Para que el primero se vincule a la historia colocamos en el camino de historia, el nombre del componente. Este nombre de componente debe coincidir con el exacto que colocamos dentro de nuestros enlaces de enrutador. Tengo enlace de historial, enlace de entrega y enlace de ubicaciones. Este es para el vínculo histórico. Después los componentes de la historia. Separar estos con una coma. Cierra esto. Sepárelos con una coma y colóquelos en su propia línea separada. Duplicemos esto, copiemos y peguemos esto en dos ocasiones más. El segundo es para entrega, enlace a enlace de entrega en el componente de entrega. Siguiente, ubicaciones. Vamos a probar esto. Tenemos que saltar a la página Acerca de nosotros y luego podemos ver exactamente cómo se verá esto. Actualmente estamos en slash forward about, probemos nuestros enlaces en la parte inferior, tenemos historia. Ahora estamos sobre el historial de slash hacia adelante, la entrega, esto se agrega al final y también lo mismo para las ubicaciones. Una cosa que puede estar pensando es actualmente tenemos una diagonal hacia adelante sobre la cual hemos colocado dentro de este camino aquí, luego también tenemos ubicaciones de slash hacia adelante. Primero, cuando configuramos las rutas secundarias, no hemos agregado una diagonal hacia adelante antes de cada una de estas rutas. Bueno, si lo hicimos, se tratará como un camino raíz. Echemos un vistazo a exactamente lo que queremos decir con esto. Si agregamos la barra hacia adelante a cada uno de estos y luego entramos en el Acerca de. Ahora, en lugar de tener una diagonal hacia adelante sobre, si hacemos clic en uno de nuestros enlaces, la URL completa será reemplazada por este historial de entrega o enlace de ubicaciones. Pero como queremos agregarlos al final del enlace Acerca de, podemos simplemente usarlos sin la diagonal hacia adelante. Por último, para ver realmente el contenido a continuación de cada uno de estos componentes, necesitamos seguir adelante y agregar una vista de enrutador. Vaya a la vista Acerca de y luego justo debajo la navegación y colocando la vista del enrutador. Esto y vamos a ver esto. Tenemos la sección superior y luego el área de ubicaciones en la parte inferior, el historial, y también la entrega también. 11. Vistas con nombre: Esta página Acerca de Nosotros tiene tres componentes entre los que podemos cambiar. Como sabemos, podemos hacer clic en el historial, las ubicaciones y también los componentes de entrega. Como también hemos visto anteriormente, podemos hacer uso de componentes y reutilizarlos en cualquier archivo que desee. Por ejemplo, en la app.vue, podemos ir por el camino tradicional importando un componente y luego renderizando esto dentro de la plantilla. Una forma alternativa de renderizar un componente es hacer uso del Enrutador Vue. Hasta ahora hemos usado el RouterViews para mostrar la página como esta que acaba de aquí. También lo mismo en la vista anterior que acabamos de agregar en el video anterior hicimos uso del RouterView. Esto podría mostrar ya sea la página de nivel superior o cualquier componente hijo, tal como lo hacemos aquí con la página acerca de. También podemos insertar tantas más RouterViews como queramos y cada RouterViews adicional actuará como tomacorrientes con varios componentes. Si tuvieras que insertar más RouterViews, también necesitamos darles nombres para que el router sepa qué componentes mostrar en cada uno. Digamos que queríamos mostrar alguna información adicional en la parte inferior de la página de inicio, como los componentes de entrega e historial. Aquí tenemos un desarrollador. La clave aquí es que tenemos dos RouterViews adicionales. Cada uno de estos tiene atributos de nombre que serán importantes en un momento. Observe que el RouterView en la parte superior no tiene nombre. Esta es una ubicación predeterminada. Este valor predeterminado, junto con los dos nombres se establecen dentro de la página de índice de enrutadores. La izquierda muestra lo que actualmente tenemos configurado para la página de inicio utilizando un solo componente. Sin embargo, cuando tenemos múltiples routerViews con nombres, necesitamos modificarlo para usar un objeto components, tal como vemos a la derecha. Primero es la ubicación predeterminada, que es el RouterView sin nombre. Entonces los siguientes dos nombres coincidirán con los dos nombres que le dimos al RouterViews. Acudir al proyecto y ya podemos configurarlo. Salta al componente principal de nivel superior, que es el app.vue y luego justo debajo del routerView lo colocaremos en un div. Este div, el estilo y el diseño tendrán la clase de envoltorio de bloque de información. Entonces dentro de aquí podemos colocar un routerViews adicional para mostrar cualquiera de nuestros componentes. Para este ejemplo, voy a mostrar la entrega y también los componentes del historial dentro de esta página principal. Colocando un RouterView, los atributos de nombre, que va a ser igual a la entrega. Copia y pega esto. El segundo va a ser para la historia. Solo queremos que estos dos componentes se muestren en la página principal. Para ello, pasemos a la página de índice de routers y subamos a la sección home. Actualmente el enrutador doméstico solo muestra el componente único de la vista doméstica. Pero para mostrar múltiples componentes, podemos cambiar de componente para tener una s al final. Quitar esto, pasar en un objeto. Así como hemos visto con las diapositivas, necesitamos agregar la vista predeterminada, que es la que se muestra dentro de la vista del enrutador sin nombre. Esta es la vista de casa, el nombre de la entrega. Esto mostrará los componentes de entrega y el siguiente es para historia. Solo para recapitular, tenemos el componente predeterminado, que es la vista de inicio dentro de la aplicación. Esto se mostrará en la vista del enrutador, que no tiene nombre. A continuación, tenemos los componentes de entrega e historial, que coincidirán con el nombre de nuestras dos vistas adicionales de enrutador. Ahora, view router sabe qué componentes mostrar en cada ubicación. Ya tenemos estos dos componentes de entrega en historia importados en la parte superior por lo que a estas alturas ya debería estar bien para ir. Guarde este archivo, a la página de inicio. Desde lo más alto tenemos este nivel 3 rumbo de casa, que podemos ver dentro de nuestra vista. Lo que tenemos aquí es este título y luego a continuación tenemos nuestros componentes de entrega y el historial. Solo para confirmar estos solo se muestran en la página de inicio, podemos entrar en los enlaces adicionales y no deberíamos ver estos componentes mostrados. Para terminar las cosas, volvamos a nuestra app.vue y agreguemos un poco de estilo para que estos aparezcan uno al lado del otro en la vista más grande y luego apilados verticalmente en la pantalla más pequeña. App.vue. Tenemos esta clase de envoltorio de bloques de información. Vamos a copiar esto a la sección de estilo. El tipo de pantalla de flex. Comenzaremos con la vista de pantalla pequeña, lo que significa que necesitamos cambiar la dirección de flexión para ser columna. Esto mantendrá nuestro contenido apilado verticalmente en la pantalla más pequeña. Para que este cambio esté uno al lado del otro, necesitamos cambiar la dirección del flex para ser fila en la pantalla más grande. Podemos hacer esto agregando una consulta de medios. De hecho, también podemos eliminar todo el resto del estilo. No necesito nada de esto. Configura todas las consultas de medios con nuestros medios. Queremos que esto apunte a pantallas con el ancho mínimo de 900 píxeles. Tomemos nuestro envoltorio de bloque de información. Modificaremos la dirección del flex para que sea igual a fila. En las pantallas más grandes de 900, estas en fila y luego esta cae sobre la pantalla más pequeña. Esta es una forma alternativa de usar componentes en lugar de la forma tradicional de importar un componente a otro archivo para mostrarlo. También podemos permitir que el enrutador Vue los coloque en una vista de enrutador. 12. Proyecto UI- Sección Intro: Esta nueva sección se trata de introducir contenido en nuestra aplicación. Crearemos toda la estructura que necesitamos creando varias páginas y componentes. Más adelante, en las próximas secciones, las haremos más dinámicas insertando diversas piezas de información de una base de datos, como nuestros pedidos, nuestros usuarios y nuestras pizzas. Pero a continuación, comenzaremos por crear los componentes del menú. 13. La interfaz de menú: La página de vista de menú, que ahora vamos a crear se dividirá en dos secciones. A la izquierda, vamos a incluir el menú, que incluirá todas las pizzas en una lista. Luego, en la próxima sección, crearemos la sección de canasta a la derecha, que enumerará todos los contenidos que el usuario agrega a la canasta. Saltemos a nuestros componentes de vista de menú y comencemos a trabajar en esto En las vistas en la vista de menú. Vamos a mover el rumbo de Nivel 3 por ahora y luego crear un div, que va a ser un wrapper para nuestras dos secciones. Esta es la clase de envoltorio de subrayado de menú. Después dos divs más, que se van a anidar en su interior. El primero va a ser para los contenidos del lado izquierdo, que será nuestro menú. Le dará a esto la clase de menú, para luego crear un segundo div, que va a ser para nuestra canasta. Danos la clase de canasta. Luego salta a la sección del menú y coloca en un encabezado de Nivel 3. Hacer uso de las utilas cualquier texto de auténtica pizza hecha a mano. Para nuestro segundo div, que es la canasta. Nuevamente, un Nivel 3 encabezando las utilas. Este es para la canasta. Como se mencionó anteriormente, por ahora, sólo vamos a trabajar en esta sección de menú, que va a ser una tabla HTML. Esta mesa sólo contendrá una sola pizza por ahora. Pero volveremos a esto cuando empecemos a trabajar con la base de datos de firebase para que podamos recorrer todas las pizzas que están almacenadas y luego mostrarlas en esta tabla. Por ahora, configuraremos nuestra plantilla de cómo va a verse esto dentro del cuerpo de la mesa. Luego en el elemento TR para nuestra primera fila de mesa. Todo nuestro contenido de pizza irá dentro de esta fila de una sola tabla. Las celdas ingresan algunos datos de tabla. Esto va a ser por el nombre de la pizza. El nombre de la pizza colocará dentro de las etiquetas fuertes y se colocará en cualquier nombre de pizza, como Margarita. Debajo de esta primera fila de tabla, agregaremos en una segunda fila. Este contendrá la descripción dentro de los datos de la tabla. Las pequeñas etiquetas y la descripción de una deliciosa pizza de pasta de tomate cubierta con mozzarella. Desplázate hacia abajo y solo sopla esta fila de tabla agregará una tercera fila. Esta va a ser para las opciones disponibles. Para cada pizza, vamos a crear dos tamaños diferentes, que serán uno de nueve pulgadas y otro de 12 pulgadas. Más adelante durante esta clase, recorreremos esto y haremos esto tanto para la pizza de 12 como para la de nueve pulgadas pero por ahora, ya que solo estamos creando nuestra estructura y agregando algunos datos de muestra, solo colocaré en una sola talla, que será para la de nueve pulgadas. A esto le seguirá el precio. Entonces la tercera sección será un botón que se utilizará para agregar la pizza a la canasta. Colocar en un botón HTML dentro de aquí. El tipo de botón. Entonces para salir símbolo más se hará uso de una entidad HTML, que es el código de los ampersands, el hash 43, y un punto y coma. El navegador vamos a ver cómo se ve esto. Tenemos nuestra primera fila, que es el título, la segunda fila, que es una descripción y la tercera sección va a ser nuestra opción. Como se mencionó anteriormente, recorreremos esta tercera sección, que nos dará nuestras diversas opciones. Esta es nuestra mesa para nuestra pizza ahora configurada y luego próximo video pasaremos a la siguiente sección, que es la canasta. 14. La interfaz de usuario: Siguiendo el video anterior, donde agregamos la sección de menú de la izquierda, ahora vamos a bajar al área de canastas. Esta canasta también será una tabla en la que se muestran las pizzas que el usuario seleccione haciendo clic en el botón Agregar justo aquí. Seguido de un pedido, sección total y un botón para después seguir adelante y hacer el pedido. En el futuro, este botón de pedido se vinculará a nuestro JavaScript para luego empujar este pedido a nuestra base de datos. Para la tabla, las secciones contendrán una sola fila. Esta fila tendrá la cantidad y un botón ambos lados para aumentar o disminuir la cantidad. Tendrás el nombre de la pizza seleccionada y también el precio también. Debajo de nuestro nivel 3 rumbo a las canastas, crea un div. Este div contendrá la estructura para todas las canastas, que será una mesa en la parte superior, luego el texto, que va a ser el total del pedido. Pero ahora solo coloca en cualquier valor que quieras. Esto se actualizará y calculará con JavaScript. A continuación, un botón que posteriormente se encargará de realizar el pedido. Algún texto está bien por ahora. Veamos cómo se ve esto. Ahí está uno de nuestros contenidos. Ahora podemos pasar a la sección de mesa. La tabla contendrá una sola fila de tabla. En la primera tabla la celda de datos va a haber dos botones y también la cantidad. Tendremos la cantidad en el centro, y luego un botón de disminución a la izquierda y un botón de aumento a la derecha. El primer botón con la clase de quantity_button, el tipo, que también es botón, y luego la entidad HTML, que son los ampersands, el hash 8722 seguido del punto y coma. Esto nos dará el símbolo negativo y luego agregaremos la cantidad y luego a la derecha un botón con el símbolo más. Para la cantidad que se sentará en el medio, colocar en cualquier cantidad por ahora. Copia nuestro botón y pega esto en la parte inferior y simplemente cambia el número de código para que sea 43. Las fechas en estos botones se utilizarán para aumentar y disminuir este valor. Antes de agregar esto a la canasta, también actualizaremos el total del pedido medida que cambiemos las cosas también. Ese es nuestro primer dato de tabla. El segundo va a ser para el nombre de la pizza y también el tamaño de la opción y el tercero. Este es el precio de la pizza. Guardar y otra vez en el navegador. Esta es toda la información que ahora necesitamos para la canasta y con todo este contenido ahora en su lugar, a continuación veremos agregar un poco de estilo para que se vea un poco mejor y también mejorar el diseño. 15. Fuentes y estilos base: Dentro de nuestro proyecto, tenemos este archivo main.js. Este es el archivo que se encarga de crear nuestra aplicación. Importamos esto de la biblioteca vue. También importamos los componentes principales de la aplicación, que es este que acaba de llegar. Este es el componente principal de entrada y todo lo demás va a ser anidado en su interior. Pasamos este archivo para crear app, y luego montamos la aplicación al DOM con el id de app. esto, también incluye una importación en la parte superior con un archivo main.css, que se encuentra dentro de esta carpeta de activos. La forma en que estructuramos nuestro estilo depende completamente de nosotros cuando se trata de una aplicación vue. Pero, voy a estar usando esto como una especie de archivo de estilo general que contiene estilos base como fuentes y reinicios. Todavía podemos agregar componentes específicos o estilo de página en componentes individuales de archivos vue. Primero, sin embargo, tenemos que elegir nuestras fuentes, que vamos a usar para el proyecto. Para ello, voy a hacer uso de fuentes de Google. Así que dirígete a fonts.google.com. Voy a hacer uso de dos fuentes separadas. Uno de ellos va a ser para nuestros rubros y título, y el otro para el texto general. Así que haz clic en Buscar. El primero se llama guión de Marck y este es M-A-R-C-K, y este es el de nuestros rubros y título. Entonces selecciona esto. Desplácese hacia abajo. Éste sólo tiene los textos regulares lo cual está bien. Haga clic en el icono más para agregar esto a nuestras familias seleccionadas, así como esto. Busquemos nuestro segundo. Volver a la búsqueda. Para el texto general, voy a estar usando Roboto. Este es el que necesitamos aquí. Vamos por una selección de fuentes. Entonces 300, que es un texto ligero, el 400, que es de peso regular, y también un 500. Agregue los tres a la familia. Haga clic en estas familias seleccionadas y tenemos la información que necesitamos para importar a nuestro proyecto. Entonces tenemos un enlace que podemos usar o podemos usar la sintaxis import. Para importar esto, pasemos a la carpeta Activos y al main.css. Esto actualmente está vacío. Podemos agregar esta regla de importación. Así que copia todo dentro de las etiquetas de estilo. Pega esto en. Como hemos visto antes en el archivo principal dot js, tenemos el id de app, que podemos seleccionar como el wrapper principal para nuestro proyecto. Entonces selecciona esto con el hash. Dentro de aquí, podemos configurar la familia de fuentes para que sea Roboto copiando esta segunda línea justo aquí. Este sería nuestro texto general y lo anularemos con el guión de Marck cuando lo necesitemos. Entra al cuerpo. Solo estamos agregando estilos generales dentro de aquí, ¿recuerdas? Entonces agregaremos algún margen para centrar nuestro proyecto, estableciendo esto como cero en la parte superior e inferior, y también a la izquierda y a la derecha. El texto de la fila de color de RGB, colocando un valor rojo, verde y azul de 76. Justo después del cuerpo, apuntaremos a los encabezamientos h1, h2, h3, h4, h5 y h6. Recuerda, la familia de fuentes que vamos a usar para esta es la otra que obtenemos de las fuentes de Google. Así que copia esta sección, pega. Elimine cualquier margen predeterminado que se aplique a cualquiera de nuestros encabezados con el navegador. Estoy colocando el color, que es un valor RGB de 76,76,76. Entonces esto nos da nuestros estilos generales de rumbo, pero haremos uso del encabezado de nivel tres en múltiples lugares. Entonces lo estaremos usando con encabezados de página y componentes. Entonces estableceremos el tamaño de fuente para que sea un tamaño mayor de 2.2 rems. Además, coloca algún margen en la parte superior e inferior de un rem y cero a la izquierda y a la derecha. A continuación, la lista desordenada, los elementos ul. Restablecer cualquier espacio en el que se aplique por el navegador, lo que el margen predeterminado se puede eliminar a cero, y también el relleno para que se restaure de nuevo a cero también. Los elementos de la lista, y de hecho, también los enlaces también con los elementos a heredarán el color. Esto eliminará ese color púrpura del enlace, que tenemos por defecto dentro del navegador. Además, restablece el texto-decoración para que no sea ninguno, y también el estilo de lista. Esto asegurará que ninguno de nuestros enlaces o ninguno de nuestros elementos de la lista tenga subrayados, y también cualquiera de las viñetas al costado del enlace también. Entonces algunos estilos más generales, saltaremos a nuestros elementos de imagen, y nos aseguraremos de que el ancho máximo de cualquier imagen no supere el 100%. Entonces, al lado de nuestras clases para nuestros enlaces de enrutador, si recuerdas desde el principio, tenemos estos enlaces en la parte superior y ya puedes comenzar a ver nuestro estilo teniendo lugar. Tenemos estos enlaces de menú arriba en la parte superior, que puedes ver si entramos en los componentes y luego en el encabezado de la app. Cada uno de estos enlaces de enrutador tiene esta clase de enlace. Vamos a agarrar esto, un punto ya que es una clase, un margen de un rem para darle a esto algo de espaciado, ahí vamos, y también nos aseguraremos que cada uno de estos cambie color cuando pasemos el cursor sobre ellos. Entonces para hacer esto, apuntaremos a nuestro enlace una vez más. Usaremos el selector de libración, cambiaremos el color del texto para que sea un valor RGB de 161. Entonces el rojo, verde de 132, y 132 también para el azul. Finalmente, para cualquier botón que tenga en nuestro sitio, también estableceremos el estilo predeterminado para cada uno de estos. Entonces el botón, eliminará el fondo, el color predeterminado, configurando este para que sea ninguno. Un borde muy fino de 0.5 píxeles, una línea continua, y el color de esta línea va a ser un valor RGB de 202 para cada uno de estos. Algún radio de frontera de 0.3 rems, algo de relleno para hacer el botón un poco más grande. Entonces medio rem en la parte superior e inferior y un rem a la izquierda y a la derecha. Necesito avisar al usuario que puede hacer clic en estos botones cambiará el cursor para que sea un puntero. Entonces, si pasamos a nuestro proyecto, podemos ver que algunos de estos han entrado en vigencia. Pero recuerda, estos son solo estilos generales para nuestro proyecto, y agregaremos estilos más específicos a cada una de nuestras páginas y componentes individuales. 16. Estilo de menú y cesta: A continuación vamos a dirigirnos al Menú Ver Archivo y agregar cualquier estilo específico a los componentes de esta vista . Abre esto. Después justo debajo de las plantillas, agregaremos el estilo y agregaremos estos atributos de ámbito. Si no has usado antes el atributo scoped, esto significa que todos los estilos solo se aplicarán a estos componentes, es decir, a las plantillas que creamos anteriormente. Para verlas en acción, saltaremos a la sección del menú. Haz esto un poco más pequeño. En la parte superior tenemos un encabezado de nivel 3, que es este que acaba de llegar. Vamos a agarrar esto y establecer el text-align para que esté en el centro. Esto también aplica a nuestra canasta. Tanto esta sección superior como esta sección inferior pronto se aplicarán a la izquierda y a la derecha en la vista más grande. Pero primero comenzaremos con el diseño móvil, que es la pantalla pequeña. Vamos justo debajo de nuestro h3 y digamos el diseño móvil. Para cambiar entre nuestros dos diseños, vamos a hacer uso del flexbox. Si vamos a la parte superior, puedes ver que este div tiene la clase de menu wrapper. Esta será la que se encargue de controlar la dirección de nuestro menú y también de nuestra canasta. Estos dos divs son los elementos hijos de menu wrapper. Si bajamos y seleccionamos esto, podemos hacer uso del flexbox. Envoltura de menú. El display será el flex. Puede ver la dirección de flexión predeterminada al usar los flexboxes en una fila. Estos se colocarán uno al lado del otro en la página. Este es el diseño que desea en la vista más amplia. Pero para la vista más pequeña, necesitamos anular esta para que sea la dirección de flexión de la columna. También, el color. El color de la fuente será un valor RGB de 80, 96 y 112. A continuación tenemos las dos secciones que estaban dentro de las cuales acabamos de mirar, que es la sección de menú arriba en la parte superior y luego la sección de canasta. Cada uno de estos tiene su propia clase correspondiente. Tenemos.menú y también.cesta. Establecimos el fondo para cada una de estas secciones para que sea de color hexadecimal. El que voy a ir por es faf1e2. El radio de borde para cada una de estas secciones, pequeño valor de tres píxeles. La altura, por si acaso no tenemos mucho contenido, nos aseguraremos de que cada una de estas secciones sea un mínimo del 100 por ciento de la altura de la vista. Después un poco de relleno en el interior de estos elementos para darte un poco de espaciado desde el borde de la pantalla. Esta es la dirección que tenemos para la vista móvil. Si estiramos esto para que sea un poco más ancho, queremos darle la vuelta a esto para que la dirección de flexión sea una fila. Podemos hacer esto dentro de una media query, donde quiero que la pantalla tenga un ancho mínimo de 900 píxeles. Por favor, surta efecto. Ahora, lo que haremos es agarrar la sección del envoltorio del menú, copiar esto, pegar esto dentro. Ya hemos configurado el tipo de pantalla para que sea flexible. Vamos a quitar esto. Ya he establecido el color. Vamos a quitar esto. Todo lo que tenemos que hacer aquí es establecer la dirección de flexión para que esté en fila. Agrega algo de espacio entre con justificar el contenido. Entonces tenemos que decidir cuánto espacio va a ocupar cada una de estas secciones . La sección de pizza probablemente necesitará un poco más de espacio. Podemos hacer uso de la dirección flex para darnos más espacio que la canasta. Para la vista más grande, vamos a tomar la sección de menú, establecer el valor de flexión en dos. Entonces para nuestra canasta, estableceremos que el valor flex sea uno. Esto significa que esto intentará ocupar el doble del espacio disponible que la sección de canasta. Puedes ver que esto se refleja dentro del navegador. Podemos notar la diferencia entre estas dos secciones. Añadiremos un borde a la derecha de este menú para agregar una línea vertical hacia abajo por el centro. Dentro del menú, establece el borde a la derecha de un píxel, una línea continua y el color RGB de 202 para cada valor. Ahí vamos. Ya casi terminamos para esta sección, pero lo que voy a hacer por estos dos botones aquí es quitar el borde, hacerlos un poco más pequeños. Si subimos a la sección, vemos que cada uno de estos botones tiene la clase de quantity_button. Esto lo podemos hacer en la sección general, justo arriba de la media query. Cantidad_ btn. Retire el borde. Vamos a establecer el relleno para que sea un valor de 0.4 rems. Esto ahora reduce el relleno ahora para ambos botones de cantidad. A continuación, continuaremos con el tema del estilismo. Vamos a añadir un poco de estilo a nuestra sección de encabezado. 17. Peinado de cabecera: Seguramente vamos a pasar a agregar algunos componentes nuevos y también algunos artículos nuevos a nuestro sitio. Pero rápidamente, justo antes de hacer esto vamos a aplicar un poco de estilo en ella a esta sección de encabezado. Abramos la barra lateral, saltemos a nuestros Componentes y luego al AppHeader. El AppHeader necesita la sección de estilo en la parte inferior, y la sección de estilo va a ser alcanzada a estos componentes particulares. Echemos un vistazo a lo que tenemos. Tenemos la clase de título del sitio en la parte superior. Empecemos con esto. Sitio_título. Comience con el tamaño de fuente para el título de nuestro sitio e iremos por 3.6 rems. Hazlo bastante grande. El color de Alice azul. No lo podemos ver demasiado por el momento pero muy pronto vamos a agregar un color de fondo a esta sección de encabezado para que destaque aún más. Añadiremos una transformación para hacer que esta gire a un cierto valor agregando la función rotate. Pasa la cantidad de grados por los que quieres rotar esto, y esto puede ser un número positivo o negativo. Ocho grados. Se puede ver que esto ahora tiene una inclinación y se puede aumentar o disminuir este valor. Para darle algo de espacio desde el contenido de abajo, agregue algo de margen en la parte inferior de los elementos. Vamos por dos rems. Entonces podemos agarrar nuestro encabezado que es el envoltorio para esta sección completa. El encabezado va a hacer uso del CSS Flexbox para diseñar las cosas. Tanto para las vistas de pantalla más pequeñas como para las más grandes, estos contenidos se colocarán verticalmente en la dirección flexible de la columna. Establezca el tipo de visualización. Recuerde que la dirección de flexión predeterminada es la fila que se encuentra de izquierda a derecha en toda la página. Podemos cambiar esto para usar la columna. Para colocar el contenido en el centro, use la propiedad flex de align-items. Podemos ver que el contenido es más o menos contra la parte superior y también la parte inferior de la cabecera. Añadiremos algo de espacio con un valor de relleno de un rem en la parte superior e inferior y cero a la izquierda y a la derecha. Para los enlaces del menú, coincidiremos con el color del azul Alice y luego lo colocaremos en la imagen de fondo. Para la imagen de fondo apuntará a una URL que se almacena dentro de nuestro proyecto. Vamos a la carpeta assets, a las Images, y luego dentro de aquí tenemos una imagen llamada main-bg. Esto es dot dot slash, salta a la carpeta assets, imágenes, fondo principal. También queremos establecer esto para que no se repita. Como hemos agregado un fondo, también queremos agregar a la propiedad height y establecer esto para que sea un valor fijo de 650 píxeles. El tamaño del fondo, configuraremos esto para cubrir. Entonces si echamos un vistazo a esta imagen dentro de la carpeta imagenes, la principal-bg, podemos ver que esta imagen no esta centrada, esta cortada en el lado derecho. Arreglemos esto y volvamos a nuestro CSS. Hacer uso de la propiedad llamada Posición de Fondo. Establecer esto estar en el centro. Esta imagen ahora siempre estará centrada en diferentes tamaños de pantalla. Siguiente pequeña sombra tecnológica a cada uno de estos personajes de un píxel, un píxel, tres píxeles, y el color a aplicar para esta sombra tecnológica va a ser un valor RGB de 20, 20, 20. Lo siguiente que hay que hacer es este nivel a rumbo que es el texto del lugar Número 1 para pizza. Podemos agarrar esto con el selector h2 y agregar algo de espaciado. Una propiedad de margen de dos rems en la parte superior e inferior y cero a la izquierda y a la derecha. Un color de texto de blanco antiguo y el tamaño de fuente de dos rems. Bueno. Este es nuestro estilo ahora completo para el encabezado. Nuestro sitio se ve un poco más agradable. A continuación, vamos a pasar a la página Admin y crear una nueva forma de pizza. 18. Administración: agrega una nueva forma de pizza: Dentro de nuestra vista de administración, muy pronto esto se va a dividir en múltiples áreas. Tiene sentido organizar todas estas áreas en diferentes componentes, y también colocar estos componentes en una carpeta de administración. Vamos a saltar a la barra lateral. En los componentes, y dentro de aquí. Crea una nueva carpeta con este nuevo icono de carpeta llamado admin, y agruparemos todos los componentes relacionados con admin. Dentro de aquí, cree un nuevo archivo. Este va a ser el primer componente para nuestro administrador, que será una forma para crear una nueva pizza. esto lo llamaremos Newpizza.vue. Crear la plantilla que necesitamos para esta sección y el envoltorio de sección. Este tendrá la clase de admin_section. Esto se dividirá para tener una sección de encabezado con un título y también el formulario para agregar nuestra nueva pizza. El encabezado para esta sección, la clase de admin_section_header, h3. Texto de agregar pizza nueva. Antes de ir más lejos con más contenido, vamos a comprobar cómo se ve esto dentro del navegador, pero primero tenemos que importarlo a nuestro administrador. Salta a las vistas y a la vista de administración. En la parte superior, coloque en nuestro script para importar nuestro archivo. Lo que vamos a hacer aquí es agregar un atributo llamado setup. Volveremos a esta configuración muy pronto en este curso, pero por ahora vamos a importar el componente que creamos, que se va a llamar pizza nueva. Voy a importar esto del directorio que es @ para llevarnos a la ruta, la carpeta de componentes, admin, y el nombre de archivo de pizza nueva. Tenemos nivel tres rumbo por ahora podemos importar nuestros componentes, y colocarlo a continuación. Al instante, en cuanto guardemos, veremos que esto se agrega a la sección de administración, así que entra en el enlace de administración y este es el título que agregamos en los nuevos componentes de pizza. Continuando con y por debajo del título, cree nuestro formulario. Eliminaremos la acción ya que se alimentó manejando todos los JavaScript necesarios. Cada una de nuestras secciones, como el nombre de la pizza, la descripción y las diversas opciones estaban rodeadas dentro de un estilo div. Este div tendrá la clase de form_group. Entonces esto tendrá una etiqueta y una entrada. La etiqueta, el texto del nombre, la entrada. El primero para el nombre de la pizza tendrá el tipo de texto y la identificación del nombre que coincidirá con nuestra etiqueta. Vamos a copiar esta sección div. Duplicaremos esto y lo pegaremos abajo. El segundo va a ser para la descripción. Para esta, no necesitamos una entrada, vamos a usar un área de texto, así podríamos tener múltiples líneas de texto o una descripción larga. Vamos a mover todo su contenido dentro de aquí. Limpiemos esto, y agregaremos las filas que necesitamos. Vamos a establecer el valor predeterminado en cinco y también un ID de descripción, que coincidirá con la etiqueta justo arriba. Guarda esto, y ya podemos ver que nuestras entradas están apareciendo ahora en la pantalla. A continuación, vamos a crear dos nuevas secciones, que van a ser para nuestra primera y nuestra segunda opciones de pizza. Esto nos va a dar dos opciones distintas para el tamaño de la pizza. El texto dentro de los elementos P los creará como elementos fuertes para hacerlos más audaces. Opción 1. Entonces podemos continuar con nuestros elementos de forma. Copiaremos el grupo de fuentes de antes, el de arriba, escribiremos esto, y este va a ser para el tamaño. Esto va a estar en pulgadas. La etiqueta de talla uno. El tipo de texto está completamente bien, y también vamos a hacer coincidir su identificación con la etiqueta. Debajo de esto, también necesitamos crear un nuevo grupo de formularios, y este sigue relacionado con la Opción 1, y este es el precio de este tamaño en particular. El texto del precio, la etiqueta para el Precio 1, el ID coincidente. Después duplicaremos cuidadosamente esta sección así el precio, el tamaño, y también el texto. Copia esto. Pegue en él a continuación para crear una segunda sección. Este es para la Opción 2. Cambiemos los nombres de propiedad de cada uno de estos atributos para que sean Tamaño 2. Lo mismo para el precio. Guarde esto, y otra vez en el navegador. Ahora tenemos dos secciones para rellenar los tamaños. La sección final va a ser para un botón para enviar este formulario. Nuevamente, coloca esto dentro de un div con la clase de form group. Esto mantendrá el estilo consistente. Agregar un botón con el texto de agregar. Ahora agregarás nuevo formulario de pizza ahora completo. Volveremos a esto más adelante y mejoraremos el estilo. Pero a continuación pasaremos a otros componentes de administración, que es exhibir las pizzas. 19. Admin: Componente de Pizzas: Así que tenemos el agregar nuevos componentes de pizza dentro del administrador. El siguiente componente de administración que crearemos es un componente de pizzas, que mostrará todas las pizzas disponibles en el menú. Saltaré a la barra lateral y crearé un nuevo archivo Vue.js nuevamente dentro del administrador para mantener esto organizado. Esto será simplemente pizzas.vue. Como siempre, cierra la barra lateral hacia abajo y crea una plantilla para almacenar nuestro código HTML. Una sección, que va a tener la clase de admin_section. También eche un vistazo al nuevo componente de pizza que creamos anteriormente. Esto también coincide con esta misma sección. Así podemos aplicar el mismo estilo CSS. Esto también tendrá un encabezado. Nuevamente, empareja en este encabezado justo aquí con el mismo nombre de clase. Entonces la clase era admin_section_header. Esto nos dará un estilo consistente para todos nuestros bloques de administración, encabezado Nivel 3 con el texto del menú. Entonces esto es todo lo que necesitamos para la sección de encabezado. Vamos a saltar por debajo del encabezado y crear nuestra tabla, que enumerará todas las pizzas disponibles del menú. La sección thead, o el encabezado de la tabla, colocan en una fila, y el elemento th para crear nuestros dos encabezados. Entonces vamos a mantener esto bastante simple. Todo lo que hacemos es agregar un nombre de pizza a la izquierda, y luego a la derecha de la mesa, agregaremos un botón para eliminar esta pizza del menú. Entonces el encabezado de pizza y el segundo va a ser el texto de eliminar del menú. Voy a configurar una función más adelante para hacer esto. Debajo de la cabeza, crea la sección tbody. La primera fila, que se sentará por debajo de nuestros rubros. Entonces, lo primero dentro de aquí es el nombre de la pizza dentro de los elementos de datos de la tabla, y solo agregaremos un texto de muestra dentro de aquí para nuestro nombre de pizza y lo vincularemos a nuestra base de datos más adelante. A continuación, la siguiente celda dentro de los datos de la tabla es un botón que va a quitar la pizza del menú. El botón tiene el tipo de botón y también una clase para nuestro estilo de btn_remove. Después dentro de una entidad HTML, que va a ser la cruz. Se trata del ampersand, la palabra de los tiempos, seguido de un punto y coma. Este es todo el contenido que necesitamos por ahora y más adelante crearemos un bucle for para recorrer todas las pizzas disponibles y duplicar cada una de estas filas. También al igual que con los nuevos componentes de pizza, necesitamos importar esto a la vista de administración, aquí. Duplica esto y esta va a ser para todas las pizzas. Esto está en la misma carpeta de administración. Entonces cambiamos el nombre, y voy a poner esto en la parte inferior del archivo en el navegador. Ahí está nuestra mesa con nuestra sola fila y nuestra pizza individual. A continuación, crearemos los componentes finales de administración para enumerar todos los pedidos de los clientes. 20. Admin: Componente de pedidos: Los componentes finales de administración que necesitamos se utilizarán para enumerar los pedidos actuales. Nuevamente, solo tengo estos componentes dentro de la carpeta admin para mantener esto organizado. Crea un nuevo archivo y éste va a ser el orders.vue. Esto también seguirá un patrón similar a los anteriores donde creamos una plantilla, creamos una sección con la clase de sección admin, creamos un encabezado, y luego una tabla para listar todos los pedidos. Empecemos con la plantilla y la sección en la parte superior. Este es nuestro envoltorio. La sección también necesita tener una clase de encabezado de sección admin. Nuevamente, esto coincide con los componentes de administración anteriores que creamos, igual que el encabezado en la parte superior, la clase, y si pudiera usar el incorrecto en la parte superior. Vamos a copiar esto. Este debe ser encabezado de sección admin y la sección debe ser la clase de sección admin. Bueno. Ahora estamos de vuelta en el camino y podemos crear dentro del encabezado, nuestro encabezado de Nivel 3 con el texto de los pedidos actuales. También al igual que los componentes de la pizza que acabamos de crear, más adelante cuando vinculemos esto a Firebase, toda nuestra información será extraída de nuestra base de datos. Es decir, será dinámico. Por ahora, solo colocaremos algunos datos fictitos y agregaremos cinco pedidos actuales y esto subirá y bajará dependiendo cuántos pedidos tengamos realmente en nuestra base de datos. A continuación, la sección de tabla, la fila de la tabla, las etiquetas th para el encabezado. Los pedidos van a enumerar el artículo, que será el nombre de la pizza. Recuerda que cada pizza tiene dos tamaños diferentes, por lo que también necesitamos enumerar esto. Necesitamos saber la cantidad y también el precio. Añadiremos dentro de los corchetes la palabra de total porque este será el valor total, que será el número de pizzas multiplicado por el precio. Entonces debajo de nuestra primera fila de tabla, agregue en la segunda fila, y por ahora, colocaremos en un orden de muestra. La primera celda dentro del elemento de datos de tabla va a ser para el número de orden. Esta celda también contendrá dos piezas de información. Primero está el número de pedido real, y este subirá dependiendo de cuántos pedidos tengamos, y también agregaremos un botón para eliminar este pedido de la base de datos, que será útil una vez que se complete el pedido. Dentro de las etiquetas fuertes, agregaremos el número de pedido. Coloquemos en el número 1 por ahora. El botón, la entidad HTML, que será el ampersand y times, seguido de un punto y coma, y esto será un poco cruzado para eliminar esto de nuestra base de datos, la clase para nuestro estilo de btn_remove, y también el tipo de botón. Este número de pedido y este botón Eliminar estarán en su propia fila independiente y luego la tercera fila, que agregaremos justo debajo, va a ser todos los valores debajo de nuestros encabezados. Por lo tanto, el primer dato de tabla que necesitamos es el ítem. Este va a ser el nombre de la pizza, seguido del tamaño, la cantidad. Cualquier valor está bien por ahora dentro de aquí. El último que necesitamos es el precio. Para ver esto, salta a nuestra vista de administración. Ahora podemos importar esto en la parte superior de nuestro archivo. Esta son las órdenes. Voy a colocar esto en la parte inferior de la plantilla. Desplácese hacia abajo. Bueno. Tenemos gran parte de la interfaz de usuario, por lo que la sección de administración ya está en su lugar, y ahora todo está listo para agregar algunos datos dinámicos de nuestra base de datos. Pero lo siguiente lo que vamos a hacer es saltar a otro de nuestros puntos de vista, que es la vista de inicio, y comenzar a agregar nuestro contenido. 21. Vista de casa: A continuación nos pondremos a trabajar en esta vista de casa, que va a ser componentes nuevos, y se va a cambiar con el router de vista. Recuerda, tenemos esta sección de encabezado en la parte superior. Entonces en la parte inferior ya tenemos dos salidas separadas colocadas a través del RouterView. Tenemos las secciones de entrega e historial, y siempre va a estar contenido en la parte inferior de nuestra plantilla. Recuerda justo encima de esto tendremos nuestro RouterView, que va a mostrar cualquier componente dentro de nuestra carpeta views. Tenemos nuestra vista de casa ya configurada. Tenemos una plantilla sencilla con el texto de home. Podemos ver esto justo aquí. Recuerde que nuestros dos componentes en la parte inferior los cuales se colocan con el RouterView, solo van a mostrarse en esta página principal, ya que si entramos en el router y la página de índice, los hemos configurado como los componentes de entrega y el historial y el predeterminado, que será la vista de inicio. Esta será esta sección arriba en la parte superior. Vamos a saltar a la vista de casa ahora mismo. Entonces podemos ponernos a trabajar agregando algo de contenido para nuestro estilo. Podemos configurar la clase de hot, y luego justo debajo de esta, crear una nueva sección div, y esta va a tener la clase de hot_text. Subir, un rumbo de Nivel 3. Esto tendrá el texto de caliente fuera del horno. Ahí vamos. Una sección para esta página de inicio también va a tener algo de texto y también contará con una hot_pizza vegetariana, y también una imagen que tenemos dentro de la carpeta images, que está dentro de los assets. Necesitamos este fire.jpg. Primero el texto debajo del encabezado Nivel 3, agrega un elemento p para nuestro texto. Este tendrá la clase de hot_pizza_name. El nombre de la pizza es vegetariana caliente. Texto pequeño. Este tendrá la clase de hot_pizza_description. Entonces el texto de nuestra firma vegetariana, pero con una patada. Entonces debajo de este texto podemos colocar en un enlace de enrutador, que va a enlazar a nuestro menú. El componente RouterLink, el texto de let's order. Entonces como siempre, con nuestro RouterLink, necesitamos pasar los dos atributos con los dos puntos, ya que esto va a contener un dato dinámico, pasar en nuestros objetos dinámicos donde vincularemos al nombre de MnuLink. Este MnuLink es el mismo que configuramos en el archivo del router, que podemos ver en el router, y luego en el index.js. Estos son los nombres únicos que agregamos a cada uno de estos caminos. Casi ahí. Ahora tenemos esta sección div y luego justo debajo de esta colocaremos en nuestra imagen. Voy a señalar la imagen que acabamos de ver, que estaba en la carpeta assets. Usaremos../para saltar un nivel en nuestro directorio a los activos, imágenes y el fire.jpg. El estilo de clase puede ser hot_img, y luego también el texto alt también. Ahí está todo nuestro contenido en su lugar. Vamos a comprobar que este enlace funciona. Esto salta a nuestra sección de menú, lo cual es bueno. Podemos saltar por debajo nuestra plantilla y agregar la sección de estilo. Esto quiere ser esculpido a este componente. Comenzaremos con la sección principal con la clase de hot, y esta es la envoltura para esta sección completa. Esto será responsable de cambiar el diseño en la vista de pantalla pequeña y grande. Para ello, haremos uso del tipo de display de flex. Como comenzaremos con la primera vista móvil, podemos reducir el navegador, y luego cambia para ser una dirección de columna en la pantalla más pequeña. Flex-direction es igual a la columna. Esto colocará nuestro contenido verticalmente. Luego dentro de una consulta de medios en la pantalla más grande, cambiaremos esto para hacer uso de la fila. Esto lo haremos ahora con @media, donde apuntaremos al ancho mínimo de pantalla de 900 píxeles. Nuevamente, agarraremos la clase de hot y cambiaremos la dirección flexible para que sea igual a la fila. La pequeña pantalla, lo hace más grande, y ahora aparecen dos elementos uno al lado del otro. El primer elemento fue este div, y el segundo es nuestra imagen. Coloquemos esto en el centro con alinear elementos. De hecho, esto solo quiere entrar en la primera sección móvil, así que suministros para la pantalla pequeña. Fuera de la media query, iremos por el hot_image, y también el hot_text. Esta es una clase la colocarán en los puntos. Tenemos la clase de hot_text y también nuestra imagen, que son nuestras dos secciones principales. Esto va a apuntar a nuestras dos áreas de contenido, y las haremos del mismo tamaño configurando el flex para que sea un valor de dos rems. Luego el texto-align del centro. A continuación tenemos el encabezado, y esto no tiene una clase, así que podemos apuntar a un encabezado de Nivel 3, que es un hijo del hot_text. El envoltorio de hot_text seleccionará el h3, que está anidado en su interior, y establecerá el color para que sea un valor hexadecimal de bb2118. Lo que nos da este bonito color rojo, que podemos ver aquí. Entonces el hot_pizza_name, que es el hot_pizza vegetariana. Haz esto un poco más grande estableciendo el tamaño de fuente. Intentemos 2.2 rems. Un poco más pequeño también. 1.8. Siguiente para el siguiente fragmento de texto, este tiene la clase de hot_pizza_description. Copia esto. Coloca esto en. El estilo de fuente para ser cursiva, el font-weight para ser un poco más ligero, vamos por 300. Comprobemos esto también en la pantalla más grande. Esto está bien. Por ahora, podemos seguir adelante y hacer algunos ajustes para que se adapten a tu gusto si quieres. Pero a continuación voy a pasar a continuar con el estilismo para este proyecto. En particular, agregaremos algunos estilos a nuestras mesas, y también a nuestras entradas de formulario. 22. Estilo de formulario y tabla: Para redondear esta sección, ahora vamos a saltar al archivo main.CSS, donde podemos empezar a aplicar algunos estilos compartidos entre nuestros formularios y nuestras tablas, y también algunos estilos CSS generales también. A partir de aquí, particularmente dentro del admin, tenemos algunas áreas que incluyen algunas clases compartidas. Por ejemplo, si entramos en los componentes y en la carpeta admin, tenemos esta nueva pizza. Esto tiene el envoltorio de sección de la sección admin, entonces tenemos esta sección de encabezado consistente con la misma clase en los tres de estos componentes. Lo tenemos aquí en la parte superior de los pedidos y también en la parte superior de las pizzas también. También tenemos un formulario aquí al que agregaremos un poco de estilo. Tenemos varias mesas para el menú y los pedidos actuales, y también tenemos una mesa dentro de la vista de menú. Tenemos varios estilos que se comparten entre múltiples componentes. En lugar de colocar en componentes individuales, lo que vamos a hacer es entrar en el archivo main.CSS y agregar el código compartido dentro de ahí. los envoltorios principales y también los formularios y tablas, también tenemos algunos pequeños detalles como el botón de quitar que tenemos en el menú, y también en los pedidos actuales. Le hemos dado a esto una clase de btn_remove. Ahora agregaremos todos estos a nuestra hoja de estilo. Entra en la fuente, en los activos, y tendremos este archivo CSS principal. Ya agregamos algo de contenido dentro de aquí, así que vamos a ir al fondo debajo del botón, y continuaremos desde este botón e iremos justo debajo y agregaremos la clase de btn_remove, que acabamos de buscar antes. Ya que vamos a eliminar algo con esto, probablemente nos gustaría agregar un color rojo. El tono al que voy a ir es un valor rgb de 180 fila, 67 y 67. Puedes ver instantáneamente tan pronto como guardes ambos botones abajo en la parte inferior y ahora cambias de color. También podemos eliminar este borde configurando esto como ninguno, y hacerlo un poco más visible aumentando el tamaño de fuente a 1.2 rems. Esta sección de menú y también los pedidos actuales están contenidos dentro de una tabla HTML. Para el elemento de la tabla principal, agreguemos un poco de estilo. Podemos colocar en un radio fronterizo, solo un radio de borde sutil de 0.3 rems. Veremos esto más claramente cuando agreguemos algunos colores diferentes. También podemos establecer el texto align para que quede a la izquierda. Esto empujará todo el texto a la izquierda de cada una de las celdas individuales. Un ancho del 100 por ciento muestra el ancho completo disponible. Luego bajaremos a las celdas individuales que están contenidas dentro de la th, para el encabezado de nuestra tabla y también td para los datos de nuestra tabla. Al espaciado agregaremos algún relleno o algún espaciado en el interior del elemento de 0.6 rems. A continuación trabajaremos en este formulario para la sección de agregar nueva pizza. Agarra el envoltorio principal del formulario, algún relleno de cero en la parte superior e inferior y 1 rem a la izquierda y a la derecha. También coincidiremos con el radio de borde de la tabla agregando esto también al formulario. Nuevamente, veremos esto más claramente más adelante. Dentro de la nueva pizza, veremos que cada uno de estos elementos de formulario como el nombre y la descripción está envuelto en este div con la clase de form group. Esto es consistente para cada una de estas secciones. Agarra esto. Entonces esto es form_group. Algún espacio de relleno hacia fuera cada uno de estos grupos y agregaremos un rem verticalmente en la parte superior e inferior y cero a la izquierda y a la derecha. Hacer uso de la caja flex con el display de flex. Alinearemos los artículos en el centro. Alinear los elementos al centro como puede ver le dará esta alineación vertical para que el texto permanezca en el medio de cada una de estas secciones. Si no tenemos esto, se puede ver que el texto está alineado a la parte superior de este elemento. Añadiremos un borde al fondo de 0.5 rems para el grosor, una línea continua y el color de la línea será un valor rgb de 202 para cada uno de los colores. Vaya, ahí es un poco demasiado grueso. Esto solo quiere ser de 0.5 píxeles. Después eliminaremos el subrayado de la sección inferior. Nuevamente, toma nuestro form_group, selecciona el último de tipo que es la última ocurrencia, que es nuestro botón, y luego eliminaremos el borde inferior configurando esto en none. A continuación les daremos a estas etiquetas y también a nuestras entradas un tamaño consistente usando la caja flexible. La etiqueta les dará un valor de flexión consistente de 1 para que todos permanezcan iguales. Entonces, como queremos que la entrada sea un poco más grande, podemos apuntar a todas las entradas y también al área de texto y darles un valor flex de 3.Esto significa que todas nuestras entradas en el área de texto intentarán ocupar tres veces el espacio disponible como nuestras etiquetas. Trabajemos ahora con las fronteras para cada uno de nuestros insumos. Justo por debajo del valor flex de 3, configura el borde. Esto tomará el mismo valor que nuestro fondo fronterizo. Podemos copiar esto, pegar esto en. Esto solo nos da un borde más ligero, más sutil para cada una de nuestras entradas. Algún radio de borde de 0.3 rems, algo de relleno para hacerlos un poco más grandes de 0.6 rems. Por defecto, con entradas de formulario HTML y áreas de texto, no hereda la fuente y el color por defecto así que tenemos que hacer es configurarlos manualmente configurando la familia de fuentes para heredar del padre y también lo mismo para el color. Como hemos visto antes, cada uno de estos componentes admin como la nueva pizza, tiene esta clase de sección admin, y luego tenemos esta cabecera de sección admin. Déjate entrar en nuestro estilo y podemos apuntar a estos. Primero, el envoltorio principal que es la sección admin. Margen de 1 rem y esto espaciará todos nuestros componentes. El color de fondo, que es un valor hexadecimal de faf1e2, y también finalmente para esta sección un radio de borde de 0.3 rems. A continuación, la sección de encabezado para cada uno de estos componentes y recuerde que estos tienen la clase de admin_section_header. Establezca el tipo de pantalla para que sea flexible. Dale un ahorro a esto. Este se ve bien y al igual que este, vamos a tener un pequeño problema pero Agregar nueva pizza. Esto no debería estar uno al lado del otro. Tenemos pizza nueva, tenemos el envoltorio, tenemos el encabezado, el formulario. Y de hecho solo necesitamos asegurarnos de que este encabezado esté cerrado así que corta el cierre de una etiqueta para el encabezado y pega esto justo después de nuestro h3. Eso ahora se ve mejor y esto ahora nos mantiene más consistentes con el resto de estas secciones. De vuelta al estilismo. Y tal vez se esté preguntando por qué exactamente hemos configurado la caja flexible cuando solo tenemos un solo elemento dentro de aquí. Bueno, esto es porque más adelante también vamos a agregar un pequeño icono sobre la derecha para doblar cada una de estas secciones fuera de vista si no lo necesitamos. Por lo tanto, como vamos a tener múltiples secciones, podemos agregar contenido de justificación para agregar espacio entre cada una de estas. Además, para mantenerlos alineados verticalmente, alinee los elementos en el centro. Después, por último, algún relleno de 1 rem que jugará en todos los lados de este título. Estamos llegando a algún lado ahora con el estilo. Esto también debería aplicarse a nuestra sección de menú. Luego, la sección final a la que agregaremos algo de estilo en este video dentro de la sección de inicio es cada uno de estos bloques de Información hasta la parte inferior. Estos tienen la clase de info_block, que puedes ver si entramos en los componentes principales, que es el App.vue. Esto está renderizando nuestra entrega y nuestros componentes históricos, así que salta a la entrega. Esto tiene la clase de bloque de información al igual que el componente de historial. Volver a nuestro info_block de estilo. El tipo de visualización de flex, la dirección flex de la columna, alinea elementos en el centro, agrega algo de relleno a cada uno de un rem, y también un color de fondo diferente para cada uno de nuestros bloques y el valor hexadecimal de faf1e2. Guardemos esto y veamos cómo se ve esto. Al navegador, podemos ver en la vista más pequeña estos se apilan verticalmente uno encima del otro. Los estiraremos más anchos. Los dos componentes están uno al lado del otro y tenemos esta dirección de flexión de columna para cada uno. Tenemos el contenido alineado en el centro, un poco de relleno y el color de fondo. Todavía hay algún otro estilo para aplicar a los componentes individuales pero agregaremos esto a medida que avanzamos por el curso. Pero ahora tenemos mucho contenido en su lugar. En la siguiente sección, agregaremos algo de JavaScript y echaremos un vistazo al uso de la API de composición VueJS. 23. Opciones O Composición?: La API de Opciones es algo con lo que puede estar familiarizado si ha construido con Vue.js en el pasado, en Vue Versión 1 o Vue Versión 2. La buena noticia está en Vue Versión 3, la API de Opciones todavía está aquí para quedarse. Pero alternativamente, tenemos un enfoque diferente que también podemos usar, que se llama la API de composición. La API de Opciones es algo con lo que puede estar familiarizado si ha construido con Vue Versión 1 o 2 en el pasado. Es una forma tradicional de construir aplicaciones Vue.js. La buena noticia está en Vue 3, no se ha ido a ningún lado. La API de Opciones se ve así. Dentro del script y export default, teníamos varias secciones como una sección de datos. Esto contenía cualquier dato de componente o estado, que se puede considerar como variables. También hay métodos. Aquí es donde podemos agregar nuestras funciones JavaScript y podemos llamarlas como las necesitemos. De las secciones que no se muestran aquí incluyen ganchos de ciclo de vida calculados, relojes y accesorios. Nuevamente, todos siguen siendo válidos para usar en Vue 3. No obstante, para este proyecto, voy a estar usando la API de composición de Vue 3. La API de composición nos permite escribir código más como JavaScript normal. Esto es como una variable regular de JavaScript, un tiempo de espera y también una función. Esto ahora se puede escribir dentro de las aplicaciones Vue.js, reemplace esto al igual que la API de opciones dentro de un valor predeterminado de exportación y luego en una función de configuración, que se resalta aquí. Cosas aquí como variables y funciones se pueden poner a disposición de la plantilla devolviéndolas abajo en la parte inferior. También vale la pena señalar que podemos usar la función de configuración junto con la API de Opciones existente. Aquí tendremos la sección de datos aprobada, pero también se puede agregar cualquier otra sección de la API de Opciones. Eso también es mucho más, como podemos organizar el código en archivos separados, y reutilizar la ruta donde sea necesario, y muchas otras cosas que usaremos según las necesitemos. Junto a JavaScript regular, también podemos hacer uso de la reactividad de Vue. Aquí importamos una ref del paquete Vue y envolvemos el valor de todas las variables con él. utiliza una ref para convertir el contenido en un objeto reactivo. decir, cualquier parte de nuestra aplicación que se base en ella cambiará si los datos internos cambian. Básicamente significa que ningún componente se mantiene actualizado con ningún cambio de datos. También volveremos a éste muy pronto. Junto con ref, también podemos importar desde el paquete Vue cosas como propiedades de computadora y también relojes, que están disponibles con la API de Opciones. Finalmente, también tenemos una forma más corta de escribir código de composición, que es la configuración del script. la izquierda está el ejemplo similar al anterior, donde tenemos una sección de configuración y devolvemos cualquier Vue que queramos usar en la plantilla o HTML. Entonces a la derecha es exactamente lo mismo usando la configuración de scripts. Agrega un atributo de configuración a nuestras etiquetas de script para acortar el código. Además, fíjate aquí que no necesitamos la sección de devoluciones porque todos los datos que queremos usar en la plantilla están disponibles automáticamente. La configuración del script será el enfoque que usemos en este proyecto de clase ya que es más limpio, más corto y además tiene un mejor rendimiento internamente. 24. El objeto y la vinculación de datos: Ahora vamos a entrar en el Newpizza.viewfile. Podemos comenzar a agregar algunos JavaScripts haciendo uso de la configuración de scripts que acabamos de ver. Podemos agregar un nuevoObjetos de pizza, que serán la estructura para todas nuestras pizzas en nuestra aplicación. Justo encima de la plantilla agregue en el lugar de etiquetas de script en los atributos de configuración. Entonces como acabamos de ver, necesitamos importar nuestra ref, e importamos esto desde el paquete view, que está en los módulos de nodo. Entonces podremos crear nuestros nuevosobjetos Pizza, los cuales se envuelven en esta ref. Esta ref va a crear un objeto reactivo que podamos usar a lo largo de nuestra aplicación y el estado se mantenga actualizado. Comencemos esto dentro de una constante o una variable llamada NewPizza, configura nuestra ref como el envoltorio. Entonces dentro podemos pasar en cualquier tipo de datos que queramos. Esto podría ser una cadena, podría ser una matriz. Pero para nuestro caso de uso, necesitamos crear un objeto que tenga todas las propiedades de Pizza. Estas propiedades consisten en el nombre Pizza, podemos decir Margherita. Pero solo por esto, voy a poner en Eg. La razón de esto es que este va a ser el estado inicial de nuestra forma. Voy a entrar en nuestro administrador, vamos a echar un vistazo y vemos este nombre. Esto va a estar vinculado a nuestro objeto. La propiedad name aquí usando V-model se vinculará a nuestro nombre. También vincularemos la descripción a la siguiente propiedad. Cuando registremos por primera vez este formulario, el texto dentro de aquí reflejará lo que vemos justo aquí. Esto solo le da al usuario un prompt exactamente lo que necesita escribir para crear nuestro NewPizza. A continuación, una descripción. Nuevamente, daremos un ejemplo de una deliciosa pizza a base de tomate cubierta con mozzarella. Separar por coma, entonces podemos agregar nuestras opciones, que va a ser una matriz. Colocar estos en una matriz nos permitirá crear diferentes opciones, como nuestro tamaño. Cada uno va a ser un objeto. Vamos a tener dos objetos, así como esto uno al lado del otro. Cada uno de estos va a tener el tamaño de la propiedad, digamos nueve pulgadas para la primera, y también un precio. Lo mismo para nuestro segundo objeto, pero este va a ser para una pizza de 12 pulgadas y también un precio. Recuerda que todos estos valores son solo valores iniciales. Todos estos valores de objeto pueden ser reemplazados por los valores de esta nueva forma de pizza. Se actualizarán antes de que los agreguemos a la base de datos. Para vincular nuestras entradas de formulario con nuestras propiedades de objeto, vamos a hacer uso del modelo. El modelo nos permite crear algo llamado enlace de datos bidireccional, que como se mencionó, significa que los valores de nuestro objeto se mostrarán dentro de las entradas del formulario. En cualquier entrada de formulario que escribamos, entonces podemos actualizar para anular estas entradas de formulario. Esto se reflejará dentro de nuestro objeto. Para ello, comencemos con el nombre. Bajar a nuestras entradas de formulario, donde escribimos el nombre en. Podemos hacer uso de v-model pasando esto como un atributo. Queremos vincular esto a nuestro objeto, que se llama NewPizza, y podemos acceder a la propiedad name, por lo que NewPizza.name. Vamos a copiar esto. Bajar al área de texto, y podemos vincularlo a la descripción. Después de la descripción, entonces tenemos opciones, y necesitamos vincularlas a cada uno de estos valores de matriz. Recuerde, las matrices comienzan en la posición cero del número de índice. Este será cero, y este será el índice número 1. Bajemos y podemos agregar estas opciones. Tenemos la talla número 1, pega esto en, newpizza.Opciones. Seleccione el primer valor con el número de índice de cero en la propiedad llamada tamaño. Copiemos esto, peguemos esto en el que tenga el ID del precio número 1, los cambios para ser precio. Entonces bajando a nuestra opción 2 en el tamaño, este es el índice número 1. Nuevamente, índice número 1 por el precio y también cambiar la propiedad objeto para que sea precio 2. Ahora bien, si guardamos esto en nuestro formulario, podemos ver todos los datos iniciales dentro de cada uno de estos y se puede ver también tenemos la opción establecida correctamente. Tenemos las nueve pulgadas de tamaño y también las 12 pulgadas también. También vea el enlace de datos bidireccional y verifique que el objeto esté actualizado desde este formulario. Ahora podemos entrar en nuestras plantillas. En cualquier lugar dentro de aquí, podemos generar el valor de NewPizza. Podemos ver esto en la parte superior. Eliminemos cualquier cosa de estas entradas. Esto ya está actualizado. Lo mismo para la descripción que esto funciona. Intentemos actualizar el precio. También nuestra segunda opción está vinculada a. Ahora podemos eliminar esto de manera segura y pasar al siguiente video. Echaremos un vistazo a los refs con más detalle y cómo podemos agregar artículos a la canasta. 25. Ref’s & agrega a la cesta: Anteriormente dentro de este nuevo componente de pizza, vimos brevemente algo llamado ref. Una ref es una envoltura para un valor. En nuestro caso, el valor es la pizza. En el próximo video, también usaremos una referencia como envoltorio o canasta, que un usuario puede agregar pizzas antes de comprar. Lo hace convirtiendo el valor en un objeto reactivo y el beneficio es que cada vez que se actualice este objeto reactivo, también se actualizarán todos los componentes que dependen todos los componentes que dependen de estos datos. Vamos a entrar en la vista de menú para comenzar a trabajar con estos y echar un vistazo a los refs con más detalle. La vista de menú fuera de la plantilla, crea nuestro script con el atributo setup. Crea nuestra importación, tal como vimos anteriormente, donde importaremos la ref desde el paquete Vue.js. También necesitamos crear una constante o una variable para nuestra canasta. Envuelva esto dentro de una balsa para hacer que el contenido reactivo y establezca el valor inicial de una matriz vacía. También necesitamos crear una función que vaya a actualizar la canasta. Llamemos a esto AddToBasket. Como mencionamos anteriormente, cuando hagamos uso de la configuración de script, esto nos permitirá acceder directamente a cualquiera de estas variables o funciones dentro de nuestra plantilla. Bajemos a nuestra plantilla y localicemos nuestro botón Agregar, asegurándonos de que estamos dentro del lado del menú. Podemos enumerar ahora para el clic usando @click y configurarlo para activar nuestra función que se llamaba AddToBasket. Comprueba que esto está funcionando. colocaremos en un registro de consola. Cualquier cadena de texto está bien. Salta a la consola. Haga clic en el botón y nuestro texto ya está actualizado. Justo antes de agregar un poco más de código a nuestra función, rápidamente quiero volver a nuestra ref y ver cómo funciona esto con más detalle. Para esto, voy a crear un objeto simple llamado user con la propiedad name y también una propiedad likes también. Quizás se esté preguntando por qué acabo de escribir un objeto de usuario no relacionado dentro de aquí. Pues bien, los contenidos de este objeto no son importantes. Lo importante a tener en cuenta aquí es que los objetos JavaScript tienen propiedades. En nuestro caso, tenemos la propiedad llamada name y la propiedad llamada likes. Recuerden antes cuando dije cuando hacemos uso de una ref, Vue.js detrás de escena convierte el contenido en su interior en un objeto reactivo. Como acabamos de ver, cualquier tipo de objeto tiene estas propiedades. Dado que nuestra canasta se convierte en un objeto detrás de escena, también se le da una propiedad de valor y esta propiedad de valor es como podemos actualizar o leer el contenido dentro. Vamos a escribir esto rápidamente y te voy a mostrar exactamente a qué nos referimos. Por ahora, solo comentaremos nuestra canasta. Vamos a crear unas canastas sabias, que no va a hacer uso de un ref. Esto sólo va a ser un objeto sencillo. Nuevamente, solo para reforzar esto, detrás de escena nuestra canasta se convierte en un objeto así y luego se le da una propiedad de valor por lo que a la hora de actualizar una ref, igual que nuestra canasta, no solo la actualizamos por el nombre de la variable como basket, también necesitamos actualizar el valor anidado en su interior. Como ejemplo, cuando llamamos a nuestra función AddToBasket, primero accedemos a nuestro nombre de variable o constante, luego al valor dentro. O podríamos usar algo como el método push para empujar un nuevo objeto. El nombre, cualquier contenido está bien, el precio. Todo esto es solo código de ejemplo, no importa tamaño de 12. Como se trata de una canasta, también necesitamos conocer la cantidad también. Para comprobar que esto funciona, comprueba que estamos actualizando el valor interior, podemos bajar a nuestra plantilla y sacar el valor de nuestra canasta. Vamos a guardar esto. A la carta. Podemos ver que tenemos la propiedad de valor que está vacía. Da click en “Plus” y no vemos que esto esté actualizado. No obstante, si actualizamos esto para hacer uso de una ref , descomente esto. Haga clic en el botón. Podemos ver que este objeto ahora es reactivo y cualquier actualización de nuestra canasta ahora se empuja a nuestra plantilla. Un punto clave a tener en cuenta aquí es cuando estamos haciendo uso de la canasta dentro de la plantilla, igual que estamos aquí, no necesitamos acceder a basket.value. Esto se hace automáticamente por nosotros. Sin embargo, como podemos ver dentro de nuestro script, cuando accedemos o actualizamos cualquiera de nuestros refs, necesitamos hacer uso de la propiedad value para actualizar o leer los datos anidados dentro. Por supuesto que no queremos sacar la canasta así. Lo que queremos hacer es bajar a nuestra sección de canasta y sacar el contenido dentro de nuestra tabla sin nuestra fila de mesa. Podemos agregar dentro del cuerpo de la mesa, colocar esto de nuevo dentro y luego podemos hacer un bucle sobre nuestra canasta con un bucle Vue.js V4. Dentro de los corchetes podemos acceder al nombre de la variable del ítem y también al número de índice en cada bucle. Esto está en canasta, y luego Vue.js, cuando el bucle también necesita una clave única. Ahora no tenemos ninguna gran clave única que podamos usar. Pero como medida temporal, podemos pasar en el número de índice. Más adelante, cuando tengamos la pizza almacenada dentro de la base de datos, actualizaremos esta clave para hacer uso del ID único para cada valor. Ahora, cada pizza dentro de la canasta se almacena dentro de la variable item. Podemos actualizar la cantidad, así item.quantity, el nombre de la pizza, este es item.name, el tamaño, item.size, y también el precio abajo en la parte inferior. Si quisiéramos, lo que simplemente podríamos hacer es agregar artículo.precio. Pero como podemos pedir varias pizzas, vamos a multiplicar este precio por la cantidad del artículo para mostrar un total por cada línea. Guardar. Haz un poco más de espacio. Ahora cada vez que agregamos una pizza nueva, la canasta se actualiza y se muestra dentro de nuestra mesa. A continuación, mejoraremos esto haciendo un bucle sobre las pizzas y agregando el nombre exacto de la pizza a la canasta, en lugar de los datos de muestra que tenemos actualmente. 26. Aplastarse de pizzas: Actualmente, como sabemos, aún no tenemos nuestra base de datos establecida para almacenar nuestras pizzas. Por ahora, como medida temporal, crearemos una ref, a la que podremos empujar nuestras pizzas. Esto nos permitirá entonces recorrer estas pizzas y mostrarlas dentro de una mesa. Para ello, entra en el archivo MenuView, y luego arriba en la parte superior crearemos una nueva constante llamada AllPizzas. AllPizzas va a estar rodeado dentro de un ref. Bueno, el valor inicial será una matriz vacía. Luego pasa a los nuevos componentes pizza.view, que se encuentra dentro del admin. Ahorra un poco de tiempo. Lo que vamos a hacer aquí es seleccionar el objeto completo de pizza. Este es el objeto demo justo aquí dentro de la ref. Copia todo, incluyendo las llaves. Estamos copiando esto porque esto nos va a dar la estructura consistente, que necesitamos para agregar nuevas pizzas a la base de datos. De vuelta a la vista del menú y dentro de la antigua matriz de pizzas, péguelas dos veces. Asegúrese de que cada uno esté separado con una coma. Vamos a cambiar esto un poco. Eliminaremos el Eg. Margherita. El segundo Pepperoni, quita el Eg. Diremos cubierto con mozzarella y pepperoni. Solo aumenta el precio para que esto sea un poco diferente. Ahora, esto se puede recorrer en bucle en la tabla del menú. Exhiben cada una de las pizzas. Ahora a la plantilla. Tener este menú y luego la mesa anidada dentro del cuerpo de la mesa. Haremos exactamente lo mismo que hicimos para la canasta donde crearemos un bucle v-for y colocaremos en los datos donde lo necesitemos. Volver a la sección de menú cuerpo de mesa v-for. Dentro de los soportes, podemos seleccionar la pizza y también el número de índice. Esto está en nuestra vieja variedad de pizzas. Entonces colocar en una clave, que va a ser el número de índice por ahora. Al igual que dijimos con la canasta, también volveremos a esto más adelante y haremos uso de la clave única que proporcionará la base de datos. Genial. Ahora, tenemos acceso a todas las pizzas y en lugar de mostrar el nombre de la pizza codificado, abre las llaves dobles y podemos acceder a nuestros objetos, que es pizza.name. La descripción, pizza.description. Digamos esto y otra vez al menú. Ahí están nuestras dos pizzas. Tenemos nuestra Margherita y el pepperoni, que coincide con nuestro ref de nuestra sección de guiones. embargo, todavía no hemos terminado con esta, porque también necesitamos agregar las opciones de pizza. Tenemos que hacer que el tamaño de la pizza y también el precio sean más dinámicos en gran parte de las opciones que tendrán para cada una de estas pizzas. Para ello, nuevamente necesitamos bajar a nuestra mesa. Aquí tenemos esta fila de tabla, que es para cada una de nuestras opciones. Necesitamos crear un bucle adicional dentro de aquí para recorrer nuestras dos opciones, así que v-for. El valor variable de opción y también lo tomaremos en el índice. Tenemos que recorrer nuestro objeto de pizza, que es el del bucle inicial. Tendremos que acceder a nuestras opciones. La clave para esta opción de paso único. Después dentro de los corchetes, podemos seleccionar el primer o el segundo valor con el número de índice. Para el primer bucle, esta seleccionará la primera opción, y el segundo bucle seleccionará la segunda opción. Para el tamaño de la opción, llaves dobles, la opción y la propiedad size incluso en el símbolo de moneda, la opción.precio. Probemos esto en el navegador. Ahora tenemos nuestro bucle creando nuestras dos opciones, y cada una tiene el tamaño único y también el precio. Bueno. Estamos haciendo buenos avances aquí, pero ahora, cuando queremos agregar cada una de estas pizzas a la canasta, también necesitamos pasar esta información de pizza a la función. Este botón que tienes aquí no solo necesitamos llamar a AddToBasket, también necesitamos agregar los corchetes y pasar en la pizza y también la opción hasta la función, donde podemos recibir estos valores, así el ítem y la opción. Ahora, en lugar de tener el nombre como cadena, podemos pasarlo en la variable name de item.name. El precio, que se almacena en la opción, esta es opción.precio. El tamaño, opción.tamaño. Probemos esto. Probemos la Margherita de nueve pulgadas. Esto se ve bien. Un Pepperoni de 12 pulgadas, todo esto parece que está funcionando perfectamente bien. A continuación, nos encargaremos de actualizar la cantidad dentro de esta canasta si se selecciona la misma pizza varias veces. 27. Comprueba si hay artículos de cesta: Por el momento, agregaremos una nueva pizza a nuestra canasta. Todo funciona bien pero empezamos a tener un problema si agregamos el mismo valor varias veces. Por ejemplo, si tratamos de agregar la pizza de nueve pulgadas más de una vez, ya tenemos esto en la parte superior lugar de aumentar la cantidad a ser dos, obtenemos una nueva línea de pedido abajo en la parte inferior. Esto es lo mismo para cualquiera de nuestras pizzas. En cambio, lo que queremos hacer en lugar de agregar una nueva línea de pedido es aumentar la cantidad cada vez. Para ello, antes de empujar nuestra nueva pizza a la canasta, primero tenemos que verificar si la nueva pizza ya existe dentro de esta canasta. Para hacer esto en la parte superior de nuestra función, podemos acceder a nuestra canasta, el valor ya que se trata de una ref, y hacer uso del método de búsqueda de JavaScript. El método find ejecutará una función para cada valor dentro de nuestra canasta. Si hay alguna pizza existente dentro de la canasta, almacenaremos esto dentro de una variable llamada pizza y luego podremos trabajar con cada pizza individualmente. Lo que queremos hacer aquí es que queremos comprobar si tanto el nombre de la pizza como el tamaño de la pizza coinciden. Recuerda que si entramos en nuestro menú como la Margherita, podemos agregar dos tamaños diferentes. Podemos tener dos nombres de pizza separados, pero estos no coinciden. También necesitamos verificar el nombre de la pizza y también el valor de la opción también. El método de búsqueda de JavaScript devolverá el primer valor, en nuestro caso, la pizza, que coincide con una determinada condición. Queremos que se vuelva verdadero si se cumple una determinada condición. En nuestro caso, queremos comprobar si el pizza.name es igual al item.name. Esto es verificar si la pizza que se encuentra actualmente en la canasta, tiene un nombre, que es igual al nombre de la pizza, que estamos tratando de agregar. Debe haber un triple igual y usando el doble ampersand también necesitamos proporcionar una segunda verificación. El segundo cheque es para averiguar si la pizza.size, esta es la pizza otra vez, que se guarda dentro de la canasta. Queremos saber si esto es igual a la opción.tamaño. Nuevamente, este es el tamaño de opción de la pizza que estamos tratando de agregar. Si ambos son un partido, esta afirmación es cierta y este método de hallazgo luego devolverá la pizza, que encontramos en la canasta. Podemos almacenar esto dentro de una constante o existe pizza y antes de ir más lejos, comprobaremos iniciando sesión esto en la consola. Registrar el valor de nuestra pizza constante existe guardar y otra vez en el navegador. Salta a la consola para que no tengamos ningún compinche de pizzas dentro del aquí, además, esto no está definido, valores diferentes también es indefinido. Pero si tratamos de hacer clic en una pizza por segunda vez, nos devuelven en la pizza, que es un partido para la canasta. Vemos que esta es una pizza de nueve pulgadas probemos con la 12, esta también funciona también vamos a probar el pepperoni. La primera vez es indefinida y si ya tenemos esto en la canasta, luego devolverá la pizza que encuentre. Con esta información, lo que podemos hacer ahora es colocar una declaración if y podemos comprobar si nuestra pizza se encuentra con esta constante. Si quiere hacer es acceder a la pizza, seleccionar la propiedad de cantidad, y aumentarla por el valor de una. Además, si esto es cierto, queremos regresar, alterar esta función ya que no queremos agregar una pizza adicional a nuestra canasta. Ahora probemos esto. Dale una recarga a esto. Nuestra primera Margherita nuestra segunda Margherita ahora aumenta la cantidad. Probemos el pepperoni. Dos líneas nuevas y un duplicado y cada vez que hago clic en un duplicado, la cantidad se incrementa por el valor de uno. A continuación, también volveremos a nuestra canasta y nos quedaremos con la cantidad sujeta al cableado nuestros botones de aumento y disminución, junto con una función para sacar una pizza de la canasta también. 28. Quitar y cambiar la cantidad: Como descubrimos en el video anterior, cuando agregamos cualquiera de nuestras pizzas a la canasta, ahora tenemos todas nuestras pizzas mostradas a la derecha. También vemos la cantidad que es el valor por defecto de uno. También tenemos estos botones para aumentar y disminuir la cantidad. Esto es con lo que vamos a trabajar ahora. Dirígete a la vista de menú y salta la sección de plantillas y desplázate hacia abajo hasta el área de la canasta. Dentro de las canastas, tenemos nuestro cuerpo de mesa, que está creando nuestro lazo para todas las pizzas. Aquí, dentro del bucle tenemos acceso al artículo por el que quieres cambiar la cantidad. Entonces aquí tenemos nuestros botones para aumentar y también disminuir los valores. Para el primero, que es la disminución, podemos agregar un oyente de clic, que luego activará una función. Pasaremos este artículo a la función y luego cambiaremos la cantidad. Dentro del botón de abrir, @click, y llamaremos a esta función disminución de la cantidad. Pasa el ítem para que sepamos qué ítem reducir y luego bajamos al segundo botón, que es aumentar. esto le llamaremos IncrementoEquidad. Nuevamente, esto también necesita acceso al ítem que queremos cambiar. Empezaremos con esta función IncrementeQuantity. Me desplazaré hacia arriba. Recuerda, si echamos un vistazo a este método de empuje aquí, podemos ver la estructura de nuestras canastas. Todo lo que tenemos que hacer es aumentar la propiedad de cantidad en el objeto. Crea una función, IncrementeQuantity, toma el ítem que se le pasa, selecciona el ítem. Solo queremos trabajar con el campo de cantidad, e incrementaremos esto por el valor de uno. A continuación, la función para disminuir la cantidad. También toma en el artículo, artículo.cantidad. Deduciré esto por el valor de uno. Esto es lo primero que tenemos que hacer para la función de disminución. Lo segundo es verificar si la cantidad es cero. Si es así, no queremos que se muestre una línea de pedido dentro la canasta con la cantidad de cero. En cambio, queremos sacar esto de la canasta. De esto podemos colocar en una sección F para comprobar si el artículo.cantidad es igual al valor de cero. Si es así, queremos sacar esto de la canasta. Si quisiéramos, podríamos colocarnos en el código dentro de aquí para hacer esto. Pero en cambio voy a subcontratar esto a una función independiente que se va a llamar RemoveFromBasket. También tendremos que tomar en el elemento que queremos eliminar y luego crear este abajo en la parte inferior, la función removeFromBasket, pasar en un el elemento que desea eliminar. Primero, necesitamos acceder a nuestras canastas completas y como se trata de un Ref, accedemos a la propiedad de valor. Entonces podemos usar el método de empalme JavaScript. Splice va a eliminar un artículo de nuestra matriz por primera persona en la posición inicial. Entonces tenemos que agarrar el número de índice de este ítem. Hagamos esto accediendo a la canasta.valor. Esta es la canasta llena. Entonces podemos agarrar el número de índice con indexof. Necesitamos conocer el número de índice de nuestro artículo. Esto es solo JavaScript normal. No tiene nada que ver con Vue js. Encontramos la posición del índice de nuestro ítem particular dentro de esta matriz separada por una coma. Solo queremos eliminar un solo artículo. Ahora, vamos a guardar esto y comprobemos que esto está funcionando. Haga clic en cualquier pizza. Si seguimos aumentándolo el valor también aumentará. Vamos a probar plus. Funciona bien. Negativo, esto bajará. Entonces una vez que lleguemos a cero, este artículo debe ser eliminado. Esta es una buena funcionalidad que se ha creado con funciones bastante pequeñas. A continuación, vamos a quedarnos dentro esta canasta y ponernos a trabajar con la actualización del total del pedido usando propiedades calculadas. 29. Propiedades computadas: Si has usado vista vestido en el pasado y has hecho uso de propiedades calculadas, la buena noticia es que están aquí para quedarse. Siguen siendo totalmente compatibles en view free, tanto al usar la API de composición también la API de opciones. Serán un caso de uso ideal para que calculemos el costo de todas las pizzas dentro de las canastas. En la parte inferior de la canasta, actualmente tenemos este valor codificado, que está disponible dentro de la vista de menú. Desplazémonos hacia abajo y encontremos esto. Esto está cerca de la parte inferior de nuestra plantilla. Podríamos usar funciones regulares para calcular el costo dentro de esta canasta, pero el problema con una función es que solo se ejecutará una vez cada vez que la llamamos. Si en cambio escribimos este cálculo dentro de una propiedad calculada, en cualquier momento los datos dentro de los cambios, en nuestro caso las cestas, su valor será recalculado para nosotros. Para ello, vaya a la parte superior del archivo. Necesitamos importar computado desde el paquete de vista. Computado actúa como envoltorio. Si desglosamos las cosas, primero podemos crear una función anónima para calcular el nivel de nuestras canastas. Abajo en la parte inferior de nuestro guión. Primero crearemos una función que no necesita un nombre en esta etapa. Lo que vamos a hacer es crear una variable llamada costo total que inicialmente estará en cero, y luego podremos recorrer todas las canastas y empujar el campo de cantidad de cada una de nuestras pizzas. Ese es el costo total. Canastas, de nuevo, esto es un let, así que usamos el bucle de valor sobre con para cada uno. Para cada uno, ejecutaremos una función para cada valor dentro las canastas y almacenaremos cada una dentro del artículo. Entonces podemos agarrar nuestra variable vacía llamada costo total. Utilice el operador plus equals para agregar un nuevo valor a nuestro costo total en cada bucle. No solo queremos simplemente agarrar el artículo.precio y empujar esto al total porque a veces podemos tener varias pizzas. Para ello, necesitamos multiplicar el artículo.cantidad por el precio. Podemos acceder a este costo total fuera de la función. Tenemos que devolver esto. Y luego fuera de la función crea una variable o constante para almacenar nuestro valor calculado. A éste le llamaremos el total. Como se mencionó, computado actuará como un envoltorio, por lo que necesitamos colocarlo dentro de nuestra función. Corta esto, pega esto dentro de computado. Ahora, como hemos calculado como envoltorio, cada vez que se actualice la cesta o cualquier otro dato dentro, esta función volverá a ejecutar y se actualizará la variable total. Este total ahora se puede usar dentro de nuestra plantilla. Salta hasta el fondo. Usted agrega el costo total en, agrega un artículo tanto como el precio ya que solo tenemos uno. Incrementar la cantidad. también ahora se duplica ya que dentro de nuestro valor calculado multiplicamos la cantidad del artículo por el precio. Todo esto ahora parece estar funcionando correctamente. Posteriormente mejoraremos esto creando un filtro de moneda reutilizable para asegurarnos de que los números se redondean correctamente. 30. Archivos Composable: En la sección de guiones de nuestro MenuView en el que hemos estado trabajando recientemente, si echamos un vistazo de arriba a abajo, esta sección está empezando a ser bastante grande. Para ayudar con esto, podemos mover los contenidos a archivos separados, podemos usar tantos de estos archivos como queramos, lo que mantendrá las cosas realmente organizadas. Estos son referidos como archivos componibles. Para mantenerlos organizados, vamos a crear una nueva carpeta llamada componibles para mantenerlos adentro. Estos vivirán directamente dentro de la fuente e irán junto a cosas como nuestros activos y nuestros componentes. Da click en la Fuente, una Nueva Carpeta, Nombre De Composables, y si quieres, podemos cambiar el nombre de esta carpeta, no necesita ser componibles, esto es solo una convención de nomenclatura. Otra convención de nomenclatura son los archivos que están dentro. Estos suelen tener el prefijo de uso, pero nuevamente, esto es completamente opcional. Para aquellos no relacionados con nuestro contenido, tendríamos archivos como UseBasket, UsePizza y UseOrders, que son todos archivos JavaScript regulares. Empecemos con un archivo llamado UseBasket. Coloca esto dentro del archivo composables, useBasket, y este tiene la extensión JavaScript. Este archivo va a exportar una función, así que export default, una función llamada useBasket. El contenido dentro de esta función será toda la funcionalidad relacionada con la canasta dentro de nuestro MenuView o cualquier otro archivo para el caso. De vuelta al MenuView, echemos un vistazo a todas las funcionalidades relacionadas con la canasta. Necesitamos la canasta, cortemos esto, peguemos esto dentro de nuestro nuevo archivo. No necesitamos las pizzas, esto va a entrar en un archivo diferente, función addToBasket, podemos tomar esto. También necesitamos el aumentoQuantity, decremento, removeFromBasket, y también el total de la canasta, que es su valor calculado, cortar todo esto y debemos simplemente dejarnos con nuestras pizzas, pegar esto en nuestro archivo componible, asegurándonos de que todo esté envuelto dentro de esta función. Como no estamos haciendo uso de nuestra ref y nuestra sección calculada dentro de aquí, también podemos traer las importaciones o copiar esto. Podemos ver que todavía estamos haciendo uso de nuestra ref dentro de este archivo, pero no pudimos eliminar computado. Luego, importa estos en la parte superior de nuestro archivo, justo fuera de la función. Ahora para hacer uso de cualquier función o cualquiera de estas variables en diferentes archivos, primero necesitamos devolver esto de esta función hacia abajo. Aún dentro de la etiqueta de cierre de nuestra función, crea nuestra sección de devoluciones y esto necesita devolver cualquiera de nuestras funciones o variables que queramos usar en otros archivos. Efectivamente necesitamos todo de aquí, necesitamos la canasta, necesitamos la función llamada addToBasket, necesitamos las dos funciones para aumentar y también disminuir los valores, necesitamos el total. Pero una cosa que en realidad no necesitamos en esta etapa es eliminarla de Basket. Esto se debe a que el único lugar al que se llama está dentro de esta función decreaseQuantity, por lo que no necesitamos llamar a esto desde ninguno de los archivos. Esto ahora agrupa todas las funciones y variables relacionadas. Recuerde, exportamos una función aquí llamada useBasket. Para acceder a los contenidos del interior, podemos ir a nuestro MenuView e importarlo a nuestro archivo. Importar, UseBasket. Usando el símbolo add, podemos saltar al nivel superior de nuestra fuente y luego saltar la carpeta componible y luego al nombre de archivo llamado useBasket. A continuación, usando la desestructuración de JavaScript, podemos almacenar todos los valores devueltos de estas funciones en variables. La canasta, las funciones de IncrementoQuantity, DecreaseQuantity, necesitamos addToBasket, y también el total. Estaba seleccionando estos de nuestra función useBasket, que importamos justo arriba. Todas estas constantes ya están disponibles para usar dentro de nuestra plantilla. Todo lo que queda por hacer es ahora guardar esto, volver a nuestro proyecto y comprobar que todo sigue funcionando correctamente. De hecho, justo antes de hacer esto, necesitamos llamar realmente a esta función para que estas estén disponibles. Por encima del proyecto, agréguelas a nuestras canastas, las funciones de aumento y disminución funcionando. Podemos eliminar estos, y también nuestro total está funcionando también. 31. ¿Qué es Firebase?: Entonces, ¿qué es exactamente Firebase y cómo podemos usarlo? Bueno, Firebase es un servicio que brinda Google para sitios web, aplicaciones y también juegos. Muchos de estos necesitan servicios como autenticación, almacenamiento, alojamiento, y también una base de datos para. Firebase proporciona todos estos en una sola aplicación. Voy a hacer uso de algunos de estos dentro de nuestro proyecto. Haremos uso de algunos de estos, incluido el Cloud Firestore, que será nuestra base de datos, que almacena nuestras pizzas y nuestros pedidos. La nube Firestore es una base de datos en tiempo real, es decir, cuando cambia alguno de nuestros datos almacenados, se notifica a la aplicación. Un caso de uso para esto podría ser si el administrador fuera a quitar una pizza, y luego el menú también se actualizaría también. Además, si tienes varias aplicaciones, tal vez tu sitio web y aplicación móvil, la base de datos podría compartirse y mantenerse sincronizada. También podemos establecer reglas y roles por razones de seguridad. Pero más sobre esto más adelante. También proporcionará nuestro sistema de autenticación, proporcionando inicio de sesión, inicio de sesión, flujo de contraseña olvidada, junto con múltiples formas para que los usuarios puedan iniciar sesión. Haremos uso de un correo electrónico y contraseña de inicio de sesión. Porque hay otros servicios disponibles como Google, Twitter, o Facebook login. Además, también hay muchos otros servicios de Firebase que agregarán como análisis, funciones en la nube y almacenamiento. Así que adelante y regístrate para obtener una cuenta si aún no lo has hecho. La cuenta gratuita es todo lo que necesitamos para probar y construir nuestro proyecto, y al siguiente, configuraremos esto y vincularemos a nuestro proyecto. 32. Configuración de Firebase: Una vez que hayas creado una cuenta y hayas iniciado sesión en Firebase, dirígete al área de la consola y verás algo que se ve así. A partir de aquí, podemos crear nuestro nuevo proyecto. Tenemos que darle el nombre a este proyecto, bueno, será Pizza Planets. Puedes llamar al tuyo solo Pizza Planet si quieres, pero esta es la tercera versión de esta clase así que voy a llamar al mío V3. Haga clic en la casilla de verificación y luego continúe. Google Analytics, voy a decir que no para este proyecto. Entonces dale a esto unos momentos para completar. Mi proyecto ya está configurado. Sigamos adelante y entonces esto nos llevará dentro de nuestro proyecto. Desde aquí podemos obtener las instrucciones para agregar Firebase a nuestra app ya sea para iOS, Android. Pero en nuestro caso, haremos clic en el enlace web. Si las cosas se ven un poco diferentes en esta etapa, no se preocupe, estos sitios web tienen la costumbre de cambiar, pero debería ser un proceso de configuración similar. Ahora necesitamos registrar nuestra app dándole un apodo a esta. Simplemente lo voy a mantener de la misma manera Pizza Planets Versión 3. No voy a configurar ningún Firebase Hosting por ahora. Registrar. Entonces una vez que esto haya terminado, nos dará algunas instrucciones para configurarlo. Lo primero que hay que hacer es que podamos usar npm para instalar esto como un paquete de módulos de nodo. Vamos a copiar este enlace, que es npm install Firebase. Cerremos el servidor. Pega esto en. Ahora tenemos algunas razones por las que hoy ha sido muy lento. Podemos simplemente cerrar esto y también reiniciar el servidor con npm run dev. Podemos confirmar que esto ha sido instalado saltando al paquete.json. Tendrán Firebase como nuestra dependencia. Volver al sitio web de Firebase. La siguiente etapa después de la instalación, es copiar algunas instrucciones. Simplemente voy a copiar esto de nuevo y echaremos un vistazo a lo que hace cada etapa en tan solo un momento. Esto nos mantendrá organizados al colocar esto en una nueva carpeta JavaScript, que se encuentra directamente dentro la carpeta fuente, crea un nuevo archivo. El Firebase.js. Pega esto en. Lo primero que hacemos es importar e inicializar las funciones de la App, que es proporcionada por Firebase. Luego tenemos el objeto de configuración de Firebase, que se llena convenientemente con toda la información de nuestra aplicación. Entonces en la parte inferior, hacemos uso de esta inicialización de las funciones de la App justo aquí. Después pasarle los detalles de configuración, lo que luego nos da una referencia a nuestra aplicación. Ahora tenemos la referencia de la app. También necesitamos una referencia a nuestra base de datos Firestore para que podamos agregar y eliminar registros. A partir de esto, también necesitamos importar algo de la biblioteca de Firebase. Arriba en la parte superior, crearemos un segundo importante donde vamos a importar algo del paquete, que es Firebase. Pero esta vez, en lugar de la aplicación de slash hacia adelante, necesitamos importar esto desde la sección de Firestore. La función que desea importar desde esta sección se llama GetFireStore. GetFirestore ahora se puede utilizar para obtener una referencia a nuestra base de datos. Para ello, pasamos en nuestra variable app. Sólo éste de aquí. Esto dentro de una constante llamada Db, que es la abreviatura de base de datos, llamada GetFireStore. Pase en nuestra app. Cuando se trabaja con una tienda de bomberos, agrupa nuestros datos en colecciones. En nuestro caso, tendremos una colección para pizzas, tendremos una colección para pedidos, y también podremos tener una para los usuarios también. Para trabajar con Colecciones será necesario importarlo también desde el paquete Firestore. Volver al principio, obtén paquete Firestore, colección de importación. Podemos usar esto para hacer referencia a nuestras colecciones pasando en dos cosas. El primero, necesitamos pasar la referencia de base de datos que haya almacenado justo arriba dentro de esta constante. Segundo, va a ser el nombre de nuestra colección, que actualmente no hemos creado todavía. A éste se le va a llamar Pizzas. Esto nos da ahora una referencia a una colección única que podemos usar para leer documentos y también agregar nuevos deseos también. Para que esto esté disponible en otros componentes, vamos a exportar esto como una constante. El nombre de la constante será DPPizza&Ref. Vamos a copiar y pegar esto en. Esta segunda referencia va a ser para nuestros pedidos. DBorder&ref. Esto hará uso de la misma base de datos, pero el nombre de colección de los pedidos. Esto nos permitirá importar estas referencias en cualquier otro componente que sean archivos. Podríamos hacer cosas como leer el contenido o agregar nuevos datos. Vamos a ver esto a continuación. El paso final para este video es decirle a Firebase que queremos usar la nube Firestore y también la autenticación. Vamos a entrar en la sección de descripción general del proyecto dentro del navegador. Podemos continuar hasta la consola. No necesitamos más datos de esta vista. Esto nos da la oportunidad de agregar varios productos a Firestore. Podemos hacer cosas como hacer un seguimiento del rendimiento. Podemos agregar análisis para nuestro caso de uso en este momento todo lo que necesitamos es autenticación y la base de datos Firestore en la nube. Empecemos con la autenticación. Empezar. Esto nos va a permitir iniciar sesión con diversos proveedores como Google y Facebook. Pero voy a hacer un sistema de correo electrónico y contraseña. Haga clic en esto habilitará el correo electrónico y la contraseña. Ahora no voy a habilitar el enlace de correo electrónico, solo lo mantendremos como un correo electrónico directo y contraseña. Esto es todo lo que tenemos que hacer por ahora. Esto está actualmente habilitado. Volver a nuestro resumen del proyecto. Se puede ver que tenemos el atajo ahora a la autenticación. A continuación agregaremos el Cloud Firestore, también aparece en la barra lateral. Crea nuestra base de datos. Comenzaremos en modo de prueba y veremos las reglas de seguridad más adelante. Pero por ahora esto nos dará acceso completo para leer y escribir en nuestra base de datos. Esta característica solo se debe permitir para pruebas, y veremos cómo podemos mejorarla más adelante. Haga clic en Siguiente. Elija una ubicación si lo desea y habilite la base de datos. Más adelante habilitaremos algunas reglas de seguridad para mantener nuestra base de datos más segura. Bueno. Ahora tenemos una configuración del modo de autenticación y también tenemos una base de datos vacía. Con esto en su lugar, a continuación, echaremos un vistazo a cómo podemos agregar algunas pizzas nuevas a esta base de datos vacía. 33. Agregación de pizzas a la base de datos: Ahora tenemos el trabajo de configuración de la manera, podemos usar el DBPizzzasRef que previamente configuró junto con nuestra referencia de pedido para trabajar con nuestra base de datos. Comenzaremos agregando las nuevas pizzas a la base de datos en los nuevos componentes de pizza. Para ello, necesitamos importar dos cosas. Así que vamos a saltar al nuevo componente de pizza, que se encuentra en la carpeta Componentes y el Admin. En la parte superior, crea nuestras declaraciones de importación donde importaremos algo llamado AddDoc, que es del nombre del paquete, que es Firebase/Firestore, lo cual tiene sentido porque se trata de una función relacionada con la base de datos. El segundo que necesitamos importar es nuestro DBPizzaRef. La ruta del archivo ha sido convenientemente poblada para nosotros. Ambos serán utilizados dentro de una nueva función para agregar nuestra pizza. Bajemos al fondo de nuestros guiones. Esto va a ser asíncrono, crea la función llamada Add. Como estamos trabajando con una base de datos y podríamos hacer que las cosas salgan mal, necesitamos colocarlo en una sección try and a catch. Catch toma en el error, que podemos almacenarlo en la variable e. Por ahora trabajaremos dentro de la sección try. Desde aquí, podemos llamar a nuestra función, que acabamos de importar llamada AddDoc. Dentro de aquí, tenemos que pasar en dos cosas. La primera es la colección a la que quieres agregar, que se almacena en nuestro DBPizzaRef. Recuerda, esto hará referencia a una colección llamada pizzas. El ítem que quieres agregar a la base de datos va a ser nuestro NewPizza, que es este objeto justo arriba. Ya que esta se almacena en una ref, necesitamos acceder al valor. Ahora podemos llamar a esta función add cuando hacemos clic en el botón Agregar. Recuerda dentro de la aplicación y la sección admin, tenemos este botón Agregar. Salta a la plantilla. Aquí estamos. Escucharemos ahora para un click. El nombre de la función add evitará el comportamiento predeterminado, lo que impedirá que la página se vuelva a cargar y pierda todos los datos o formulario y además, ya que no sabemos cuánto tiempo va a llevar esto, ya que estamos empujando algunos datos a un servidor externo, vamos a agregar wait ya que podemos esperar a que los datos vuelvan antes de pasar a la siguiente etapa. Y podemos usar esto ya que hemos marcado nuestra función como asíncrona. Justo antes de seguir adelante y probar esto y asegurarnos de que esto empuja nuestra NewPizza a la base de datos, agregaremos algún manejo de errores y también un mensaje para mostrar dentro del navegador. Este mensaje se puede almacenar dentro de una constante. Justo encima de nuestro nuevoPizza, const mensaje, guarda esto dentro de un ref, ya que estaremos actualizando esto. Inicializar esto como una cadena vacía, y volver a nuestra función add donde actualizaremos el valor de este mensaje. Como estamos haciendo uso de asincrónico, wait, cualquier código que se ejecute a continuación solo sucederá una vez que obtengamos la información de nuestra base de datos. En esta siguiente línea, sabremos si esto ha sido un éxito o si ha habido un fracaso. Como hemos envuelto esto en una sección try, sabremos que este código solo se ejecutará si hay éxito. Añadiremos el código de falla dentro del área de captura. A continuación, accede a nuestro mensaje.value, que será todo un éxito. Abre los backticks y diremos Pizza, lugar en un nombre de variable. Vamos a colocar en una variable para que podamos acceder a nuestra nueva pizza y el nombre, Newpizza.value.name ha sido agregado. Y luego si ha habido un error, salta al área de captura, accederemos a nuestro mensaje.value y pondremos esto una cadena donde hubo un error, agregue en la pizza. A continuación tenemos que dar salida a este mensaje dentro de nuestra plantilla. Voy a hacer esto en la parte inferior, justo debajo de este botón, dentro de un lapso. Pondré nuestro mensaje y lo último que hay que hacer es probar esto en el navegador. Recuerda que nuestra base de datos está actualmente vacía. Dentro de Admin, seguiremos adelante y agregaremos una Margherita. Vamos a mover el código de ejemplo. Haga clic en el botón Agregar para activar nuestra función. Ahí estamos, las cosas empiezan a quedar bien. Tenemos Pizza Margherita se ha agregado a la base de datos y se actualiza. Esto se ve prometedor. Tenemos nuestra colección de pizzas, que creamos dentro de nuestra configuración de Firebase, que es esta que acaba de estar aquí. Luego hemos hecho uso dentro NewPizza de un método llamado AddDoc, y su método AddDoc luego hizo referencia a nuestra colección, que es Pizzas, y el valor que es NewPizza.value. la base de datos, esta colección de Pizzas tiene una identificación de documento que es única y luego todo el contenido de nuestra nueva pizza. Probemos uno más, Pepperoni. Agrega esto. Ahí vamos. Sabemos documentar referencias y si damos click en esta, esta ahora es el Pepperoni. ¿Por qué no? Añadiremos una vuelta más a nuestra nueva forma de pizza. Vegetariano. Decir mozzarella, pimientos, cebollas, champiñones. Realmente no importa en esta etapa. Actualizaremos el precio, digamos ocho y 14. Agrega esto. Entonces también, hemos logrado nuestro objetivo para este video, que es empujar una nueva pizza a nuestra base de datos. Pero solo cae envolver las cosas si echamos un vistazo, este texto justo aquí, también necesitamos un poco de espacio a la izquierda del mensaje. En el archivo NewPizza, baje al fondo. Agrega una sección de estilo. Le daremos a esto una clase o span, una clase de mensaje, accederemos a esto y estableceremos algún margen a la izquierda, 1rem debería estar bien. Tenemos que añadir una pizza nueva para que podamos ver esto. Iremos por banquete de carne. Cambiar la descripción, pepperoni, salami, carne de res y jamón. Cambiar el precio. Ahí vamos. A continuación veremos cómo podemos recuperar estas pizzas la base de datos y mostrarlas dentro de nuestro menú. 34. Conseguir pizzas: Para recuperar pizzas de nuestra base de datos Firestore, Firebase proporciona una función llamada GetDocs. También como queremos hacer uso de estas pizzas tanto en el menú como en la sección admin, podemos crear un archivo composable compartido para ello. Vamos a crear un nuevo archivo en la barra lateral. En los componibles, crearemos un nuevo archivo llamado usePizzas.js. Esto seguirá un patrón similar al otro componible que creamos. Vamos a exportar una función que podemos importar a cualquier otro archivo. Exportar función predeterminada llamada usePizzas y crear el cuerpo de la función que va a contener todo el código que desea poner a disposición. En el exterior, podemos agregar nuestras importaciones en la parte superior del archivo. Necesitamos importar el ref de vue. La razón por la que necesitamos esto es porque necesitamos una constante que va a contener todas las pizzas a nivel local. Const AllPizzas es igual a un ref y esta será una variedad de todas las pizzas. Ahora para conseguir realmente las pizzas, necesitamos importar algunos artículos de Firebase. El primer paquete que necesitamos es uno mencionamos antes y que es GetDocs. Este es de firebase/firestore. Entonces también necesitamos importar la referencia que creamos en el archivo de Firebase para tener acceso a esta colección de pizzas por lo que necesitamos importar el dbPizzaRef de este archivo de Firebase. Importe el DBPizzaRef desde esta ruta de archivo. Entonces justo debajo donde todas las pizzas son constantes, crearemos una función, que va a ser la encargada recuperar nuestras pizzas de la base de datos. Esta función se marcará como asíncrona ya que tenemos que esperar a que los datos de pizza regresen antes de que podamos usar esta función llamada GetPizzas. Entonces podemos llamar a nuestro método desde arriba el cual acabamos de importar llamado getDocs, pasarlo en nuestra referencia de colección, que es dbPizzaRef. Vamos a almacenar el valor de retorno en una constante llamada docs y también esperaremos que regresen estos datos. Luego ejecuta esta función y realmente obtén la pizza de la base de datos. Tenemos un par de opciones diferentes. Podríamos activar esto manualmente llamando a GetPizzas o podemos activarlo cuando un componente se monta usando el gancho de ciclo de vida OnMounted. Desde el paquete vue, haremos esto con OnMounted. Entonces tan pronto como este código o este componente esté montado en el DOM, se llamará a OnMounted, que luego llamará a nuestra función llamada GetPizzas. Esto evita la necesidad de llamar a esta función manualmente y significa que lo hará automáticamente detrás escena tan pronto como el componente se haya cargado. Si pasamos al proyecto y saltamos a la consola, podemos probarlo haciendo un registro de consola para el valor devuelto dentro de los docs. Actualiza y aún no vemos nada dentro la consola porque este código no se importa actualmente a los componentes. El gancho de ciclo de vida OnMounted no se llama. Entonces hagamos esto pero primero, devolveremos los valores que necesitamos importar. Todo lo que necesitamos actualmente es esta referencia a AllPizzas. Comenzaremos importando esto a nuestro MenuView que está en la sección de vista. Entonces al igual que hicimos con el composable useBasket, primero necesitamos importar esto, así que importaremos usePizzas desde nuestro archivo componible, y luego usando esta estructuración importaremos nuestra referencia AllPizzas desde esta función. Const AllPizzas es igual al valor de retorno de UsePizzas. Ahora hemos visto un error ya que estamos duplicando esta referencia de AllPizzas, estamos importando esto de nuestro componible. También tenemos este código de ejemplo justo aquí. Ya no necesitamos nada de esto. Podemos eliminar esta sección. Siendo este el único código que hace uso de ref, también podemos eliminarlo del script. Si recargamos, todavía no vemos nada registrado en la consola. Esto se debe a que para que esto realmente se monte y llame a nuestra función, necesitamos entrar en el componente de menú. Seleccionamos esto, luego vemos un registro dentro de la consola. Abre este objeto y hay mucha información que se devuelve de la base de datos. Mucha de esta información en realidad no necesitamos en esta etapa, pero una cosa que nos interesa es esta propiedad doc. Abre esto, y en el interior hay una matriz que contiene cada uno de los documentos de pizza que hemos creado. Echemos un vistazo al interior. De nuevo, aquí hay mucha información. Podemos ver el documento ID. Podemos entrar en documentos y datos y desglosar los valores de los datos, incluyendo el nombre, las opciones y la descripción. Lo que podemos hacer ahora es recorrer todos los valores dentro de los docs. Desafortunadamente, no necesitamos desglosar todos estos niveles de nuestro objeto. En cambio, podemos llamar a docs como una función. Esto extraerá todos los campos que necesitamos y los hará accesibles dentro de nuestro script. Salta de nuevo a nuestro componible. Podemos mover el registro, acceder a nuestros documentos devueltos y llamarlo para cada bucle. Para cada uno, ejecutaremos una función para cada uno de nuestros valores. En mi caso, actualmente tengo cuatro pizzas almacenadas. Entonces para filtrar todos estos datos innecesarios, voy a crear un nuevo objeto con una estructura más simple, así que const pizza. Dentro de aquí podemos estructurar este nuevo objeto con solo los datos que necesitamos. Como hemos visto, cada uno de estos tiene una identificación única. Podemos ver esto si cerramos esto abajo, este ID, así que establecemos el ID. Para acceder a la información de pizza en cada bucle, también necesitamos pasar una variable a nuestra función. En el primer bucle, doc será igual a nuestra primera pizza. En el segundo bucle, esta será nuestra segunda pizza, y así sucesivamente. Accedemos a esto y seleccionamos la propiedad de identificación. Entonces necesitamos pasar los datos que habrían visto, que se almacenan dentro de los documentos, .data.value. Ahora necesitamos el acceso a todos estos campos. Como se mencionó, no necesitamos desglosar todos estos campos en su lugar, lo que podemos hacer es acceder a nuestros documentos y llamar a la función de datos. Usando el operador de propagación de JavaScript, también podemos extraer los valores que necesitamos en lugares directamente dentro de nuestro objeto de pizza junto con nuestro ID. Por último, en cada bucle, queremos llevar el valor de esta pizza a nuestra referencia de AllPizzas. Simplemente sopla este objeto, accede a AllPizzas.value, y luego usa el método JavaScript push para empujar cada una de nuestras pizzas. Esto es todo lo que ahora necesitamos. Volver a nuestro archivo de menú. Recuerda que hemos importado todas las pizzas de nuestro componible. Además, este nombre de variable también es el mismo que hemos estado usando anteriormente. Ahora si guardamos esto y recargamos, la tabla ahora está poblada con las pizzas de nuestra base de datos. Otra cosa que podemos hacer ahora ya que tenemos acceso a un ID único para cada una de nuestras pizzas es cambiar la clave única para cada valor dentro de este bucle. En lugar de hacer uso del índice, podemos acceder a nuestra pizza.id Ya no necesitamos este índice, así que solo podemos hacer referencia a nuestra pizza. Lo mismo para las opciones. Las opciones tienen que constar de dos cosas. La primera, nuevamente es la pizza.id y como la pizza tiene dos opciones, también agregaremos esto a nuestra opción.tamaño. Nuevamente, podemos mover el índice y ahí vamos, ya todo está completo. A continuación, continuaremos con un tema similar haciendo uso también de estas pizzas dentro de la sección de administración y también descubriremos cómo podemos eliminar estas pizzas de nuestra base de datos. 35. Listado de pizzas en Admin: Como descubrimos en el video anterior, si entramos en este enlace de administración, también tenemos estos componentes de menú que creamos anteriormente. Como también hicimos con el menú en el video anterior, ahora necesitamos sacar nuestros artículos de pizza de la base de datos y mostrarlos dentro del admin. Además, nos aseguraremos de que esta cruz roja, que hemos enumerado junto a cada una de nuestras pizzas, también elimine este ítem de la base de datos. Vamos a saltar a nuestro uso pizzas.jsfile. Este es el componible que configuramos en el video anterior. Necesitamos importar dos cosas adicionales desde firebase, en particular, el paquete firestore. Lo que necesitamos es algo llamado delete doc, que como suena, va a eliminar un ítem de una colección y también el doc y vamos a usar doc referirnos a cualquier documento en particular que queramos seleccionar. Entonces esto se pasa para eliminar doc para eliminarlo realmente. Vamos a crear una nueva función dentro de este objeto justo debajo de onmontado, esto será asincrónico llamado delete pizza. A esta función delete-pizza también se le va a pasar el ID de llamada. Porque claro, necesitamos saber qué pizza queremos quitar y luego podemos acceder a este doc que acabamos de importar de Firestore. Doc va a tomar en dos cosas. El primero es la base de datos de referencia de colección, que todavía tenemos almacenada dentro de DB pizzas ref y luego necesita tomar en la idea de la pizza real que queremos eliminar. Esto no es realmente responsable eliminar cualquier pizza, todo lo que estamos haciendo aquí es obtener una referencia a documentos en particular. Estrecharemos en esta localidad por colección y luego la estrechamos por la identificación. Entonces podemos usar esta referencia para pasar, para eliminar doc. A pases, podemos almacenar esto dentro de una constante, digamos pizza, y luego pasar esto para eliminar doc. Vamos a esperar esto. Esperaremos a que se complete esta operación. Entonces llamaremos a nuestro método anterior llamar get pizzas. La razón por la que queremos llamar a get pizzas una vez que se complete esto es porque necesitamos actualizar nuestra aplicación. Estamos borrando un artículo, luego llamamos get pizzas, que está justo aquí. Esto entonces va a llamar a todas las pizzas que almacenaste dentro de la base de datos, menos una que hemos eliminado. Esto luego actualizará todas las pizzas, que es nuestro ref aquí en la parte superior. Luego se devuelven todas las pizzas, documento es componible, y esto luego actualizará nuestro menú, que hemos creado a la izquierda aquí, y también actualizará el menú dentro del admin. Para usar esta función, necesitamos devolverla también de nuestra componible delete pizza, luego vamos a de nuestra componible delete pizza, abrir la barra lateral, saltar a los componentes, la sección admin, y dentro de aquí tenemos esta pizzas.vue, que es responsable de esta sección. Pizzeras.vue necesita importar las secciones que necesitamos para colocar una etiqueta de script en la configuración e importar nuestro componible, que era usar pizzas. Use pizzas devolvió ambos valores, los cuales podemos desestructurar y almacenar dentro de constantes por lo que necesitamos todas las pizzas. Eliminar pizza, que podemos recuperar llamando a la función UsePizzas. Abajo a nuestra sección de tabla donde tenemos algunos datos ficticios. Tenemos nuestra margarita en su lugar y ahora podemos usar la sección del cuerpo de la mesa para recorrer todas nuestras pizzas. V para pizza en todas las pizzas, pase en clave y ahora tenemos el ID de pizza único de la base de datos para que podamos acceder a esta. La margarita puede ser reemplazada por el nombre dinámico de pizza así pizza.name. Siendo esta la sección de administración, no necesitamos toda la información adicional como la descripción y los precios, todo lo que necesitamos ver es una referencia a cada pizza. Podemos ver esto ahora por encima de la izquierda. Cada una de estas cruces para eliminar la pizza de la base de datos se almacena dentro de este botón para que podamos agregar un oyente de clic y luego hacer referencia a nuestra función que es eliminar pizza. Esto también necesita pasar la identificación de pizza que queremos eliminar. Ahora podemos acceder a esto con pizza.id Vamos a probar esto. Vamos a quitar el banquete de carne. En cuanto hacemos esto, vemos un pequeño problema. Si echamos un vistazo a las cuatro pizzas originales que teníamos, esto está bien, las cuatro originales de nuestra base de datos pero luego si vamos a nuestro componible, hemos eliminado esto de la base de datos, pero luego hemos llamado a get pizza una vez más, que luego es obtener nuestras pizzas existentes gratuitas de la base de datos y también agregarlas a todas las pizzas. Básicamente, en lugar de reemplazar todas las pizzas, conservamos las existentes y agregamos los tres artículos adicionales. Efectivamente, esto no es algo malo el momento porque podemos ver que los tres artículos adicionales no incluyen el banquete de carne, que hemos eliminado. Eso parece estar funcionando bien. Para solucionar esto, esto es bastante simple, todo lo que tenemos que hacer justo antes de obtener nuestras nuevas pizzas es tomar nuestra referencia de todas las pizzas, su valor y restablecer esto a una matriz vacía antes de obtener nuestros nuevos documentos. Probemos esto. Refresca la página. Aquí están nuestras tres pizzas, quítate cualquiera de estas, y ahora todo esto está funcionando correctamente. En la mejora final que podemos hacer es agregar un mensaje de error si hubo un error o un problema, eliminar en la pizza, o incluso obtener las pizzas de la base de datos. Para ello, podemos crear una nueva referencia de mensaje en el archivo all pizzas. Justo debajo de todas las pizzas creamos una nueva constante para almacenar nuestro mensaje. Esta será una ref y por defecto una cadena vacía. Después dentro de las pizzas get, podemos agregar algún manejo de errores con un try y un área de captura. Coloquemos esto en la parte superior en la sección try y atrapemos. Catch tomará un error. Entonces necesitamos mover todo nuestro código dentro de la sección try. Si localizas el final de esta función, agarra todo hasta todas las pizzas.value. Corta esto dejando solo el try y el área de captura dentro de aquí y luego dentro de la sección try, pega esto de nuevo y este es el código que quieres ejecutar e intenta tener éxito. Pero si hay un error, entonces podemos entrar al área de captura y actualizar nuestro mensaje. El mensaje.value es igual a una cadena y diremos que hubo un error al buscar pizzas. Por favor, vuelva a cargar la página. Al igual que hicimos con las pizzas, también podemos actualizar el mensaje y restablecerlo para que sea una cadena vacía cada vez que ejecutemos esto. El mensaje.value vuelve a una cadena vacía. También lo mismo para nuestra segunda función que es eliminar pizza. El try-block, el bloque catch, que toma el error, recorta el código existente, corta estos y reemplaza coloca esto en el bloque try. Restablecer el mensaje, ha sido una cadena vacía, y luego actualizar el mensaje dentro del bloque catch. Es cadena b, entonces si quisieras, también podrías incluir el mensaje de error, que te devolveremos. Pero por nuestra sencillez, solo voy a crear una cadena que dice que hubo un error al eliminar la pizza. Entonces por favor inténtalo de nuevo. A continuación, para que podamos usar este mensaje dentro de nuestros componentes podemos devolver esto, volver saltar a los componentes pizzas.view, importar esto, y luego justo debajo de la sección de encabezado, crear un nuevo elemento p para mostrar nuestro mensaje dentro de las llaves dobles. Agregar clase para estilo de error. Lo que también hará como medida temporal es agregar también algún texto dentro de aquí. Cualquier texto está bien esto es solo para que podamos agregar un poco de estilo y ver cómo se ve esto sin tener un mensaje de error real. Abajo a la sección de estilo, donde podemos agregar algunos estilos a esta clase de error. En primer lugar, un color que estará en valor RGB de uno a cero para el rojo, 67, y 67, lo que nos dará este color rojo. Un borde de un píxel, una línea sólida redondea las esquinas con algún radio de borde, y luego algo de espaciado dentro y fuera con relleno y margen. Relleno 1rem y también 1rem de margen en el exterior, guardar, probar esto. Así se mostrará nuestro mensaje de error dentro de los componentes pero si fuéramos a eliminar el texto y luego dejar esto como un elemento p vacío puedo ver aquí. Al eliminar este texto de error se seguirá mostrando el borde rojo porque el elemento p siempre está ahí independientemente de si tiene algún mensaje dentro o no. Para eliminar esto, podemos agregar una instrucción v If para mostrar únicamente estos elementos si el mensaje existe. Si tenemos un mensaje y sus elementos se mostrarán, si no, se eliminará del dom y ya no veremos este borde rojo. 36. Creación de pedidos: Para crear un pedido sigue un patrón similar para crear en una nueva pizza. Vamos a entrar en la cesta composable usada, que está dentro de una carpeta componible. Abre esto y primero tenemos que importar dos cosas. Lo primero, necesitamos importar AddDoc desde el paquete Firestore, así que este es de Firebase/Firestore. Después la referencia a la colección de pedidos reales, a la que quieres empujar esto así que vamos a importar esto desde nuestro archivo de Firebase. Lo que tenemos que hacer es importar este DB órdenes ref. Ya tenemos el contenido de la canasta dentro de la matriz de canastas y esto se empuja a cuando agregamos algo de la sección de menú. A la derecha aquí está la canasta. Ahora necesitamos crear una nueva función para agregar colección más antigua dentro de la base de datos. Justo debajo de esta función aquí, vuelta a esta flecha en la parte inferior, realmente no importa. Esto será asíncrono, el nombre de la función de agregar nuevo orden y luego, lo que tenemos que hacer dentro es envolver esto en un bloque try y un catch para que pueda manejar cualquier error, pasar en el error. Lo primero que debemos considerar es que esta canasta arriba en la parte superior , esta actualmente se almacena como una matriz. Pero Firebase requiere un objeto, por lo que podemos usar el operador spread para fusionar los elementos actuales en un objeto. Vamos a entrar en la sección try y reestructuraremos nuestro orden creando un nuevo objeto. La primera propiedad a agregar se va a llamar CreatedAt, y esto hará un seguimiento del orden en el que se realizan nuestros pedidos y por lo tanto, podemos tratarlos o mostrarlos en el orden correcto en el administrador. Pero esto solo creará una nueva fecha de JavaScript, instálelo dentro de la base de datos. Entonces como se mencionó anteriormente, para tomar los contenidos de nuestra matriz, emerger estos en nuestro orden para crear una propiedad de pizza, que a su vez será un objeto donde vamos a fusionar en las propiedades de nuestra canasta y como esta es una referencia, necesitamos acceder al valor justo después del pedido. Aquí es ahora donde vamos a hacer uso del método AddDoc de Firestore para empujar a una colección en particular. Una colección es nuestra referencia de pedidos DB que acabamos de importar. Llame al método AddDoc, que toma en el primer parámetro de referencia de auditoría DB, que es una referencia a nuestra colección más antigua y luego vamos empujar este orden en particular a esta colección. Una vez que esto se haya hecho con éxito, esperaremos que termine esta operación y luego podremos restablecer el valor de nuestra canasta para que sea una matriz vacía. Esto limpiará cualquier pizza de la canasta, para que el usuario pueda comenzar de nuevo. Esto es todo lo que necesitamos ahora para la sección try y mantener al usuario actualizado, crearemos una nueva variable para mantener un mensaje. El mensaje predeterminado va a ser algo así como que tu cesta está vacía, así que podemos ver esto o no tenemos pizzas encima en el lado derecho, así que const el texto de la cesta, envuelve esto en una ref, con el texto de tu cesta está vacío. Este será el valor predeterminado y podemos actualizarlo dependiendo de si el pedido se agregó correctamente o no, bajar a la función. Vamos a entrar en la sección try y en la parte inferior accederemos a la cesta text.value, y actualizaremos esto para que sean nuevas cadenas, algo así como gracias, tu pedido ha sido realizado. la otra sección, y al igual que hemos visto anteriormente, también puedes incorporar el mensaje de error si quieres, pero por simplicidad, solo voy a actualizar el texto de la cesta para que sea una nueva cadena, que será igual a que hubo un error al hacer tu pedido. Voy a decir por favor inténtalo de nuevo. Podemos llamar a esto desde nuestros componentes. Necesitamos devolver nuestra llamada a la función y también necesitamos devolver el texto de la cesta que podamos mostrarlo dentro de los componentes. medida que ordena el texto la cesta y la canasta se muestra dentro de la vista del menú, así que dirígete aquí, y ahora podemos importarlas desde nuestro componible. Aquí ya tenemos una referencia a nuestra cesta de uso composable, por lo que podemos saltar entre corchetes y también importar texto de cesta a lo largo de lado agregar nuevo pedido. Empecemos con agregar nuevo orden, que podemos activar desde nuestro botón. Bajar al div de canasta, y abajo en la parte inferior tenemos este botón de orden de lugar, esto ahora para un click, lo que activará nuestra función. Ahora el paso final es agregar el texto de la cesta y recordar por defecto dice que tu cesta está vacía, así que no queremos mostrar esto si ya son nuestros artículos dentro la canasta y para esta misma renderización condicional nos ayudará. Vamos a saltar hasta la parte superior de la sección de canasta, justo debajo del encabezado. Vamos a crear secciones div que contengan esto y dentro haremos uso de v-if, para agregar nuestro renderizado condicional donde queremos verificar si la canasta, la longitud es mayor que cero, es decir, tenemos algunos artículos dentro de la canasta, así que si esto es cierto cortaremos la sección div de cierre y luego bajaremos hasta el final, justo debajo de nuestros botones hacen orden, cerraremos esto. Ya puedes ver si vas a la sección de canasta, no tenemos ninguno de estos botones ni el total del pedido. Pero todo esto creará un nuevo div, que es la sección v-else y esta sección solo se mostrará dentro del navegador si no hay elementos dentro de la canasta, que es el estado actual. Pero esto colocará dentro de las llaves dobles, hecho pondremos un elemento p para empezar. Voy a poner el texto de la cesta y estamos viendo errores vamos a echar un vistazo lo que es esto. No tenemos v-if adyacente así esta es la sección v-l y esta debería ser la v-if. Solo tenemos esta sección div extra la cual podemos eliminar, asegúrate de que esto sea correcto. Tenemos este div, la etiqueta de apertura, todos los contenidos, la sección de cierre, v-else. También necesitamos mover este div de cierre de antes de esto todo se ve bien ahora solo se asegura de que después de la sección v-l, tenemos dos divs de cierre adicionales, así que libres en una fila. Luego arriba en la parte superior del h3, el div, y luego la mesa. Ahora deberíamos ver dentro del navegador tenemos el texto predeterminado de tu cesta está vacío, clic en cualquier artículo y ahora la longitud de la cesta es mayor que cero. Por lo tanto, podemos exhibir nuestra mesa. Ahora agreguemos algunos artículos más a nuestras canastas y podemos probar haciendo clic en el botón “Realizar pedido” , esto se ve bien. Tenemos el mensaje funky, pasa a la consola de Firebase. Esto es Console.firebase.google.com. My Pizza Planet V3 en la base de datos. Ahora tenemos la colección más antigua, tendríamos una identificación de pedido, esto se ve bien. Tenemos una Margherita de 9 pulgadas y dos de 12 pulgadas. Probemos uno más de 12 pulgadas de Pepperoni y Margherita, haga su pedido. Bien, todo está funcionando correctamente y siguiente, vamos a buscar estos pedidos de la base de datos y mostrarlos dentro del admin. 37. Pedidos de búsqueda: Ahora podemos realizar pedidos con éxito y agregarlos a nuestra base de datos. Ahora tenemos la tarea de recuperar estos pedidos de la base de datos para que podamos utilizarlos dentro de nuestro proyecto, y en particular la sección admin. Anteriormente, creamos una sección de órdenes actuales abajo en la parte inferior. Vamos a recuperar estos de la base de datos, bucle sobre estos y colocarlos dentro de esta tabla. Para mantener las cosas organizadas, crea un nuevo componible dentro de la carpeta Composables. Este se va a llamar UseOrders. Como siempre, necesitamos exportar una función predeterminada, useOrders y colocar el código dentro de allí. Para comenzar, necesitamos tener una constante para almacenar todos nuestros pedidos dentro. esto lo llamaremos AllOrders. También haremos uso de ref que va a rodear nuestra matriz. Inicializaremos esto como una matriz vacía y luego necesitamos importar esta ref desde el paquete view. También necesitamos una función que va a recuperar estos elementos la base de datos y empujarlos a nuestro AllOrders ref. Crearemos una nueva función asíncrona, All GetOrders. Podríamos hacer algo similar que hemos usado en el pasado. Si echamos un vistazo, nuestro componible, que se usóPizzas. Dentro de aquí, lo que hemos hecho en el pasado es que hemos recuperado nuestros documentos con GetDocs. Tenemos esta función llamada GetPizzas. Este es un poco más sencillo porque todo lo que hacemos debemos llamar a nuestro método GetDocs, y pasar en una referencia a toda la colección de pizzas. Si quisiéramos, podríamos hacer exactamente lo mismo pasando una referencia a nuestras órdenes. Pero para este caso de uso, recuerda que en el video anterior, también empujamos un nuevo orden a la base de datos, que incluía una propiedad llamada CreateDat. Cuando nos tiran en las pizzas de colección AllPizzas que no estaban en ningún orden en particular. Aquí es donde esto funciona un poco diferente a AllPizzas. Queremos asegurarnos de que estamos sacando las órdenes en un orden particular basado en los datos en los que fueron creados. Volver a UseOrders. Para ello, necesitamos hacer uso de algo llamado query. Tenemos que importar esto. Consulta de importación. Esto es del paquete firebase slash firestore. Desde nuestro archivo firebase.js también será necesario importar esta referencia a AllOrders. Ahora volvemos a nuestra función GetOrders, vamos a hacer uso de esta consulta que acabamos de importar. Consulta. Lo que tenemos que hacer aquí es que tenemos que pasarlo en tres cosas. El primero es una referencia a nuestra colección, que es dBordersRef. Entonces también podemos pasar parámetros de búsqueda adicionales. En nuestro caso va a ser ordenadoPor. ORDerby. Este es también un método firebase que va a ordenar los contenidos que estamos sacando de nuestra base de datos por un campo en particular. Si todo lo que podemos usar esto, también necesitamos importarlo. Después pasamos dentro del nombre del campo, por el cual quieres ordenar esto. En nuestro caso, como podemos ver cuando creamos un nuevo orden, esta propiedad se llama CreateDat. Agarremos esto, peguemos esto y luego almacenemos esta referencia dentro de una constante llamada QueryData. De aquí en adelante, lo que hacemos es bastante parecido a cuando recuperamos las pizzas. Necesitamos hacer uso de GetDocs. Necesitamos luego recorrer estos documentos, y luego empujarlos a nuestras constantes. Con esto en mente, copiaremos toda esta sección. Justo encima del bloque catch copiará los corchetes. Estos son los corchetes para cada bucle hasta nuestros documentos. Copia esto, pega esto justo debajo de nuestros datos de consulta. Nuevamente, podemos hacer uso de muchos de estos datos. Podemos mantener este nombre constante. Podemos buscar nuestros GetDocs. Todo lo que necesitamos hacer en lugar de buscar directamente AllPizzas o AllOrdersRef, vamos a pasar nuestros QueryData filtrados, luego recorreremos cada uno de estos documentos en lugar de crear una pizza estructuraremos un nuevo pedido. El id es accesible exactamente de la misma manera ya que cualquiera de estos documentos regresa de firebase con la misma estructura. También podemos fusionar en los datos del documento, que son todos los campos de AllOrder, como AllPizzas, y nuestras fechas CreateAt. La diferencia final es esta línea aquí, en lugar de empujar a AllPizzas, empujamos a AllOrders. Empujaremos AllOrder en lugar de la pizza. Le daremos una prueba antes de colocarlo dentro de nuestros componentes, justo debajo de nuestros corchetes de cierre for loop, colocar en un registro de consola o AllOrders, sin valor. Pero este registro de consola para ejecutar realmente, necesitamos importar este componible en los componentes requeridos. Esta será la vista de puntos AllOrders, que está dentro de los componentes. Después dentro de la carpeta admin, abre AllOrders. Actualmente no tenemos guión. Crear un script, configurar, importar nuestro componible, que es useOrders. Luego usando la estructuración podemos importar nuestros AllOrders, que no estoy seguro de que hayamos regresado realmente, así que echaremos un vistazo a eso en solo un segundo. Llame a nuestra función UseOrders. Tan solo regresa. Necesitamos devolver todos los pedidos para hacer uso de este botón dentro de nuestra función. Devolver TodosPedidos. Ahora deberían ejecutar nuestro registro de consola. Entra en la sección de administración. Abre la consola. Actualmente no vemos nada dentro de aquí ya que no hemos llamado a nuestra función GetOrders. Lo que haremos, simplemente soplaremos nuestra función es que también la importaremos o montaremos. Ejecutaremos nuestra función llamada getOrders tan pronto como se monte este componente. Esto también necesita ser importado en la parte superior. También necesitamos importar GetDocs desde Firestore. Vamos a darle otra oportunidad a esto. Abre el registro de la consola en el destino donde podemos ver que tenemos una matriz con dos órdenes separadas. Estos están estructurados exactamente como nosotros creamos. Dentro de este orden aquí tenemos el id. luego fusionamos en el resto de los datos del documento, que era el objeto pizzas y también creadoAT. Ya casi terminamos con este video, lo siguiente que vamos a hacer solo para redondear las cosas, es envolver nuestro código dentro de un bloque try and a catch. Salta a la función GetOrders. Toma el contenido completo del registro de la consola de datos totales de consulta. Colóquelo, intente y también atrapar. La captura toma por error. Después pegando el contenido dentro de la sección try. Sabemos que esto está funcionando así que también podemos eliminar este registro de la consola. Dejaremos éste ahí. aparecer en el siguiente video, continuaremos con nuestros pedidos y recorremos estos y los colocaremos dentro de la vista de administración. 38. Colocar sobre pedidos: Ahora sabemos que podemos recuperar con éxito los pedidos de Firebase y almacenarlos dentro de nuestra variable AllOrders. Los hemos importado dentro del archivo orders.view, y podemos hacer uso de estos para recorrer y mostrar esto dentro de la tabla. Esta es la tabla que ves dentro la vista de administración abajo en la parte inferior. Al igual que hicimos con las pizzas anteriores, podemos recorrer todos estos datos y mostrar los valores correctos. Lo primero dentro de los pedidos actuales, necesitamos cambiar este valor codificado duro de cinco. Podemos obtener el valor real con AllOrders.length. Actualmente sabemos que tenemos dos pedidos, así que esto se ve bien. Después tener los encabezamientos de la mesa. No necesitamos hacer un bucle en esta sección porque no queremos encabezados duplicados, pero lo que sí tenemos que hacer es crear un bucle para ambas siguientes dos filas adicionales. La primera fila con el número de pedido, y la segunda fila con los detalles de la pizza. Para ello, crearemos un envoltorio adicional llamado template. Recorta ambas filas de la tabla. Podemos pasar en un elemento llamado template, pegarlos de nuevo, y ahora podemos hacer uso de esta plantilla para agregar el bucle dos. La plantilla agregará un envoltorio a esta sección, pero no agregará ningún HTML adicional, por lo que efectivamente es un envoltorio invisible. Colocar en bucle con v-for, ordenar en AllOrders. Necesitamos una llave. Sabemos que tenemos una clave única para cada pedido almacenado dentro del ID. Esto es order.id También podemos hacer uso de este order.id en lugar de este número de pedido. Entonces podemos bajar a nuestra información de pizza que se almacena dentro de esta fila. Sin embargo, recuerda que para cada pedido no solo tenemos una sola pizza, por lo que necesitamos crear un bucle adicional para recorrer cada una de las pizzas dentro de nuestro pedido. Por ejemplo, actualmente estamos recorriendo este primer pedido aquí. Luego necesitamos recorrer orders.pizzas para acceder a todos los valores dentro y mostrarlos como datos de tabla. v-for, y diremos el artículo del pedido en orden. pedido es el OrderItem completo, que tienes desde el primer bucle, pero queremos acceder a las pizzas. Podemos ver si pasamos a la consola y saltamos a las pizzas, no tenemos la identificación de pizza guardada para cada una de estas. Pero cada nombre y tamaño de pizza también es único, por lo que podemos crear una clave a partir de esto. Diremos el orderItem.name. Veremos OderItem.size. Podemos acceder al OrderItem en las propiedades de la pizza como nombre, tamaño, cantidad y precio. El primero es el nombre, el segundo es el tamaño, así que orderItem.Size, cantidad. Depende de ti cómo quieres manejar este precio para exhibirlo dentro de la tabla de administración. Si quisieras, antes que nada podrías intentar dar salida al pedido.Precio. Si entramos en el admin y luego refrescamos, podremos ver nuestra estructura. Tenemos el número de pedido, el nombre de la pizza, el tamaño, la cantidad y el precio se mostrará como un solo precio de una pizza. Si quisieras, tal como hemos descrito aquí donde dijimos que este es el total. Voy a multiplicar el precio por la cantidad. Multipliquemos con la estrella por el pedido.Cantidad. Este es ahora el total para cada una de estas líneas. A continuación, lo que vamos a hacer es volver a estos pedidos, y veremos cómo podemos eliminar elementos nuestra base de datos usando esta cruz roja. 39. Eliminar pedidos: A continuación nos centraremos en cómo eliminar los pedidos. Si pasamos al archivo componible UsePizzas, este utiliza el mismo proceso que usamos antes cuando eliminamos las pizzas. Teníamos esta función llamada delete pizza, que tomó un id, borramos cualquier mensaje de error existente, luego almacenamos una referencia de documento accediendo a nuestra colección, y también el id. Llamamos a un método llamado deleteDoc que tomó en la pizza que acabamos de hacer referencia, y luego finalmente llamamos getPizzas, que tiró todas las demás pizzas que todavía estaban disponibles. Así que para mantener las cosas bonitas y simples, copiaremos sobre toda esta función y luego entraremos en el archivo de uso más antiguo y lo pegaremos. Por supuesto, necesitamos hacer un par de pequeños cambios que llamaremos a esta orden de eliminación. Nuevamente, esto seguirá necesitando que se le pase una identificación de pedido. También aclararemos cualquier mensaje existente. Esto será const order, este será el dBordersRef, y eliminaremos este orden. GetOrders y en la llamada de función este debe coincidir con el que tienes justo arriba aquí. Entonces podemos cambiar el mensaje, hubo un error al eliminar el pedido. Entonces esto también necesitará alguna importación adicional, necesitamos tirar en nuestro doc. Necesitamos sacar DeleteDoc, y también tendremos que crear este mensaje también, así que saltemos a nuestras importaciones, y desde Firestore, necesitamos hacer referencia a nuestro documento, y también eliminar doc. Ya que estamos tratando con nuestras órdenes, ya tenemos el impulso de órdenes justo aquí, así que eso está completamente bien. Entonces tenemos el mensaje. Necesitamos entonces crear esto como un mensaje ref, const es igual a una ref, que inicialmente configuraremos para que sea una cadena vacía. Ya tenemos esto importado, así que esto está bien. Entonces necesitamos devolver algunos valores de vuelta de este componible hacia abajo a la sección de retorno. Volveremos de nuevo, eliminaría todo el método y también el mensaje para mostrar dentro de los componentes. Luego vamos a ir a nuestros componentes a la carpeta admin y a los pedidos, el orders.view, donde luego podemos crear algunas importaciones. Ya estamos importando nuestro archivo de pedidos de uso, por lo que luego podemos desestructurar, eliminar pedido y también nuestro mensaje. En primer lugar, llamaremos a eliminar orden si echamos un vistazo a la sección de administración y luego bajamos. Entonces todos sí recordamos que cada uno de estos números de orden tiene esta pequeña cruz, que es un botón, y esto va a llamar a nuestro método, al que podemos pasar el id de pedido. Este es el botón justo aquí. La clase de btn remove. Escuchamos ahora un click, al que llamaremos delete order, y delete order va a tomar en el id de orden, que vamos a pasar a esta función. Voy a necesitar tomar esto de nuestro bucle así que tenemos orden el id que ya has usado. Podemos simplemente poner esto dentro de los corchetes, y esto se pasará a nuestra función. Vamos a darle una oportunidad a esto. En el proyecto. Actualmente solo tenemos dos pedidos dentro de aquí. Intentaremos eliminar esta. Vemos que esto salta a ser tres órdenes ahora, pero necesitamos actualizarnos actualmente para luego ver alguna actualización. Pero esto está bien por ahora, volveremos a esto en el futuro y mejoraremos esto agregando nuestra funcionalidad en tiempo real de nuestra base de datos. Esto significará que en cuanto ocurran cambios en la base de datos, nuestra aplicación se actualiza con los nuevos valores. Por último, recuerda que también importamos este mensaje en la parte superior. Lo que podemos hacer es mostrar esto justo debajo nuestro encabezado dentro del elemento P. No solo necesitamos generar el mensaje dentro de aquí, sino que también necesitamos agregar algo de renderizado condicional. No queremos que este mensaje se muestre siempre ni ocupe ningún espacio que se encuentre actualmente. Si echamos un vistazo y eliminamos esto y guardamos, puedes ver si comentamos esto y presionamos “Guardar”, esta sección ocupará algo de espacio independientemente de si hay un mensaje o no. Entonces, qué haremos para mostrar esto solo si hay un mensaje, colocando la sección v if para mostrar solo si hay un mensaje en su lugar, y para el estilo, también agregaremos la clase de error. 40. Muestra y oculta bloques de administración: Dentro de la vista de administración puede verse bien en este momento pero imagina si nuestra aplicación era mucho más grande y teníamos muchas más pizzas en el menú o muchos pedidos. Esta página podría llegar a ser muy larga. Para ayudar con esto, lo que ahora vamos a hacer es mostrar y ocultar cada una de estas secciones. Hace que la página sea mucho más pequeña y no necesitamos leer toda esta información. Para ello, lo que vamos a hacer es crear una variable local en cada uno de estos componentes de administración gratuitos, que luego se alternará con el texto de mostrar y ocultar. Para comenzar salta a la barra lateral. Los componentes, el administrador y la nueva pizza. Bueno, crearemos una nueva constante local llamada show NewPizza. Establece esto igual a ref y configura nuestra ref, que será igual al valor de true. Mostraremos esto por defecto. Esto será visible dentro del administrador y luego una vez que un usuario haga clic en esto, esto se alternará para que sea falso. Esto lo haremos dentro de nuestras plantillas y en la sección de encabezado justo debajo de nuestro título, coloca dentro de los pequeños elementos. Dentro de aquí queremos mostrarte el texto de mostrar u ocultar. También podemos renderizar condicionalmente esta sección dentro de las llaves dobles. Lo que podemos hacer es que podemos decir si mostrar nuevoPizza es igual a dos, mostramos el texto de ocultar. Si no es vamos a decir show. Actualmente, esto se establece en true así que veremos el texto de hide up en la parte superior. Podemos agregar la clase de TogkleBtn. Escuche un clic cuando haga clic. Todo lo que queremos hacer dentro de aquí es buscar su NuevoPizza sea igual a opuesto de lo que es el valor actual . Probemos esto. Haga clic en ocultar. Esto ahora alternará y luego podremos usar nuestra variable show NewPizza para mostrar y ocultar esta sección completa. La sección que queremos mostrar y ocultar es la forma. Todavía podemos mantener la cabeza en su lugar, que tiene el botón y también el título. Dentro del formulario, agrega v-show que solo mostrará estos contenidos si el valor de show newPizza es igual a dos. Actualmente no está alternando hacia atrás. Intentemos refrescarnos. Eso parece funcionar bien. No estoy muy seguro de lo que pasó ahí. Ahora podemos replicar esta sección en los pedidos y también en el menú. Vamos a saltar a las órdenes. Importa nuestra ref vue. Crear una variable local. Este puede ser órdenes de espectáculo. El valor inicial de true. De hecho, lo que acabaremos de hacer aquí es copiar sobre la sección NewPizza que creamos, así que la pequeña sección completa. Trae esto para que sea consistente. Coloca esto justo debajo de nuestros pedidos actuales, encabezado Nivel 3, esta misma clase. Esta vez, todo lo que queremos hacer es cambiar esto para que sea mostrar órdenes. Cambia esto en todas las demás secciones. Entonces queremos mostrar y escondernos. Nuestra mesa se mostraría igual a mostrar órdenes. Vamos a darle una oportunidad a esto. Se puede ocultar. Esto se ha ido. Entonces show revela esta sección. Por último, la sección del menú, que está en las pizzas o vue. También necesitamos importar ref vue. Nuestra variable local llamada ShowMenu, el valor inicial de true, y luego al igual que antes, debajo de nuestro encabezado Nivel 3, necesitamos volver a copiar esta pequeña sección, pegarla y luego reemplazar todas nuestras variables con ShowMenu. Por último, agrega v-show a nuestra mesa. Probemos esto. El menú, ocultar y mostrar. Tan solo como un toque final rápido. Si pasamos el cursor sobre este botón, podemos alternar este para que sea un puntero. Tenemos una clase de TogkleBtn para cada una de estas secciones. Como usamos esto en múltiples componentes, entra en nuestros activos y la clase main.css de TogkleBTN. Estableceremos el cursor para que sea un puntero. Ahí vamos. Esto ahora funciona para nuestras tres secciones. 41. La función de registro: Este proyecto va a utilizar la autenticación de Firebase para administrar cuentas de usuario y permitirles registrarse e iniciar sesión. Si entramos en la consola de Firebase y en la sección Visión general del proyecto, deberías ver justo debajo tenemos nuestra autenticación y nuestra configuración de accesos directos de Firestore Database. Esto se debe a que en los primeros videos ya los habilitamos en nuestro proyecto. Pero si actualmente no tienes configuración de autenticación, todo lo que necesitas hacer es bajar a la sección de todos los productos y agregarla con este enlace de autenticación. Como el mío ya está habilitado, voy a volver al proyecto para configurar esto. Mantengamos las cosas organizadas. Vamos a crear un nuevo componible dentro de la carpeta componibles, un nuevo archivo. Este va a ser useAuth.js. Luego, al igual que con todos los demás componibles, exportaremos una función predeterminada. Este es UseAuth. Después agregaremos una declaración de retorno abajo en la parte inferior antes de que nos olvidemos. Dado que actualmente no tenemos ningún usuario en nuestro proyecto, tendría sentido que la primera función que agreguemos sea crear un nuevo usuario. Para ello, necesitamos importar algunas funciones del paquete de autenticación Firebase de Firestore. Por encima de nuestra función, vamos a hacer estas importaciones ahora. Lo que necesitamos importar es algo que se llama GetAuth. También para crear un nuevo usuario, necesitamos importar un método llamado create user con correo electrónico y contraseña. Todo esto es caso de camello. Después de la primera palabra se asegura de que cada palabra siguiente comience con una letra mayúscula. Vamos a importar esto desde Firebase/Auth. A continuación haremos uso de esta importación de GetAuth, que va a inicializar la autenticación de Firebase. Entonces comenzaremos a hacer referencia a esto dentro de una variable. Salta a nuestra función. Llama a esta auth, que es igual a GetAuth. Dado que este es nuestro método, necesitamos llamar a esto con los corchetes, la siguiente función de autenticación, que va a crear un nuevo usuario. Esto va a ser asincrónico llamado registro. Cuando nos registramos, ya que estamos creando un usuario con correo electrónico y contraseña, también necesitamos pases a esta función cuando la llamamos. Vamos a echar un vistazo a cómo hacer esto pronto dentro del cuerpo de la función o manejo de errores. Crea un try y un área de captura, pasando el error. Entonces dentro de la sección try es donde vamos a llamar a la función create user with email and password, que acabamos de importar. Esperemos el valor de retorno. Crear usuario con correo electrónico y contraseña. Esto va a tomar en tres cosas separadas. El primero es una referencia a la corriente de instancia, que es la que configuramos en la parte superior. También necesita tomar en el correo electrónico y también la contraseña. Aquí estamos. También para almacenar cualquier mensaje de error, podemos crear una nueva variable reactiva. Para esto, primero necesitamos importar ref desde vista y crear nuestra constante justo debajo de dentro la función llamada errorMessage. Entonces configura nuestro ref, que va a ser inicialmente una cadena vacía. Ahí estamos. Si esta sección es ahora exitosa, si el área de prueba está funcionando bien, entonces podemos borrar cualquier mensaje existente. Reiniciaremos el ErrorMessage.value para que vuelva a ser una cadena vacía. Entonces dentro de la sección de error, también podemos actualizar este mensaje de error también. Si estamos haciendo algo como registrar a un usuario, no solo queremos devolver un mensaje de error genérico, como “hubo un error, hubo un problema al iniciar sesión ” o algo así. Tendría sentido ser un poco más descriptivo sobre cuál es el error. Es posible que no escriba una contraseña que sea lo suficientemente larga, puede que no tenga los caracteres correctos, es posible que el correo electrónico ya esté en uso. Para ello, necesitamos acceder a nuestro error, que se pasa al área de captura. Tenemos una propiedad llamada código. Este código es una cadena de texto que es igual a un mensaje de error, y dos comunes que Firebase proporciona es una cadena llamada auth/email ya en uso. Se ve así. Es autor/correo electrónico ya en uso, con guiones entre cada una de estas palabras. Además, otro útil es auth/weak-password. Estos serán mensajes útiles para pasar de nuevo al usuario. Pero primero, tenemos que asegurarnos de que podemos detectar cuál de estos se está generando dentro de nuestro error. Esto lo podemos colocar en una sentencia if-else, podemos colocar en una sentencia switch, lo que prefieras. Voy a ir por el interruptor. Podemos agregar a esto más adelante si queremos acceder al error, que se pasa a nuestro objeto catch, entonces podemos acceder al código. Entonces podemos comenzar a construir nuestros casos individuales. El primero, comprobaremos esta cadena justo aquí. Pega esto en. Si esto es cierto, si se trata de una coincidencia, queremos establecer el errorMessage.value. Para ser un poco más descriptivo, diremos algo así como un usuario con ese correo electrónico ya existe, por favor ingresa. Si esto es cierto, entonces podemos romper con estas declaraciones de cambio. No necesitamos ir más abajo otro código. El segundo caso es igual a nuestra segunda cadena, que teníamos abajo aquí abajo. Vamos a mover esto. Pega esto como nuestro caso. Si el usuario ingresa una contraseña débil, esta será un errorMessage.Value. Actualizaremos esta variable para decir que la contraseña debe tener al menos seis caracteres de longitud. Entonces salimos de esto de esto si éste es cierto. Por último, con la sentencia switch, también deberíamos agregar un mensaje predeterminado abajo en la parte inferior. Esto es para si alguno de los casos anteriores no coincide, entonces vuelva a la sección predeterminada, que volverá a actualizar el errorMessage.value. Este puede ser un poco más genérico. Vamos a decir, perdón, hubo un error inesperado. Esto es todo lo que necesitamos en nuestra función de registro por ahora. Lo último que hay que hacer es devolver nuestra función de registro y también nuestro mensaje de error. Ambos ahora van a estar disponibles para llamar desde nuestros componentes. Lo haremos a continuación cuando creamos el formulario de inicio de sesión. 42. Creación de la forma de inicio de sesión: Genial con nuestra funcionalidad de registro ahora funcionando, también necesitamos un formulario para capturar la información del usuario. Para ello, esta forma va a ser de doble propósito. Permitirá al usuario iniciar sesión y también registrarse para crear un nuevo usuario. Para ello saltemos a nuestra barra lateral y podremos crear nuestros nuevos componentes. Salta a los componentes, y este es signin.vue. Primero, crearemos la sección de script que hará uso de la configuración. En la parte superior, importaremos nuestro uso de composable, que creamos en el video anterior y configuraremos este igual a @, que es la raíz de nuestra fuente, composable useAuth. Agarra nuestras variables que exportamos en la primera es registrarse. También necesitamos nuestro mensaje de error. Agarra estos de lo anterior, función useAuth. Esto solo tiene que ser de, ahí vamos. También una variable de datos de formulario para almacenar el correo electrónico y la contraseña que ingresa el usuario. vincularemos a nuestro formulario usando v-bind. A este se le llama los datos del usuario. También necesitaremos importar el ref del paquete vue. Configura esto como un objeto, que simplemente va a contener el correo electrónico y también la contraseña. Por defecto, ambos estarán vacíos ya que el usuario no ha ingresado ningún valor. Luego importa nuestro ref de vue. Abajo al área de plantilla para crear el formulario. Dado que este va a ser un modal emergente que podamos mostrar y ocultar usando CSS, sí necesitamos crear un par de envoltorios para habilitarlo. El primero será un div con la clase de modal, que es el wrapper principal. Entonces también anidado dentro creará un segundo div con la clase de modal_content. Este modal se cambiará dentro de la cabecera. Lo que haremos pronto es crear dentro del encabezado un enlace sobre la parte superior, que luego aparecerá nuestro modal de todos estos contenidos. Después dentro del modal, también queremos crear una pequeña cruz en la esquina, que luego cerrará este modelo. El cierre será un lapso y la clase para nuestro estilo de close_modal. El cierre será una entidad HTML, que es el ampersand, el hash. Después 10060 y un punto y coma. Un elemento p abajo, este va a ser para el texto así que favor de iniciar sesión para continuar. Agrega una clase para nuestro estilo de modal_text. Luego, debajo de esto crearemos un formulario para que el usuario inicie sesión. No necesitamos una acción, nos encargaremos de esto con futuro sí. Todo lo que necesitamos dentro de aquí es una entrada para nuestro correo electrónico, una entrada para la contraseña. También vamos a crear dos botones. Comencemos con nuestra sección de correo electrónico, que será un div como una clase contenedora de form_group. La etiqueta del formulario de la dirección de correo electrónico. La entrada para este, ya que este es un correo electrónico, le daremos a este el tipo de correo electrónico, el ID de correo electrónico, el texto de marcador de posición de enter email. Entonces también podemos usar v model para vincular el valor de esta entrada a nuestros datos de usuario justo arriba. Necesitamos acceder a UserData.email. Ahí estamos. Esta entrada también tiene el ID de correo electrónico. Podemos vincular esto a nuestra etiqueta y luego copiar nuestra sección div. Este es para la contraseña. Pégalo justo debajo. La etiqueta para contraseña y para la entrada, el tipo para esta también es contraseña, el ID es el mismo. El marcador de posición de enter password. Esto necesita vincularlo a UserData.Password. Entonces nuestros dos botones abajo por la parte inferior, justo debajo de nuestro div. El primero es el inicio de sesión. Coloca en un botón con el tipo de botón, el texto de inicio de sesión. Duplica esto o copia y pega. Ahora lo que tenemos que hacer es cambiar este texto para que se inscriba. Posteriormente esto le dará al usuario la opción de iniciar sesión o registrarse utilizando el mismo formulario modal. Ahí estamos. Hemos creado nuevos componentes modales de inicio de sesión. Para ver esto, necesitamos importarlo exactamente donde lo queremos en nuestro proyecto. Como se mencionó anteriormente, esto estará dentro del encabezado para que podamos ver el texto arriba en la parte superior. Vamos al encabezado hasta la sección de guiones. De hecho, no tenemos guión, así que vamos a crear esto ahora. Configuración de script. Importaremos nuestros componentes, que es el inicio de sesión. La ruta del archivo, ya que estamos dentro de los componentes es simplemente. /signin.vue. Luego colóquelo en los componentes en la parte superior de la sección de encabezado. Quizás se esté preguntando por qué agregamos un formulario de inicio de sesión a esta área de encabezado, pero esto se volverá más claro muy pronto. Pero colocando esto dentro del encabezado por ahora, mantendremos a este grupo junto con los botones de inicio de sesión y registro, que se mostrarán en la parte superior del encabezado muy pronto. Haremos clic en un botón, esto luego aparecerá el formulario y luego podremos cerrarlo con esta cruz en la parte superior. También se ve un poco desordenado por el momento, pero lo arreglaremos más adelante con nuestro estilo. Por ahora, concentrémonos en el formulario y registremos a un usuario. Volver a los componentes de inicio de sesión que acabamos de crear. Como hemos creado la función de registro dentro de nuestro componible, trabajaremos con este botón de registro abajo en la parte inferior, y lo vincularemos a la función con un oyente de clics. Podemos evitar el comportamiento predeterminado, que es refrescar la página, llamar a nuestra función de registro, que va a tomar en el correo electrónico y la contraseña como configuramos dentro de nuestro componible. Ambos están disponibles dentro del guión. Tenemos el UserData.email y contraseña. Pasemos en ambos valores. Primero está el UserData.email, luego el UserData.password. Debería ser todo lo que necesitamos para la función de registro. Recuerda, también importamos el mensaje de error. Mostremos esto justo debajo nuestros elementos p con el texto de favor inicie sesión para continuar. Colócala dentro de un span con la clase de error_message. Dentro de las llaves dobles pasan en nuestro mensaje de error. Lo hicimos bastante ahí. Ojalá esto funcione todo. Vamos a saltar al proyecto, nos da una salvada. Crearemos un nuevo usuario para continuar. Es un poco difícil de ver, pero lo arreglaremos en el CSS muy pronto. Colocar en una dirección de correo electrónico, y también una contraseña. Solo ve esto, si pongo el cursor por encima, da clic en el botón “Inscribirse”. Por el momento, no vemos ningún comentario, por lo que actualmente no tenemos un mensaje de error, lo cual es una buena señal. También cerraremos este formulario automáticamente después de iniciar sesión y registrarse. Pero por ahora saltar de nuevo a la consola a la sección de autenticación, pero deberíamos ver al usuario, que acabaría de registrarse. 43. Estilo modal: [ANTECEDENTES] Actualmente tenemos este modal no tan atractivo que tiene los componentes de inicio de sesión. En la vista de inicio de sesión, podemos comenzar a agregar un poco de estilo apuntando a todas estas clases. El div principal que rodea todo el modal tiene esta clase de modal. Entonces tenemos el contenido modal que está contenido en su interior. Estos ahora se pueden usar para darle estilo a nuestro modal y también hacerlo aparecer sobre el resto del contenido. Saltamos hasta el fondo, creamos la sección de estilo, que va a ser alcanzada a este componente. Como hemos visto, el envoltorio principal que rodea todo este div tiene la clase de modal. Lo que vamos a hacer aquí es que apuntaremos a este modal, que es el envoltorio completo. Estiraremos este envoltorio para que sea el ancho completo y el alto completo de la página. Entonces podemos establecer un color de fondo más oscuro no podamos ver tanto el contenido detrás. Luego en el siguiente div, que se anida en su interior, que es el contenido modal. Esto será un poco más pequeño. También tendrá un color de fondo blanco para que este destaque sobre todo el contenido detrás. En primer lugar, la sección modal. El modal tendrá una posición fija y todo destacará sobre todo el resto del contenido por índice [inaudible] para ser un número alto, como el 999. Esto asegurará que este fondo completo aparezca sobre todo el contenido existente. Para que este modal destaque, también necesitamos establecer el ancho para que sea 100vw. El ancho completo del view-port. La altura, 100vh, que es el 100 por ciento de la altura del puerto de visión. El fondo, este sería un color RGBA. Lo que haremos por el rojo, el verde y el azul es poner esto como cero, que es el color negro oscuro. Estableceremos la opacidad en 0.9. Es ligeramente transparente. Este es el efecto que vamos por. Es el color de fondo más oscuro que es ligeramente transparente. También podemos posicionar esto para estar arriba en la esquina superior izquierda, así no tenemos esta brecha arriba en la parte superior. También podemos hacer uso del flexbox para centrar todo el contenido. En primer lugar, la cima es cero. Haremos lo mismo por la izquierda. Asegúrate de que no tengamos ningún hueco alrededor del borde. El tipo de pantalla de flex. Luego nos aseguraremos de que todo el contenido esté alineado vertical y horizontalmente estableciendo la propiedad justify-content como centro. También lo mismo para alinear elementos. Ahora debería ser todo lo que necesitamos. Tenemos este modal ahora en el centro. Todo su contenido en el centro se va a colocar sobre un fondo blanco para que sea más visible. Esto tiene una clase si volvemos a subir de contenido modal. Seleccione esto, el fondo puede ser de cualquier color que desee. Voy a usar humo blanco. También necesita un poco de espaciado, acolchado. Estableceremos el ancho de la misma, estableceremos el border-radius, y también centraremos todos los contenidos usando el flexbox. Estableceremos la propiedad width en 80vw. Uno recuerda el acolchado en todos los lados para darle a esto algo de espaciamiento en el interior , un pequeño radio de borde. Digamos tres pixeles. Además, estableceremos el tipo de pantalla para que sea flexible. La razón por la que vamos a estar haciendo esto es porque vamos a establecer, si volvemos a subir a la cima, vamos a usar este flexbox debido particularmente a este botón modal cerrado. Queremos que esto termine a la derecha y también el texto que está justo debajo. Pero volveremos a esto en un momento. Pero ahora necesitamos que la dirección flex esté en una columna, que restablecerá el contenido para que sea vertical. El color y el valor RGB de 76, 76, 76. También puedes ver en este texto que hemos heredado esta sombra tecnológica. Podemos anular de esta manera a la propiedad text-shadow estableciendo esto como non. Ahora bajemos a nuestros botones. Podemos seleccionar el contenido modal. Dentro de aquí, tenemos nuestros dos botones. Podríamos agregar un clúster individual, cada uno de estos si quisieras, o en su lugar, podríamos usar CSS para seleccionar el contenido modal y el botón que sigue, que es el primero de tipo. Esto va a seleccionar el primer botón dentro de nuestro contenido modal, que es nuestro inicio de sesión. Podemos usar estos dos espacios fuera con algún margen a la derecha. También haremos que esto se vea un poco diferente configurando el color de fondo para que sea un valor RGB de 163, 204, 163. Como puede ver, esto ha seleccionado la primera aparición de este botón. Establecemos el color de fondo y también agregamos algo de espacio en él al lado derecho. A continuación, para el estado estacionario se sumará una pequeña transformación a esto. Nuevamente, tomaremos el contenido modal, seleccionaremos todos los botones dentro. Solo aplica esto cuando el mouse se cierne sobre él. Transformar. Haz esto un poco más grande. Podemos hacer uso de la báscula. El valor de escala de uno es exactamente lo que es actualmente. Para hacerlo un poco más grande, podemos establecer esto en 1.03, dándonos una agradable transformación el cursor sobre cada uno de estos botones. A continuación, subamos a la cima donde tenemos esta sección modal cercana. Este es el lapso que acabamos de tener aquí. Recuerda que establecemos el contenido modal para hacer uso del flexbox. Por lo tanto, dado que modal cerrado es un elemento hijo de este, entonces podemos usar ciertas propiedades flex. Para ello, salta hasta el fondo, agarra todo cerca modal. La propiedad flex de align-self y el valor de flex-end. Lo que esto va a hacer, esto sólo se aplicará a este elemento actual. Por encima de la izquierda, este será el arranque flex. Por encima a la derecha está el extremo flexible. Acabamos de ser un botón y podemos configurar el cursor para que sea un puntero. Esto ya está hecho. ¿Qué queda? Tenemos el texto. Justo aquí, podemos colocar esto en el centro. Este, si echamos un vistazo, tiene la clase de texto de subrayado modal, agarra esto, establece align-self para que sea igual al centro. Ahora mantiene nuestros textos en el centro mismo de la página. Vamos a reducir esto. El ancho de esta sección está bien para la vista móvil. Pero si extendemos esto a la vista más grande que hemos visto, probablemente queremos que este modal sea un poco más estrecho. Vamos a saltar a una media query, y podemos hacer esto @media y solo aplicaremos esto cuando el tamaño de la pantalla sea de 900 píxeles o más ancho. Seleccione el contenido modal. Voy a ir a, establecer esto para que sea 40vw. Probemos esto por debajo de los 900 píxeles. Entonces más de 900 píxeles reducirían el tamaño. Casi ahí ahora, lo último que tenemos que cuidar es este lapso con la clase de mensaje de error. Para esto, simplemente voy a agregar algo de texto de muestra. Esto lo podemos ver. Establezca el color para que sea rojo y también algo de espacio en el exterior de la consulta de medios. Coge nuestro error_message. El color de 255, 104, 104. Este es el color rojo y también solo necesita un poco de espaciado a la izquierda. Agreguemos un margen solo a la izquierda. Esto se ve bastante bien. Ahora sólo podemos volver al mensaje de error. Elimino el contenido de la muestra de aquí. Aquí estamos. Este es ahora nuestro estilo terminado para el modal. A continuación, echaremos un vistazo a cómo podemos cerrar este modal cuando hagamos clic en esta X. 44. Modal Toggle: Este modal ahora se ve mucho mejor. También necesitaremos una forma de abrirla y cerrarla. Para ello, saltemos a nuestro componible, que es useAuth.js. Luego dentro de aquí, vamos a crear una nueva variable que va a mantener el estado abierto actual. Este será un valor booleano, que configuraremos para que sea un valor inicial de false. Esto se llamará signinModalOpen, se envolverá dentro de una ref y el valor inicial de false y luego a continuación se creará una nueva función que va a alternar esto para que sea true o false. Función ToggleModal. Todo lo que tenemos que hacer dentro de aquí es agarrar nuestro nombre de variable, que es signinModalOpen, establecer el valor para que sea igual al contrario con el signo de exclamación, así signinModalOpen.value. Si esto es falso, esto devolverá entonces esto a ser cierto y si esto es cierto, esto entonces fijará esto para que sea lo contrario, que es falso. Devolver ambos de este archivo de manera que el SignInModalOpen, ToggleModal y luego saltar a un componente que es iniciar sesión. Necesito importar ambos de UseAuth ToggleModal y SignInModalOpen. La constante SignInModalOpen controlará si el usuario puede ver este formulario, por lo que necesitamos agregar esto a nuestro wrapper dentro este div con la clase de modal at v if declaraciones, que es igual a este valor. Ahora bien, si guardamos esto, porque el valor inicial es falso, ahora se elimina este. Luego de vuelta a nuestra plantilla, donde tenemos este lapso, que es cerrar el modal. Podemos escuchar por un clic, lo que activará nuestra función llamada ToggleModal. Como sabemos lo que esta constante SignInModalOpen se establece el valor inicial de false así que para ver realmente este modal, necesitamos crear un botón, que va a cambiar esto para que sea cierto. Sin embargo, el problema que tenemos actualmente es que todo este contenido dentro del modal está oculto por defecto. Por lo tanto, para ver realmente este botón, necesitamos crear un botón fuera de este div principal con el texto de inicio de sesión. Esto también necesita escuchar por un clic, que va a ToggleModal. El estilo para la clase de sign_in_btn. Guarde esto y ya podemos probarlo dentro del navegador. Ahí está nuestro botón Iniciar sesión. Haga clic en esto. Esto ahora alternará esto para que sea cierto por lo tanto mostrando el modal. Haga clic en la cruz, que luego ocultará esto a la vista. Sólo para terminar las cosas, vamos a mover este botón a la esquina superior derecha y también podemos quitar este borde. Esa es la parte inferior dentro de nuestra sección de estilo. Tomemos nuestro botón Iniciar sesión, así sign_in_btn, todo separado con guiones bajos. Quitar el borde con el valor de ninguno. Luego usando el flexbox, podemos hacer uso de una línea auto. Ponemos esto para que sea flex-end. Ahora empuja esto hacia el lado derecho. Para que esto sea más visible, podemos anular el color heredando este color más claro de nuestro padre. Finalmente, también accederemos a nuestro botón Iniciar sesión con un estado de desplazamiento, y le daremos un pequeño cambio de color a este. rgb 161,132, 132. Veamos cómo se ve esto. Ahí estamos. Ahora nuestro modal alternará abierto y cerrado, lo que está funcionando muy bien. Los siguientes pasos serán realmente iniciar sesión al usuario y también cerrarlo también. 45. Acceso y salida: Nuestro formulario de inicio de sesión está diseñado para ser de doble propósito. Ya lo hemos usado para iniciar sesión en nuevos usuarios, pero a continuación también lo usaremos para iniciar sesión a cualquier usuario existente y mantener las cosas bien y organizadas. Colocaremos esta función de inicio de sesión dentro de nuestro uso de composable. Luego en usar off, tenemos nuestra función SignUp así que agreguemos también a esto una función de inicio de sesión. Antes de hacer esto, también podemos importar un método desde Firebase. Antes teníamos que crearUserWithEmailAndPassword, pero ahora lo que necesitamos es signinWithEmailAndPassword. Asegúrate de que todo esto sea un caso de coma para que cada palabra comience con una letra mayúscula después de la primera. Este será el responsable iniciar sesión en cualquier usuario existente. Vamos a crear una función a la que vamos a llamar esto dentro de. Una vez que el usuario pulsa el botón “Iniciar sesión” dentro de este modelo. Gran parte del código será similar a la función de registro tenemos el bloque try-catch, luego llamaremos a nuestro método particular de Firebase, y también necesitamos manejar cualquier mensaje de error también. Lo que haremos es copiar toda esta sección de registro, voy a usar esto como punto de partida. Pega esto justo debajo. La función, la llamaremos login. En lugar de crear usuario cambiaremos esto para que se inicie sesión. Inicie sesión con correo electrónico y contraseña, luego borraremos cualquier mensaje de error, lo cual está bien. Después de iniciar sesión, también queremos cerrar este modelo, por lo que haremos clic en “Abrir”. Ingresaremos nuestros datos. Si el proceso de inicio de sesión está bien, haremos clic en esto y luego esto se cerrará. Podemos hacer esto configurando el modal de inicio de sesión abierto para que sea igual a false. Iniciar sesión modal open es algo que ya hemos configurado en la parte superior y esto controla la visibilidad del modal. De vuelta a nuestra función y bajando al área de captura. No necesitamos el primer caso de correo electrónico ya en uso porque si iniciamos sesión, en el usuario, el correo electrónico ya debería estar registrado. Lo que haremos es agarrar el mensaje de contraseña incorrecta. Al igual que con la función de inicio de sesión, estos son todos los mensajes que se devuelven desde Firebase. Para este, diremos contraseña incorrecta. Número 2 no se encontró el usuario. Diremos que no se encontró ningún usuario con ese correo electrónico. Voy a mantener el mensaje predeterminado si es algún otro error. Justo antes de llamar a la sección try, colocaremos en declaraciones condicionales. De hecho, colocaremos en dos y verificaremos si no hay correo electrónico o contraseña. Si falta alguno de estos, regresaremos de esta función y enviaremos un mensaje de vuelta al usuario. Si no hay correo electrónico, devolveremos una declaración que dice mensaje de error. Ese valor. ¿Es igual ingresar un correo electrónico válido? Duplicar esto. El segundo probará si la contraseña no está presente. Por favor ingrese una contraseña válida. Esto simplemente detendrá un método innecesario llamado Firebase si no tenemos toda la información que necesitamos. Ahora tendremos la función de crear nuevo usuario, para también iniciar sesión en un usuario existente. A continuación, nos vamos a centrar en cerrar sesión a un usuario. Para ello, Firebase proporciona un método llamado cierre de sesión. Importa esto. Entonces también crearemos una nueva función, que va a llamar a esto. Solo un botón encima de nuestros estados de cuenta de devolución. Crear una función llamada logout. Llamaremos a nuestro método de registro, que también toma el objeto off para que sepamos a qué usuario cerrar sesión. De hecho, también envolveremos esto en un área de prueba y captura así que tenemos algún manejo de errores. lugares en la sección try detectarán cualquier error, y luego enviarán un mensaje de error al usuario con el valor igual a error.message. Accederá al objeto de error que se pasa al área de captura, y luego accederá a la propiedad del mensaje. Ambas de estas dos nuevas funciones también necesitan ser devueltas. El primero de iniciar sesión, luego cerrar sesión. Ambos deben ser accedidos dentro de los componentes de inicio de sesión. Agregue a eso, componentes, signin.vue. Importe estos en la parte superior, así que inicie sesión y cierre sesión. La función de inicio de sesión, necesitamos colocarlo abajo dentro del formulario, lo vincularemos al botón de inicio de sesión. Ya tenemos el registro que se está llamando. Tenemos el inicio de sesión justo arriba. Escuchamos el click con este, evitamos cualquier comportamiento predeterminado, y llamaremos a login. Y luego, al igual que con la función de registro, también necesitamos pasar el correo electrónico y la contraseña que tenemos almacenados en el objeto de datos de usuario arriba en la parte superior, que está justo aquí. Y esto está ligado a nuestro para formar insumos. Entonces el correo electrónico, la contraseña, haremos clic en “Iniciar sesión”. Nuestra función se llamará entonces pase en el correo electrónico y también la contraseña. Pero, ¿qué pasa con la función de cierre de sesión? ¿De dónde vamos a llamar a esto? Bueno, actualmente no tenemos ningún botón de cierre de sesión dentro del modal o también dentro del encabezado. Pero sí tenemos el botón de inicio de sesión en la esquina. Será bueno alternar el texto aquí y solo decir iniciar sesión cuando el usuario está realmente cerrado la sesión. Y también lo contrario, cuando necesitamos usarlo para cerrar sesión. Así que hagamos esto en la parte superior de la plantilla, nuevo en los componentes de inicio de sesión, y hasta la parte superior de la plantilla, tenemos el botón Iniciar sesión. Duplicemos esto. Hago clic, digamos cerrar sesión, cambiar el texto para cerrar sesión. Volveremos a estos botones muy pronto y solo mostraremos uno de ellos a la vez. Pero ahora podemos ver nuestros botones de inicio de sesión y cierre de sesión en la parte superior. Pero justo antes de seguir adelante y probar esto, ¿cómo podemos saber si incluso iniciamos sesión en primer lugar? Bueno, una forma es conseguir que el objeto de usuario nos devuelva después de que llamemos a la función de inicio de sesión. Si volvemos a nuestro uso de composable, la forma en que podemos acceder a esto dentro de nuestra función de inicio de sesión es almacenando el valor de retorno del método de inicio de sesión con correo electrónico y contraseña. Vimos que esto está dentro de una constante llamada usuario, y luego justo debajo, podemos darle a esto una prueba con un registro de consola. Colocar en el usuario, en el navegador y abrir las herramientas del desarrollador. Salta a la consola, inicia sesión, ingresa el correo electrónico con el que te registraste. Esta vez vamos a golpear Iniciar sesión. Vemos un error. Lo sentimos, fue un error inesperado, pero parece que estamos recuperando las credenciales de usuario. Echemos un vistazo. Tenemos el usuario, tenemos el correo electrónico, el token de acceso. Todo esto parece estar bien, pero todavía estamos recibiendo un mensaje de error dentro de aquí. Entonces echemos un vistazo. Este es el mensaje dentro de las instrucciones switch. Hagamos un poco de depuración dentro de la sección predeterminada, coloque en un registro de consola. Y aquí sacaremos el objeto de error completo, y veremos si podemos tener una mejor idea de lo que está pasando. Vuelve a iniciar sesión. Iniciar sesión. Entonces obtenemos el error, tenemos las credenciales de usuario y ahí está nuestro error. Las asignaciones son constantes dentro del uso de so sign in modal open. Ese es el problema. Esto necesita ser.valor. Probemos esto una vez más. Hacemos la actualización para asegurarnos de que se borren los errores. Iniciar sesión, genial, el mensaje se ha aclarado todo. Todavía tenemos nuestro objeto de usuario y el modal se cierra ya que hemos establecido esto para que sea igual a false. Quitemos los registros de la consola. No necesitamos ninguno de estos. Al regresar este objeto de usuario funciona completamente bien y esta es una forma de detectar si el usuario ha iniciado sesión o no. También podemos acceder a las propiedades del usuario como el correo electrónico y el ID. Pero esta es solo una forma de hacer las cosas. Otra forma posiblemente mejor de hacer las cosas es hacer uso de un método proporcionado por Firebase, que vamos a echar un vistazo en el siguiente video, y esto escuchará cualquier cambio en nuestro usuario que haya iniciado sesión. 46. Detección de cambios en la espera: Como se mencionó en el video anterior, cuando llamamos a este método que es iniciar sesión con correo electrónico y contraseña, este devolverá un valor. Si tiene éxito este valor será el contenido del objeto usuario, que contiene toda la información que necesitamos, como el ID de usuario y también el correo electrónico del usuario. Esto está bien, pero Firebase también proporciona un observador, que es una forma recomendada no solo de conseguir al usuario, sino también de notificarnos si hay algún cambio como que un usuario cierre sesión. Este observador va a ser importado en nuestro uso de archivo así que salta a la parte superior y dentro de la importación off, también importaremos on/off estado cambiado. Para llamar a esto saltaremos al fondo de nuestro expediente, justo encima de la declaración de devolución y llamaremos a esto en la parte inferior. En este método de pintura, también necesitamos colocarlo entre corchetes. También necesitamos pasar en dos parámetros. Primero es la ocurrencia de instancia, tenemos acceso a esto. Tendríamos nuestras constantes de apagado separadas por coma. El siguiente parámetro va a ser una función a llamar si ha detectado un cambio en los usuarios de Estado es decir, llamará a esta función si el usuario inicia sesión o cierra la sesión. Pasar una función como segundo parámetro y su función también va a tomar en el usuario actual. Abre esto. Ahora vamos a tener acceso al usuario actual conectado, queremos conocer nuestro lugar en unas declaraciones condicionales. Podemos verificar si el usuario existe. Si lo hace, entonces configuraremos al usuario. Si no existe, entonces configuraremos al usuario para que sea igual a nulo y donde vamos a establecer esto, bueno, vamos a crear una ref arriba en la parte superior de nuestro archivo. Justo debajo del resto decimos const. Los datos de usuario son iguales a una ref. Por defecto, estableceremos esto para que sea igual a nulo. De vuelta a nuestro observador, podemos colocar en unas declaraciones condicionales y verificar si el usuario existe. Se trata de un usuario que pasará a nuestra función. Si están conectados, estableceremos valor de los datos del usuario para que sea igual al de este usuario. De lo contrario el usuario no está logueado así que por lo tanto, podemos devolver los datos del usuario para que sean iguales a nulos. Luego devolvamos estos datos de usuario de nuestro componible. Esto va a ser utilizado en diversos componentes. Uno de ellos pueden ser los componentes de inicio de sesión para asegurarnos de que solo mostramos el botón relevante en la parte superior. Salta al inicio de sesión, importa esto en la parte superior y luego baja a nuestros dos primeros botones que vemos aquí. Solo queremos mostrar el botón de inicio de sesión si no hay presencia de datos de usuario. Pasando VF dirá si no hay datos de usuario. Si no tenemos un usuario, ofreceremos la oportunidad de iniciar sesión, si no pasa VL donde el usuario está actualmente conectado y tienen la opción de cerrar sesión. Ahora esto nos dará la oportunidad de probar esto correctamente. Pero justo antes de que realmente sigamos adelante y probemos esto, ahora tenemos un choque sin dos nombres de variables. Sólo voy a cambiar este para que sea datos de formulario. Copiemos esto y lo usaremos dentro de nuestro formulario. Formar datos punto correo electrónico, lo mismo para la contraseña y también cambios en nuestras funciones de inicio de sesión y registro. Creo que esto está en todas partes. Vamos a verificar esos datos de usuario y solo tenemos esto en nuestras dos ubicaciones. Bien, ahora podemos seguir adelante y probar esto poniendo al usuario en la parte superior de la plantilla dentro de las llaves decimos datos del usuario, el correo electrónico pero recuerda a veces no vamos a tener acceso a este correo porque los datos del usuario serán iguales a nulos. Frente al signo de interrogación para que esto falle silenciosamente si tenemos algún error. Si no está familiarizado con este signo de interrogación, este es el encadenamiento opcional de JavaScript. Esto detendrá que aparecer un error si no hay correo electrónico presente, que será el caso si el usuario se desconecta. Digamos que esto vaya al navegador. Vemos que actualmente estamos conectados, el correo electrónico es sobre el clic superior Cerrar sesión. Esta n se elimina así que intentemos iniciar sesión una vez más. Ahí está nuestro correo electrónico ahora devuelto. Entonces, para eliminar esta salida de la plantilla y ahora todo parece estar funcionando correctamente. Este es ahora el final de la sección de autenticación. Enhorabuena por llegar a esta etapa. Aún no hemos terminado, aunque tenemos muchas más características para agregar a nuestro proyecto, que se agregarán en las próximas secciones. 47. Estilizar la vista sobre: Próximamente tenemos algunos toques finales a nuestro proyecto. Vamos a comenzar con algunos estilos CSS para esto acerca de la vista. el momento, no se ve muy bien debajo del encabezado. Pasemos a esta sección, que está en las vistas, sobre la vista, seleccionamos la vista anterior, y luego podemos crear una sección de estilo en la parte inferior. Echemos un vistazo a qué clases tenemos. Eso es todo lo que tenemos este envoltorio que envuelve todo nuestro contenido con la clase de aproximadamente. Después tenga la sección de introducción, y esta sección incluye nuestro título y nuestra imagen. Es básicamente todo lo que está por encima de esta área de enlaces. Empecemos con esta clase de aproximadamente. Comenzaremos configurando el tipo de visualización para que sea flexible, y nos aseguraremos de que esto esté en una dirección vertical configurando la dirección de flexión para que esté en una columna. El uso del flexbox y esta dirección vertical nos permitirá entonces alinear los artículos en el centro. Alinee los elementos en el centro, lo que luego empujará el contenido al centro de la página. Este es el envoltorio de página completa. A continuación tenemos la sección de introducción. La sección de introducción, como acabamos de descubrir, es todo hasta esta imagen, que es imagen y las dos líneas de texto anteriores, así que también estableceremos la dirección flex para que sea columna en esta. La pantalla, o dirección de flexión de la columna. Actualmente, no verás ninguna diferencia si pasamos al navegador. Esto se debe a que vamos a hacer uso de una media query muy pronto, y hacer que esto aparezca en fila en la pantalla más grande. Actualmente, esto se aplicará a la pantalla pequeña, y luego en la vista de pantalla más grande, configuraremos esto para que sea una dirección flexible de fila. Coloca dentro de la regla de medios artísticos donde apuntaremos que el ancho mínimo sea de 900 píxeles, y luego podemos anular nuestra sección de introducción estableciendo la dirección de flexión para que sea una fila. Estos aparecen en una fila. Entonces por debajo de 900 píxeles, esto volverá a la dirección de la columna. Ahora saltemos de nuevo a la sección de introducción. Si nos desplazamos hacia arriba hasta la sección completa dentro de aquí, tenemos este div con la clase de envoltorio de texto info junto a la imagen. Efectivamente, solo tenemos dos secciones con las que debemos trabajar. De nuevo podemos hacer uso del flexbox para establecer tanto la izquierda como la derecha para que sean del mismo tamaño. También necesitamos agregar algo de espaciado y alineación, y lo haremos justo fuera de nuestra consulta de medios. Primero, la imagen era info underscore image también capturará nuestro envoltorio de texto info, info IMG, y también envoltorio de texto info. Dado que los padres de intro tienen el tipo display de flex, los elementos hijos pueden hacer uso de flex, y configuraremos ambos para tratar de tomar exactamente el mismo valor. Algún relleno para dar ambos de estos algún espaciado de una RAM. Alinee el texto con text-align en el centro, y luego para establecer la alineación vertical. También podemos hacer uso de align self. Alinearse en el centro. Nuevamente, esto funciona porque los padres de intro tienen este tipo de display de flex, y align self funcionará porque este es un elemento hijo del flexbox. Esto se encarga de esta sección. Vamos a desplazarnos hacia arriba. El siguiente es el envoltorio más info. Esta es la sección de todos nuestros enlaces y este título justo aquí. Volvamos a apuntar a esta sección fuera de la consulta de medios. Más info envoltorio en exhibición. Nuevamente, haremos uso del flexbox. Estableceremos la dirección de flexión para que esté en una línea de texto de columna hacia el centro. Podemos hacer que esto se destaque agregando algo de color de fondo. Haz esto un poco diferente del color blanco actual. Vamos por doble F, doble E, D2. Actualmente, este fondo solo rodeará el contenido, por lo que para hacer de este el ancho completo para la página, podemos cambiar el ancho para que sea 100 VW. Ahí vamos. Para darle a esto algo de espaciado, solo agrega un poco de relleno de una RAM. También podemos cambiar demasiado el fondo de esta sección, así que copiemos esto. Si volvemos a la fuente, los activos, el main.css. De hecho, solo podemos eliminar el fondo para el bloque de información y esto ahora coincidirá con el resto del contenido. Intentemos sobre las secciones y también la página de inicio, y asegúrate de que no tendrás problemas. De hecho aquí, sí necesitamos agregar el fondo. Pega esto en. Ahí vamos. Esto ahora funciona para nuestros dos puntos de vista. 48. Completar la vista de administrador: Continuemos con nuestros toques finales dentro de la sección de administración. Aquí dentro, vamos a hacer uso de la caja flexible y colocar en la nueva pizza en los componentes del menú uno al lado del otro en la vista más grande. Vamos a entrar en la vista admin, que se encuentra en la carpeta views. Por el momento no tenemos mucho contenido, solo mostramos el encabezado de nivel tres y los tres componentes, así que esa es la sección de nuestra nueva pizza y también el componente pizzas. Corta esto, envuélvalos dentro de un div, pégalo de nuevo y dale a este div la clase de fila. En la parte inferior, crea la sección de estilo. También alcanzaremos esto a nuestros componentes. Seleccione la fila. En la sección inicial aquí, estableceremos el tipo de visualización para que sea flex, una nueva flex-direction para ser columna. Esto funcionará en la vista de pantalla pequeña. Yo encogería esto y podemos verlas en la dirección de la columna. Luego configura una consulta de medios con la regla de medios artísticos donde aplicaremos todos los estilos dentro de aquí sobre 900 píxeles. Seleccione nuestra fila, o puede anular la dirección flexible para que sea una fila. Las pantallas más pequeñas tendrán una columna. El estiramiento debe ser superior a 900 píxeles. Estos ahora están uno al lado del otro. También necesitamos que ambos componentes sean un poco más anchos, para que abarquen el tamaño completo de la página. Podemos entrar en la nueva pizza y también pizzas dentro de los componentes bajo Admin. Este tiene la clase de sección admin. Si vamos a pizzas, podemos ver que ésta también lo hace. Vamos a entrar en la carpeta assets, en main.css. Haz una búsqueda y ya tenemos la referencia de la sección admin justo aquí. Establezca el valor de flex para que sea igual a uno. Todas estas secciones intentarán ocupar el mismo espacio disponible. Siendo esta un área de administración, también queremos introducir algunas medidas para asegurarnos de que solo las personas correctas puedan ver esta página. Por ahora, nos aseguraremos de que hayan iniciado sesión importando primero al usuario. Volver a la vista de administración, en el guión. Necesitamos importar nuestro uso de composable donde podamos extraer y almacenar dentro de una constante nuestros datos de usuario. Recuerde, los datos del usuario son iguales a nuestro objeto que contiene toda la información del usuario o son iguales a nulos. Utilizamos Auth para llamar a nuestra función. Por lo tanto, los datos de usuario se pueden usar con alguna representación condicional para mostrar y ocultar el contenido de la página. Vamos a agarrar todo lo que hay dentro de nuestra plantilla, coloquemos en un div como envoltorio, agreguemos los contenidos de nuevo dentro, luego hagamos uso de renderizado condicional con v-if, donde podemos verificar si los datos del usuario están presentes. Si hemos iniciado sesión, deberíamos poder ver toda la sección de administración. Si no, crea un elemento p, que será para la sección v-else, con el mensaje de ti debe ser admin para ver esta área. Ahí está nuestro mensaje. Antes de iniciar sesión, solo agregaremos un poco de estilo a esta sección agregando una clase de warning_msg. Vamos a darle estilo a esto en solo un segundo. Pero antes de hacer eso, también podemos agregar un mensaje de bienvenida si el usuario está conectado. Justo por encima del encabezado de nivel 3, agrega algo de texto con la clase de user_email. Los textos son, bienvenidos. Luego dentro de las llaves dobles, podemos acceder a nuestros datos de usuario.email. Recuerda que los datos del usuario no siempre van a ser un objeto, veces pueden ser nulos. Por lo tanto, podemos hacer uso del encadenamiento opcional de JavaScript con un signo de interrogación para mostrar solo este correo electrónico si está configurado. Por último, el estilo para nuestro correo electrónico de usuario y el mensaje de advertencia van fuera de la media query, por lo que user_email y también el warning_msg. Margen de un rem simplemente empuja esto fuera de la esquina. Intentemos iniciar sesión. Todo el mundo, el contenido ya es visible y también podemos ver un mensaje de bienvenida en la parte superior. También solo para empujar sobre el encabezado nivel 3, también podemos aplicar la misma cantidad de margen. Añadir el H3. Bien, esto se ve mucho mejor ahora. Pasemos a nuestro botón de registro y hagamos clic en este. Esto ahora entra en vigor y elimina nuestra sección de administración de la vista. 49. Restringir nuevas pizzas: Otra comprobación que podemos hacer es ver si nuestro usuario está conectado antes de que pueda agregar una nueva pizza a la base de datos. Actualmente, no tenemos ninguna forma de verificar si el usuario es un usuario habitual o un administrador. Pero volveremos a esto más tarde, y la razón por la que haremos esto es una vez más importar nuestros datos de usuario a nuestros nuevos componentes de pizza. Componentes, Admin, Pizza nueva. Coloque una importación en la parte superior de nuestro componible. Importar, useAuth desde nuestro archivo componible. Entonces podemos extraer los datos del usuario. Si nos desplazamos hacia abajo, podemos ver que tenemos esto Agregar funciones en nuestra nueva pizza a la base de datos. Antes de agregar esto, podemos verificar si el usuario está conectado. Diremos si no hay datos de usuario, y como estamos dentro del script, también necesitamos acceder al valor. Si esto es falso, es decir, esto será igual a nulo si el usuario no está conectado. Ahora podemos regresar de esta función antes de agregar nuestra pizza a la base de datos. En las circunstancias actuales, va a ser bastante difícil probar esto. Porque si nos cerraron la sesión, actualmente no podemos ver el componente Agregar nueva pizza para darle una oportunidad a esto. Lo que podemos hacer como medida temporal es desactivar el renderizado condicional dentro del admin. Salta a la vista de administración. Luego dentro de las plantillas comentaremos las declaraciones if, el div de cierre, y también tendremos que hacer el área v-else. Esto ahora nos da acceso a la sección de administración cuando actualmente no estamos registrados. Vamos a agregar, y ahora cada vez que intentamos agregar una pizza nueva, no vemos el mensaje para decir que esto ha sido agregado, y tampoco vemos esto agregado en la sección de menú. Bueno. Con todo esto funcionando, ahora podemos restablecer el renderizado condicional dentro de la vista admin. No hemos iniciado sesión, así que todo el contenido debería desaparecer. A continuación, nos quedaremos con este tema del objeto usuario agregándolo a nuestros pedidos. 50. Agregación del usuario: Los próximos pasos están todos relacionados con todos los pedidos. Lo que vamos a hacer es asegurarnos de que el objeto de usuario se coloca en nuestro pedido antes de empujar a la base de datos. También nos aseguraremos de que el usuario haya iniciado sesión antes de crear un nuevo pedido, y para ello saltaremos a la cesta de uso composable y en parte de un usuario. Composables, useBaskets, y este archivo contiene la función AddNeWorder. Pero antes de que podamos probar si el usuario está conectado, también necesitamos importar los datos del usuario de nuestro composable off. Así que cualquier componible se puede importar dentro de otro componible, y esto hace que estos archivos sean realmente flexibles. Al igual que hacemos en cualquiera de los componentes, podemos importar nuestro componible. Esto es UseAuth, y esto es. /, useAuthF ya que esto está en el mismo directorio y luego en nuestra función, podemos extraer nuestros datos de usuario de nuestra función useAuth. El ID aquí es que verificaremos si hay un usuario conectado. Si hay, los agregaremos al pedido, si no, agregaremos algo de buck un mensaje de usuario para iniciar sesión. Y necesitamos almacenar este mensaje dentro de una variable o una constante. Entonces const, signInMessage es igual a una ref con una cadena vacía como el valor inicial hasta la función addNeWorder y primero podemos verificar si el usuario está conectado. Dentro de la sección try, diremos if, userData.value, abre las llaves. Si esto es cierto, queremos ejecutar algún código dentro de aquí, si no lo es, crearemos una sección L. La sección L actualizará el SignInMesage, por lo que esto devolverá al usuario un mensaje de favor inicie sesión para realizar un pedido. Entonces, en nuestra sección if, podemos copiar o recortar la sección de pedido hasta el texto de nuestra cesta sin el contenido original. Luego coloca esto dentro de la sección if, así esto solo se ejecutará si el usuario está conectado. Esto es todo lo que tenemos que hacer por ahora dentro de la función, luego podemos devolver nuestro SignInMesage, que luego se puede importar dentro de nuestra vista de menú. La parte superior, ya tenemos acceso para usar la canasta así que solo podemos ingresar al final nuestro mensaje de inicio de sesión fue. Entonces, renderiza este mensaje dentro de nuestra plantilla, así que desplázate hacia abajo hasta el botón de orden, que está en la sección de cesta, busca este botón con el botón de texto de lugar, y luego justo encima de este, agrega un nuevo elemento P, salidas, nuestro SignInMesage. Ahora podemos probar esto cuando iniciamos sesión y desconectamos. Como se nos ha pedido que iniciemos sesión, actualmente no estamos conectados. Podemos confirmarlo con el administrador. Intentemos hacer un pedido, haga clic en algunos artículos. Ahí vamos. Por favor, inicie sesión para realizar un pedido, haga clic en nuestro modelo y podemos iniciar sesión. Inicia sesión, haz clic en “Realizar pedido” una vez más y esto ya está todo trabajado. Si trabajó, sin embargo, cierre sesión y borre la página y luego agregue las pizzas nuevas a pedido. Nuevamente, si intentamos hacer un pedido, todavía veremos nuestro mensaje justo aquí. Es posible que hayas notado desde antes que tan pronto como iniciemos sesión a través del modal, este mensaje seguirá intacto. Solo demostrémoslo. Si iniciamos sesión una vez más, haga clic en “Iniciar sesión” manteniendo intacto este mensaje puede causar cierta confusión al usuario. Pueden pensar que aún necesitan iniciar sesión. Todo esto significa algún error con el proceso de inicio de sesión. Para aclarar esto lo que podemos hacer es, view proporciona un método watch que activará una función de devolución si hay algún cambio a un estado reactivo como es nuestro usuario. Lo que esto significa en la práctica es que si volvemos a nuestra cesta de uso componible en la parte superior, entonces podemos ver nuestros datos de usuario y tan pronto como ocurra algún cambio, podemos ejecutar una función de devolución de llamada. El vigilante se ha importado automáticamente desde el paquete de visualización. Si el tuyo no sucedió automáticamente, asegúrate de agregar esto en. Entonces cada vez que ocurre un cambio a otros datos de usuario, la función se ejecutará donde podremos borrar nuestro signinMessage.value estableciendo esto igual a una cadena vacía. Volvamos a nuestro menú y refresquemos. Podemos ver que todo esto entró en vigor en cualquier nueva pizza. Hacer un pedido. Esto está bien porque hemos iniciado sesión, cerrar sesión, hacer un pedido cuando se desconecta y vemos nuestro mensaje de error. Ahora, si intentamos iniciar sesión una vez más, inicia sesión. Tan pronto como esto sucede, luego eliminamos el mensaje de error para que el usuario ahora sea libre de hacer su pedido. Bien, esto ahora nos deja con la tarea final de sumar al usuario al pedido. Volvamos a la cesta de uso composable y luego bajemos a la función AddneWorder. Justo dentro de la sección if, recuerda que los datos del usuario, que recuperamos de firebase, contienen mucha información y muchas de las propiedades que no necesitamos. Por simplicidad, voy a crear un nuevo objeto de usuario y solo colocando el ID del usuario y el correo electrónico, la propiedad ID, podemos obtener de UserData.Value.UID y correo electrónico del usuario. Este es del UserData.Value.email. Entonces a continuación, cuando creamos nuestro pedido, también podemos pasar en el usuario. Ahora vamos a guardar esto. Intentemos hacer un nuevo pedido. Haz nuestro pedido, entra en la consola, en nuestra base de datos de Firestore y consulta los pedidos. Si nos desplazamos hacia abajo, podemos ver que el último pedido que acabamos colocar también tiene nuestro objeto de usuario adjunto. 51. Filtros y propiedades globales: Te das cuenta si entramos en la sección del menú, comienzas a agregar algunas pizzas a nuestra canasta. Si empezamos a aumentar la cantidad, aumentemos esto hasta seis y veamos que tenemos algún formato inconsistente. El primero se reduce a un decimal, el segundo es de dos decimales y el total del orden está todo desordenado. Si has usado Vue versión 2 en el pasado, es posible que hayas usado algo llamado filtro. Un filtro estaba disponible para proporcionar formato de texto simple y era ideal para crear cosas como filtros de moneda. Sin embargo, aunque en Vue versión 3, los filtros ya no están disponibles. Pueden ser reemplazados por algo así como un método o una propiedad computada dentro de un componente. Sin embargo, si quieres que esto esté disponible globalmente para que podamos reutilizarlo también podemos hacer uso de un filtro como setup en Vue 3 accediendo a algo llamado propiedades globales. Propiedades globales es un objeto al que podemos agregar, que está disponible en todos nuestros componentes para que podamos reutilizar. Sin embargo, ten cuidado de no exagerar las cosas y hacer que todo sea accesible a nivel mundial. Pero un filtro de moneda que podamos usar múltiples componentes es un buen caso de uso. Pasemos al main.js y configuremos esto. Así que justo debajo donde creamos nuestra aplicación, manera de hacer esto es llamar a app.cong.global.properties y luego podemos darle a esta propiedad nombre como dark.mode y vamos a establecer esto igual a true. Ahora podemos acceder dentro de cualquiera de nuestras plantillas es propiedad DarkMode por lo que actúa como una variable. Pasemos a la vista de menú y en cualquier lugar dentro de esta plantilla está bien. Sacamos esto dentro de las llaves dobles, ahora vemos esto arriba en la parte superior. Este es un muy buen caso de uso para cadenas simples o booleanos así y podemos acceder a estos en cualquier componente. También podríamos configurar tantos de estos como quisiéramos, podríamos simplemente duplicar esto y podríamos crear diferentes variables. O también podríamos agregar múltiples propiedades dentro de un objeto. Así que mantengamos esta sección pero eliminemos la variable, y lo que haremos es crear un objeto llamado filters y luego dentro las llaves podemos agregar tantos filtros como quisiéramos. Para nuestro caso de uso crearemos una función llamada FormatMoney. FormatMoney necesita tomar el valor que desea formatear y luego podemos devolver el nuevo valor que está formateado. Una forma sencilla de hacer esto es llamar a value.ToFixed y esto arreglará esto a dos decimales. También como se mencionó, ya que este es un objeto también podemos agregar múltiples propiedades dentro de aquí. Pero aunque FormatMoney es todo lo que necesitamos así que volvamos a nuestra vista de menú y podemos reemplazar los precios con nuestro filtro. Si quisieras podrías agregar esto a la sección del menú pero actualmente nuestros números ya están agregados a la base de datos por lo que esto siempre debería mostrarse bien. El problema ocurre cuando agregamos varias pizzas y comenzamos a multiplicar números. Lo que podemos hacer es bajar a la sección de canasta, tenemos el total del pedido, tenemos este precio justo aquí, así que en cambio, lo que queremos hacer es cortar esta multiplicación , acceder a nuestros filtros.FormatMoney. FormatMoney era una función que toma un valor para formatear así que tenemos que pasar también esto en el que está la multiplicación que acabamos de cortar. Estos son los totales de línea y también necesitamos hacer el total del pedido. Así que corta esto entonces accederemos a filtros.ForfMatMoney, pega esto de nuevo en. Probemos esto. Suba la cantidad y se puede ver cuando pasamos seis cual era el problema antes, todos estos correctamente formateados a dos decimales. Dado que nuestro filtro es un objeto global también podemos usar en otros componentes donde mostramos valores monetarios. Vamos a saltar a los componentes, al administrador y al orders.view. Salta a nuestra mesa, igual que en la canasta también estamos multiplicando el precio por la cantidad, así podemos hacer lo mismo aquí podemos decir filtros.FormatMoney. Vuelve a pasar esto, probemos esto en la sección de administración. Esto también se ve bien si miramos todos los totales por encima de la derecha. Esta es una forma realmente simple pero útil de repetir tareas simples a lo largo de nuestra aplicación. el formato de moneda es un poco Sin embargo, el formato de moneda es un poco básico y podemos mejorar esto usando el objeto JavaScript Intl. Esta es la API de internacionalización de JavaScript que proporciona formato de número, hora y fecha basado en el idioma , entre otras características. Mejoremos esto volviendo a nuestro main.js. Podemos reemplazar nuestro ejemplo actual justo después la sentencia return y declararemos que queremos un nuevo Intl.NumberFormat. NumberFormat es uno de los muchos métodos que están disponibles en los objetos Intl y este NumberFormat permite el formato numérico sensible al idioma , lo cual es excelente para la moneda. A continuación, dentro de la cadena al final el método de formato que toma en el valor que desea formatear. En nuestro caso, todavía estamos haciendo uso de este valor que se pasa a la función y además de esto el método de formato numérico también tomará algunos argumentos para especificar qué configuración regional estamos usando y también algunas opciones. Primero, la configuración regional del usuario final que establece el estilo de formato de la moneda. La razón por la que queremos hacer esto es porque la moneda se muestra y se formatea de manera diferente en diferentes partes del mundo. Por ejemplo, algunos países utilizan decimales o comas como separadores. Digamos que 10,000 podrían verse así o esto y también algunos países usan símbolos especiales también. Si actualmente guardamos esto y pasamos al navegador, actualicemos. Podemos ver sin agregar ninguna opción diferente dentro de aquí por defecto mi moneda es a dos decimales y usa el punto decimal en el medio. Pero si agregamos por ejemplo, una configuración regional alemana que es un valor de cadena de guión sobre caso DE, tan pronto como guarde esto, esto se actualiza y se separa con una coma en su lugar. Mi caso de uso voy a cambiar esto para que sea inglés, guión GB, que debería revertir esto de nuevo al decimal. Después separados por una coma también podemos agregar un objeto options. Dentro de este objeto podemos pasar en varias cosas como el estilo y las opciones de moneda. El estilo va a ser igual a la cadena de moneda y luego también necesitamos pasar en la moneda que quieras formatear. Esta puede ser cualquier moneda como Euros, EUR, podemos ver esto justo aquí, también eliminar este símbolo $ en solo un momento, puede ser $, creo USD. Ver EU justo aquí, pero el mío va a estar en libras. Además de la moneda esto también se puede utilizar para otras cosas también. Podemos incluir unidades de medida y también porcentajes, pero estas opciones son excelentes para nuestro caso de uso y también siéntase libre de configurarlas con su moneda preferida. Solo para terminar las cosas volvamos a la vista de puntos de pedidos. Vamos a mover el símbolo de moneda que tenemos codificado en su lugar por el menú, también tenemos que hacer lo mismo aquí y también aquí. La vista de menú, elimine esto. Casi ahí ahora solo tenemos la sección de menú que está justo arriba. Esta es la opción sin precio, podemos mover el símbolo de moneda apagar esto, acceder a nuestros filtros, tenemos FormatMoney , pegar esto de nuevo. Ahora nuestro formato de número ya ha entrado en vigor. 52. Actualizaciones de Pizza en tiempo real: Cuando actualizamos nuestro sitio, algunas cosas se actualizan de inmediato y algunas cosas no. Por ejemplo, si vamos a nuestro Admin e intentamos agregar una pizza nueva, solo toda la información ficticio por ahora. Haga clic en “Agregar”. Entonces esta nueva pizza no se actualiza automáticamente en el menú hasta que pulsamos “Refrescar”. Pero si eliminamos una pizza haciendo clic en esta X, el ítem se elimina del Admin. ¿Por qué crees que sucede esto? Bueno, para ver esto, necesitamos echar un vistazo a algunos archivos con más detalle. Primero, si saltamos a la sección admin de los componentes y luego abrimos Newpizza.vue, dentro de aquí tenemos esta función para agregar una nueva pizza a nuestra base de datos. Todo lo que hacemos aquí es proporcionar algunas comprobaciones y luego agregamos nuestro documento a nuestra base de datos, actualizamos el mensaje. Entonces si esto tiene éxito, todo está bien. La pizza se almacena en la base de datos, pero nuestra aplicación no es notificada desde Firebase de ninguna adición. Sin embargo, sin embargo, si pasamos a lo que usamos pizzas componibles y echamos un vistazo a nuestra función GetPizzas. Actualmente lo que tenemos que hacer después de haber agregado nuestra pizza es refrescar la página porque esto volverá a la página porque esto volverá llamar a nuestra función GetPizzas, por lo tanto actualizando el menú de la derecha. Éste, parece tener sentido, pero recuerda cuando borramos una pizza, la aplicación se actualizó con los cambios. La diferencia entre estas dos situaciones es que si entramos en nuestro usePizzas componibles y echamos un vistazo a DeletePizza, la diferencia clave aquí es que tan pronto como hayamos eliminado la pizza, luego una vez más llamamos a nuestra función GetPizzas que luego pasará la información correcta a nuestros componentes del menú. Si quisiéramos, cuando añadimos una pizza nueva, también podríamos volver a llamar a nuestra función GetPizzas. Pero también hay una mejor manera de hacer las cosas y esto es usar una funcionalidad en tiempo real de Firebase. Lo que esto significa es que tan pronto como realizamos algún cambio en nuestra base de datos, la aplicación es notificada de estos cambios. Por ejemplo, cuando pasamos al Admin y agregamos una pizza nueva, hacemos clic en el botón Agregar y esto luego se empuja a nuestra base de datos. Tan pronto como esto haya sido exitoso, Firebase comunicará a nuestra aplicación por persona la información actualizada. Entonces nuestro menú se actualizará automáticamente. Esto lo hacemos con un método llamado on snapshot. Pasemos a todos los usosComposable de pizza. Podemos importar esto desde nuestro firestore, así que onSnapshot, voy a hacer esto dentro de GetPizzas. Lo que haremos ahora es comentaremos todo el código existente que usamos para tomar nuestras pizzas de el código existente que usamos para tomar la base de datos y lo reemplazaremos con el método OnSnapshot. Al pasar instantáneas y onSnapshot también se incluye la referencia de la colección de pizza que se almacena en DBPizzaRef. esto le sigue una función que vamos a ejecutar cada vez que haya un cambio dentro de la base de datos. La función va a tomar en los docs que se nos devuelve. Como tenemos un nombre coincidente de docs justo aquí con los docs que estamos recorriendo desde antes, ahora podemos descomentar esta sección, poner esto y luego pegar esto dentro de nuestra función. Esto es hacer exactamente la misma acción que antes. Estamos recuperando los documentos. Estamos recorriendo cada uno, estamos creando nuevos objetos de pizza. Luego debajo para AllPizzas ref. Tan pronto como se actualice, actualizará todas las vistas o componentes que se basan en estos datos. Así que vamos a darle una oportunidad a esto en el admin. Entonces saltaremos a Agregar nueva pizza, dar clic en “Agregar”, y en cuanto hagamos esto, nuestra aplicación se actualiza, pero sí vemos un pequeño problema. No solo obtenemos las pizzas gratuitas que se devuelven de la base de datos, sino que estas también se suman a las dos existentes que ya tenemos. Una forma sencilla de hacer esto es limpiarlo nuestro arreglo AllPizzas antes de recuperar la información. Si entramos en la sección try, podemos ver que ya hemos limpiado el valor existente y ciertamente ha sido una matriz vacía. Todo lo que tenemos que hacer es mover esto dentro de nuestra instantánea. Guardemos esto y refresquemos como nuestras pizzas existentes gratuitas. Agreguemos uno más. Haga clic en “Agregar” y ahora nuestra aplicación ya está notificada de cualquier cambio. Con esto en mente, también podemos volver a nuestra función DeletePizza donde podríamos eliminar el manual, llamada GetPizzas. Voy a echar un vistazo a nuestra función DeletePizza. Ya no necesitamos llamar manualmente a GetPizzas, esto se hace por nosotros. Ahora si también eliminamos pizza y nuestro administrador ahora todavía está actualizado cuando eliminemos una pizza y viniendo a continuación también repetirá este proceso para nuestros pedidos actuales. 53. Actualizaciones de pedidos en tiempo real: Para actualizar los pedidos en tiempo real, sigue el mismo patrón que hicimos con las pizzas. Primero, pasamos a usar orders.js dentro del Composable. En la parte superior, necesitamos importar nuestro propio método de instantánea. Entonc