<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="gl">
	<id>http://web.iesrodeira.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xavi</id>
	<title>Wiki do Ciclo ASIR do IES de Rodeira - Contribucións do/a usuario/a [gl]</title>
	<link rel="self" type="application/atom+xml" href="http://web.iesrodeira.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xavi"/>
	<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php/Especial:Contribuci%C3%B3ns/Xavi"/>
	<updated>2026-04-21T11:45:04Z</updated>
	<subtitle>Contribucións do/a usuario/a</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Introducci%C3%B3n_%C3%B3s_Servlets_e_JSP&amp;diff=3427</id>
		<title>Introducción ós Servlets e JSP</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Introducci%C3%B3n_%C3%B3s_Servlets_e_JSP&amp;diff=3427"/>
		<updated>2025-10-11T16:01:44Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Estructura dunha Aplicación Web con Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Conceptos Xerais ==&lt;br /&gt;
A tecnoloxía Java abrangue dende a programación de aplicacións tradicionais ata o desenvolvemento de aplicacións web tanto con execución no cliente (applets) como no servidor (Servlets, JSP (&#039;&#039;Java Server Pages&#039;&#039;), EJB (&#039;&#039;Enterprise JavaBeans&#039;&#039;)).&lt;br /&gt;
&lt;br /&gt;
Os &#039;&#039;&#039;&#039;&#039;applets&#039;&#039;&#039;&#039;&#039; permiten a descarga dun servidor web dunha aplicación Java e a súa execución incrustada dentro dun navegador web que teña instalado un entorno de execución (JRE - &#039;&#039;Java Runtime Environment&#039;&#039;) cunha serie de limitacións de seguridade, en particular:&lt;br /&gt;
* Un applet non poderá acceder o sistema de ficheiros local.&lt;br /&gt;
* Un applet non poderá establecer unha comunicación de rede cunha dirección distinta da que proven o applet.&lt;br /&gt;
Estas limitacións de seguridade (e outras) únicamente poden deshabilitarse mediante unha autorización expresa do usuario a través do uso de applets certificados mediante sinatura dixital.&lt;br /&gt;
Os &#039;&#039;&#039;&#039;&#039;Servlets e JSP&#039;&#039;&#039;&#039;&#039; son a parte de programación no lado do servidor de Java. &lt;br /&gt;
&lt;br /&gt;
Os Servlets e JSP son clases Java que producen saída HTML que se envía o cliente web, e que poden recibir como entrada os datos suministrados ó servidor por parte dos clientes. A principal (e prácticamente única) diferencia entre un servlet e unha páxina JSP é que mentras que os servlets son clases Java xa compiladas, os JSP son ficheiros que poden incluír parte de Java e parte de HTML. O servidor transformará esa páxina JSP nunha clase compilada similar a un servlet. &lt;br /&gt;
&lt;br /&gt;
Para realizar programación no lado no servidor con Java é necesario dispor dun servidor que soporte a execución de Java, o coñecido como &#039;&#039;Servidor de Aplicacións Java&#039;&#039;.&lt;br /&gt;
Existen moitos e moi coñecidos servidores de aplicacións Java. Nós imos a traballar coa implementación da fundación [[gal:Apache|Apache]] &#039;&#039;Tomcat&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== O Servidor Tomcat ==&lt;br /&gt;
=== Introducción a Tomcat ===&lt;br /&gt;
[[Imaxe:Tomcat_admin.png|right|thumb|Estructura dun Tomcat]]&lt;br /&gt;
[[gal:Tomcat|Tomcat]] é a implementación dun servidor de Servlets e JSP feita pola fundación Apache. Se acolle a unha licencia libre ([http://www.apache.org/licenses/LICENSE-2.0 Apache License]) e é un dos servidores de servlets e JSP máis utilizados.&lt;br /&gt;
A continuación explicaremos alguns térmos de tomcat:&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Server&#039;&#039;&#039;&#039;&#039;: Cando falamos do &#039;&#039;Server&#039;&#039;, nos estaremos a referir ó servidor tomcat completo.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Connector&#039;&#039;&#039;&#039;&#039;: Un &#039;&#039;Connector&#039;&#039; manexa a comunicación co cliente. Exemplos de &#039;&#039;Connector&#039;&#039; son &#039;&#039;&#039;Coyote&#039;&#039;&#039; que se encarga de dar servicio web, e &#039;&#039;&#039;jk3&#039;&#039;&#039;, que implementa o protocolo AJP utilizado para conectar o tomcat cun servidor web como Apache.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Engine&#039;&#039;&#039;&#039;&#039;: Un &#039;&#039;Engine&#039;&#039; representa o procesamento das peticións para un &#039;&#039;Service&#039;&#039; específico. Coma un &#039;&#039;Service&#039;&#039; pode ter varios &#039;&#039;Connectors&#039;&#039;, encárgase de procesar as peticións de todos eles e de enviarlles de volta a resposta. Un &#039;&#039;Engine&#039;&#039; pode ter un ou varios &#039;&#039;Host&#039;&#039;, cada un representando un host virtual. Dentro de un &#039;&#039;Service&#039;&#039; ten que existir un e só un &#039;&#039;Engine&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Service&#039;&#039;&#039;&#039;&#039;: Representa a combinación de un ou máis &#039;&#039;Connectors&#039;&#039; que comparten un &#039;&#039;Engine&#039;&#039; para procesar peticións. Un &#039;&#039;Server&#039;&#039; pode ter un ou máis &#039;&#039;Services&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Host&#039;&#039;&#039;&#039;&#039;: Un &#039;&#039;Host&#039;&#039; é unha asociación de un nome de host (web.iesrodeira.com) co servidor tomcat, é o encargado de manexar todas as peticións para un host virtual particular. Un &#039;&#039;Engine&#039;&#039; pode ter varios &#039;&#039;Host&#039;&#039;, e o &#039;&#039;Host&#039;&#039; pode soportar varios alias.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Context&#039;&#039;&#039;&#039;&#039;: Un &#039;&#039;Context&#039;&#039; representa unha aplicación web, é o encargado de procesar as peticións para unha aplicación web. Un &#039;&#039;Host&#039;&#039; pode ter moitos &#039;&#039;Context&#039;&#039;, cada un cun nome único.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Realm&#039;&#039;&#039;&#039;&#039;: Un &#039;&#039;Realm&#039;&#039; representa unha base de datos que conten usuarios, passwords e &#039;roles&#039; a desempeñar por  parte deses usuarios, que se utilizará para manexar a seguridade das aplicacións web. Se pode especificar un &#039;&#039;Realm&#039;&#039; dentro dun &#039;&#039;Engine&#039;&#039;, dun &#039;&#039;Host&#039;&#039; ou de un &#039;&#039;Context&#039;&#039;. Tomcat proporciona as clases &#039;&#039;JDBCRealm&#039;&#039; (Acceso á base de datos relacional mendiante o &#039;&#039;&#039;J&#039;&#039;&#039;ava &#039;&#039;&#039;D&#039;&#039;&#039;ata&#039;&#039;&#039;B&#039;&#039;&#039;ase &#039;&#039;&#039;C&#039;&#039;&#039;onnectivity), &#039;&#039;DataSourceRealm&#039;&#039; (Acceso a base de datos relacional JDBC mediante o &#039;&#039;&#039;J&#039;&#039;&#039;ava &#039;&#039;&#039;N&#039;&#039;&#039;ative &#039;&#039;&#039;D&#039;&#039;&#039;atabase &#039;&#039;&#039;I&#039;&#039;&#039;nterface ) , &#039;&#039;JNDIRealm&#039;&#039; (Acceso mediante un driver JNDI a un directorio [[gal:LDAP|LDAP]]) , &#039;&#039;MemoryRealm&#039;&#039; (acceso a un ficheiro en formato [[gal:XML|Xml]].&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Valve&#039;&#039;&#039;&#039;&#039;: Unha &#039;&#039;Valve&#039;&#039; representa unha compoñente que pasa a formar parte do procesamento da petición a un &#039;&#039;Engine&#039;&#039;, &#039;&#039;Host&#039;&#039; ou &#039;&#039;Context&#039;&#039;. Algunhas suministradas con tomcat son: &#039;&#039;AccessLogValve&#039;&#039; para xerar logs, &#039;&#039;RemoteAddrValve&#039;&#039; para analizar a dirección IP do cliente, &#039;&#039;RemoteHostValve&#039;&#039; para analizar o nome do host do cliente, &#039;&#039;SingleSignOn&#039;&#039; que permite a un cliente autenticarse unha única vez para acceder a todas as aplicacións web do host virtual, &#039;&#039;FormAutenticator&#039;&#039; que permite o procesamento de formularios de autenticación, e que teñen por defecto todos os &#039;&#039;Context&#039;&#039; que usen estes formularios.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Loader&#039;&#039;&#039;&#039;&#039;: O &#039;&#039;Loader&#039;&#039; é o encargado de cargar todas as clases dunha aplicación web. Todos os &#039;&#039;Context&#039;&#039; deben ter un &#039;&#039;Loader&#039;&#039;, si non se especifica se creará un por defecto.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Manager&#039;&#039;&#039;&#039;&#039;: A misión do &#039;&#039;Manager&#039;&#039; é o manexo das sesións HTTP. Si non se especifica un &#039;&#039;Manager&#039;&#039; se creará un por defecto.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;Resources&#039;&#039;&#039;&#039;&#039;: Os &#039;&#039;Resources&#039;&#039; representan recursos estáticos dende onde se cargarán as clases da aplicación web. Esto permite que a aplicación web poda estar situada nun ficheiro WAR ou nunha base de datos JDBC. Si non suministramos ningun &#039;&#039;Resources&#039;&#039; o sistema nos falicitará un que se encarga de coller as clases do sistema de ficheiros.&lt;br /&gt;
*&#039;&#039;&#039;&#039;&#039;GlobalNamingResources&#039;&#039;&#039;&#039;&#039;: Sirve para definir recursos JNDI (Java Native Database Interface) globales para o &#039;&#039;Server&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Instalación de Tomcat ===&lt;br /&gt;
;NOTA: A descripción da instalación é válida para unha &#039;&#039;Debian Etch&#039;&#039;, pero as diferencias con outras distribucións son mínimas&lt;br /&gt;
Comenzaremos por instalar os paquetes de tomcat e de administración:&lt;br /&gt;
&lt;br /&gt;
  apt-get install tomcat5.5&lt;br /&gt;
  apt-get install tomcat5.5-admin&lt;br /&gt;
&lt;br /&gt;
A continuación habilitamos as aplicacións de administración (&#039;&#039;manager&#039;&#039; e &#039;&#039;admin&#039;&#039;) creando un usuario cos roles necesarios no ficheiro &#039;&#039;/var/lib/tomcat5.5/conf/tomcat-users.xml&#039;&#039;. Este ficheiro e o utilizado polo &#039;&#039;Realm&#039;&#039; por defecto de tomcat.&lt;br /&gt;
&lt;br /&gt;
En Debian etch existe un problema na instalación destas aplicacións, xa que non configura correctamente os permisos de acceso á clase Struts que se necesitan para a súa execución. Polo tanto debemos engadir:&lt;br /&gt;
&lt;br /&gt;
  grant codeBase &amp;quot;file:/usr/share/struts1.2/struts.jar&amp;quot; {&lt;br /&gt;
     permission java.security.AllPermission;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
no ficheiro &#039;&#039;/etc/tomcat5.5/policy.d/50user.policy.&#039;&#039; ou en &#039;&#039;/etc/tomcat5.5/policy.d/01system.policy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Chegados a este punto debería ser posible carga-la páxina índice de tomcat en http://localhost:8180 e acceder tanto a documentación como as aplicacións de administración do tomcat (&#039;&#039;admin&#039;&#039;) e de manexo de aplicacións web (&#039;&#039;manager&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Configuración de Tomcat ===&lt;br /&gt;
O máis sinxelo é realizar as tarefas de administración do tomcat mediante a aplicación &#039;&#039;admin&#039;&#039; accesible dende a páxina de instalación. Os ficheiros de configuración máis importantes de tomcat atópanse en Debian Etch en &#039;&#039;/etc/tomcat5.5&#039;&#039;:&lt;br /&gt;
*&#039;&#039;&#039;server.xml&#039;&#039;&#039;: Configuración do Servidor. Aquí podemos definir por exemplo hosts virtuais. A configuración real está en &#039;&#039;/var/lib/tomcat5.5/conf/server.xml&#039;&#039;, e é máis simple utilizar a aplicación &#039;admin&#039; para manipular este ficheiro.&lt;br /&gt;
*&#039;&#039;&#039;web.xml&#039;&#039;&#039;: Valores por defecto para todas as aplicacións web. Cada aplicación web pode sobreescribir estes valores situando o seu propio arquivo &#039;&#039;web.xml&#039;&#039; na súa carpeta &#039;&#039;WEB-INF&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;policy.d/01system.policy&#039;&#039;&#039;: Permisos de seguridade para o tomcat. &lt;br /&gt;
*&#039;&#039;&#039;policy.d/02debian.policy&#039;&#039;&#039;: Permisos de seguridade para os &#039;&#039;jar&#039;&#039; incluídos nos paquetes Debian relacionados con java.&lt;br /&gt;
*&#039;&#039;&#039;policy.d/03catalina.policy&#039;&#039;&#039;: Permisos de seguridade para o &#039;&#039;Service&#039;&#039; Catalina, que é o &#039;&#039;Service&#039;&#039; por defecto de tomcat.&lt;br /&gt;
*&#039;&#039;&#039;policy.d/04webapps.policy&#039;&#039;&#039;: Permisos para todas as aplicacións web.&lt;br /&gt;
*&#039;&#039;&#039;policy.d/50user.policy&#039;&#039;&#039;: Permisos específicos que queira poñer o usuario.&lt;br /&gt;
&lt;br /&gt;
Nos permisos se indica a qué se ten acceso e mediante &#039;&#039;grant codeBase&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O Tomcat trae por defecto configurado un &#039;&#039;Service&#039;&#039; chamado &#039;&#039;Catalina&#039;&#039;, que ten como &#039;&#039;Host&#039;&#039; por defecto &#039;&#039;localhost&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Desenvolvemento de Aplicacións ==&lt;br /&gt;
Unha vez instalado o tomcat, será posible desenvolver aplicacións que utilicen Java para tratar a información e producir HTML de saída sempre que dispoñamos dun entorno de desenvolvemento Java (&#039;&#039;&#039;&#039;&#039;J&#039;&#039;&#039;&#039;&#039;ava &#039;&#039;&#039;&#039;&#039;D&#039;&#039;&#039;&#039;&#039;evelopment &#039;&#039;&#039;&#039;&#039;K&#039;&#039;&#039;&#039;&#039;it). O JDK de [[gal:sun|Sun]] necesario é un J2EE (Java 2 &#039;&#039;&#039;&#039;&#039;E&#039;&#039;&#039;&#039;&#039;nterprise &#039;&#039;&#039;&#039;&#039;E&#039;&#039;&#039;&#039;&#039;nvironment), non o J2SE (Java 2 &#039;&#039;&#039;&#039;&#039;S&#039;&#039;&#039;&#039;&#039;tandard &#039;&#039;&#039;&#039;&#039;E&#039;&#039;&#039;&#039;&#039;dition).&lt;br /&gt;
&lt;br /&gt;
A base das aplicacións web baseadas en Java son as páxinas &#039;&#039;JSP, os &#039;&#039;Servlets&#039;&#039;, os &#039;&#039;Beans&#039;&#039; e os &#039;&#039;Enterprise Java Beans&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Servlets ===&lt;br /&gt;
Os servlets son obxectos Java que residen no servidor e que son invocados polos clientes web (navegadores) para realizar algun tipo de procesamento. Os servlets teñen un ámbito de existencia de aplicación web, é dicir, existe unha soa instancia de cada obxecto para cada aplicación web. Esto quere dicir que os atributos do servlets son comúns a todos os clientes que estén utilizando a aplicacion, de xeito que si temos por exemplo unha variable &#039;&#039;nclients&#039;&#039;, o valor desa variable é comun e mantense para todos os clientes mentras non se reinicie a aplicación.&lt;br /&gt;
&lt;br /&gt;
O servidor de aplicacións (tomcat no noso caso) invocará ó método &#039;&#039;service&#039;&#039; do servlet pasándolle como argumentos os obxectos que representan a petición (&#039;&#039;ServletRequest&#039;&#039;) e a resposta (&#039;&#039;ServletResponse&#039;&#039;). O método &#039;&#039;service&#039;&#039; é o encargado de realizar o procesamento da información suministrada polo cliente e de suministrar a saída html de resposta.&lt;br /&gt;
&lt;br /&gt;
Para crear un &#039;&#039;Servlet&#039;&#039; normalmente se extende a clase &#039;&#039;HttpServlet&#039;&#039; que nos proporciona un método &#039;&#039;service&#039;&#039; que recibe como argumentos un obxecto petición &#039;&#039;HttpServletRequest&#039;&#039; e un obxecto resposta &#039;&#039;HttpServletResponse&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
As páxinas &#039;&#039;JSP&#039;&#039; pola súa banda, xeneran tamén un &#039;&#039;Servlet&#039;&#039;, pero da clase &#039;&#039;HttpJspPage&#039;&#039; e cun método chamado &#039;&#039;__jspService&#039;&#039; en lugar de &#039;&#039;service&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
As clases servlet que deseñemos para a nosa aplicación deben residir no directorio &#039;&#039;WEB-INF/classes&#039;&#039; da aplicación Web, respetando a xerarquía indicada polo &#039;&#039;package&#039;&#039; ó que pertence.&lt;br /&gt;
&lt;br /&gt;
=== JSP ===&lt;br /&gt;
[[Imaxe:transJava.png|left|thumb|Transformación dun JSP]]&lt;br /&gt;
As páxinas JSP son páxinas que normalmente mezclan no mesmo documento HTML e Java. O servidor de aplicacións convertirá a páxina JSP a un &#039;&#039;Servlet&#039;&#039; encargado de facer o procesamento indicado e de producir o HTML resultado dun xeito automático.&lt;br /&gt;
Existen diversos marcadores que se empregan nas páxinas JSP para indicar en qué posición do &#039;&#039;Servlet&#039;&#039; xerado se colocará o código escrito:&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;%@ ... %&amp;gt;&#039;&#039;&#039;: Esto tradúcese a unha directiva Java que vai situada fora da clase. O uso máis común é facer &#039;&#039;imports&#039;&#039; para o Jsp.&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;%! ... %&amp;gt;&#039;&#039;&#039;: Tradúcese como código Java da clase. Se emprega para crear novos atributos e métodos da clase.&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;%  ... %&amp;gt;&#039;&#039;&#039;: Código Java pertencente a &#039;&#039;__jspService&#039;&#039;. É o código principal do Jsp, tamén recibe o nome de &#039;&#039;scriptlet&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;%= ... %&amp;gt;&#039;&#039;&#039;: Avaliación de expresións. Tradúcese a un &#039;&#039;out.write()&#039;&#039; dentro de &#039;&#039;__jspService&#039;&#039;, é dicir, produce unha saída na páxina web que corresponde coa avaliación da expresión indicada.&lt;br /&gt;
&lt;br /&gt;
As páxinas JSP colocanse normalmente no directorio principal da aplicación web.&lt;br /&gt;
&lt;br /&gt;
=== Java Beans ===&lt;br /&gt;
Os [[gal:Java Beans|Java Beans]] son a base da tecnoloxía de compoñentes baseadas en Java. Un Bean non é máis que unha clase ordinaria que proporciona métodos que permiten obter o valor e poñer un valor nos atributos dun obxecto. Estes métodos teñen que seguir unha convención de nomeamento, de xeito que a partir do nome do método se deduce tamén o nome do atributo. &lt;br /&gt;
Unha clase Java para ser considerada como un Bean únicamente debe cumplir os seguintes puntos:&lt;br /&gt;
&lt;br /&gt;
*Os atributos comezan por minúscula.&lt;br /&gt;
*Para cada atributo é necesario crear un método chamado &#039;&#039;&#039;setAtributo&#039;&#039;&#039;, sendo &#039;&#039;Atributo&#039;&#039; o nome do atributo (que como recordamos está todo en minúscula). Este método ten que encargarse de poñer un valor no atributo &#039;&#039;atributo&#039;&#039;.&lt;br /&gt;
*Tamén é necesario crear un método chamado &#039;&#039;&#039;getAtributo&#039;&#039;&#039; por cada atributo, este método se encargará de facilitar o valor do atributo &#039;&#039;atributo&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Seguindo esta convención de nomes e mediante os mecanismos de introspección de Java, será posible facer que entornos Java recoñezan e saiban utilizar dun xeito automático os obxectos Bean, por exemplo para colocar elementos gráficos nunha paleta e facilitarnos automáticamente un formulario para determiñar as súas características.&lt;br /&gt;
&lt;br /&gt;
Dentro da programación JSP unha das principais utilidades que veremos dos Beans é o procesamento de formularios.&lt;br /&gt;
&lt;br /&gt;
=== JSP Tags ===&lt;br /&gt;
Un &#039;&#039;Tag&#039;&#039; JSP pode encapsular unha accion predefinida que se pode invocar dende dentro dunha páxina HTML. JSP ten 6 accións predefinidas, pero poden crearse moitas máis persoalizadas:&lt;br /&gt;
&lt;br /&gt;
*jsp:include&lt;br /&gt;
*jsp:useBean&lt;br /&gt;
*jsp:setProperty&lt;br /&gt;
*jsp:getProperty&lt;br /&gt;
*jsp:forward&lt;br /&gt;
*jsp:plugin&lt;br /&gt;
&lt;br /&gt;
==== Tags Persoalizados: Uso dos Tag ====&lt;br /&gt;
Para declarar que unha páxina JSP utiliza &#039;&#039;Tags&#039;&#039; persoalizados se usa a seguinte directiva ó principio da páxina:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;%@ taglib uri=&amp;quot;/meutag&amp;quot; prefix=&amp;quot;meutag&amp;quot; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo &#039;&#039;&#039;uri&#039;&#039;&#039; debe identificar de xeito único á librería de &#039;&#039;Tag&#039;&#039; e pode ser relativa ou absoluta. Si é relativa debe asinarse a unha dirección absoluta no elemento &#039;&#039;taglib&#039;&#039; no arquivo &#039;&#039;&#039;web.xml&#039;&#039;&#039; da aplicación. O atributo &#039;&#039;&#039;prefix&#039;&#039;&#039; indica o prefixo para utilizar os &#039;&#039;Tag&#039;&#039; proporcionados pola librería.&lt;br /&gt;
&lt;br /&gt;
Para utilizar os &#039;&#039;Tags&#039;&#039; utilízase a sintaxe típica de XML:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;meutag:Saudo&amp;gt;        &lt;br /&gt;
       corpo_do_tag&lt;br /&gt;
  &amp;lt;/meutag:Saudo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O corpo do &#039;&#039;Tag&#039;&#039; pode conter outros &#039;&#039;Tag&#039;&#039;, HTML ou &#039;&#039;scripting&#039;&#039;. Tamén pode utilizar obxectos creados polo propio tag. Si o &#039;&#039;Tag&#039;&#039; non ten corpo se expresaría:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;meutag:DiHola/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os &#039;&#039;Tag&#039;&#039; tamén poden ter atributos:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;meutag:Sauda texto=&amp;quot;di Hola&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Tags Persoalizados: Creación da librería de Tag ====&lt;br /&gt;
Para crear unha librería de &#039;&#039;Tag&#039;&#039; precisaremos:&lt;br /&gt;
*Desenvolver un manexador do &#039;&#039;Tag&#039;&#039; e as clases necesarias para levar a cabo as funcións da librería de &#039;&#039;Tag&#039;&#039;.&lt;br /&gt;
*Declara-lo novo &#039;&#039;Tag&#039;&#039; nun descriptor de librería de etiquetas.&lt;br /&gt;
&lt;br /&gt;
O manexador do &#039;&#039;Tag&#039;&#039; é un obxecto invocado polo servidor de aplicacións para avaliar un &#039;&#039;Tag&#039;&#039; no momento de procesar unha páxina. Un manexador de &#039;&#039;Tag&#039;&#039; precisa implementar os interfaces &#039;&#039;Tag&#039;&#039; ou &#039;&#039;BodyTag&#039;&#039; segundo o &#039;&#039;Tag&#039;&#039; teña corpo ou non. Máis sinxelo é estender as clases existentes &#039;&#039;TagSupport&#039;&#039; ou &#039;&#039;BodyTagSupport&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Os métodos importantes a escribir son os seguintes:&lt;br /&gt;
&lt;br /&gt;
* Si o &#039;&#039;Tag&#039;&#039; ten atributos precisamos os métodos &#039;&#039;&#039;set&#039;&#039;&#039;XXX e &#039;&#039;&#039;get&#039;&#039;&#039;XXX para eses atributos&lt;br /&gt;
* Si o &#039;&#039;Tag&#039;&#039; vai ter un corpo co que necesitamos interactuar, os métodos &#039;&#039;doInitBody&#039;&#039; e &#039;&#039;doAfterBody&#039;&#039;&lt;br /&gt;
* En todos os casos &#039;&#039;doStartTag&#039;&#039;, &#039;&#039;doEndTag&#039;&#039;, e &#039;&#039;release&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O procesamento dun &#039;&#039;Tag&#039;&#039; por parte do servidor de aplicacións segue a seguinte estructura:&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
ATag t = new ATag();&lt;br /&gt;
t.setPageContext(...);&lt;br /&gt;
t.setParent(...);&lt;br /&gt;
t.setAttribute1(value1);&lt;br /&gt;
t.setAttribute2(value2);&lt;br /&gt;
t.doStartTag();&lt;br /&gt;
t.doEndTag();&lt;br /&gt;
t.release();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O descriptor da librería de etiquetas (&#039;&#039;&#039;&#039;&#039;TLD&#039;&#039;&#039;&#039;&#039;), é un ficheiro XML coa seguinte estructura:&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;taglib&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;tlibversion&amp;gt; - Versión da librería&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;jspversion&amp;gt; - Versión de JSP que necesita a librería &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;shortname&amp;gt; - Un nome simple, pode usarse logo como prefixo dos tag&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;uri&amp;gt; - A URI que identifique á librería de xeito único&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;info&amp;gt; - Información sobre a librería&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;tag&amp;gt; &lt;br /&gt;
       &amp;lt;name&amp;gt;Nome_do_Tag&amp;lt;/name&amp;gt;&lt;br /&gt;
       &amp;lt;tagclass&amp;gt;Arquivo .class que implementa o tag&amp;lt;/tagclass&amp;gt;&lt;br /&gt;
       ...&lt;br /&gt;
    &amp;lt;/tag&amp;gt; &lt;br /&gt;
&lt;br /&gt;
    ... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/taglib&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Java Beans ===&lt;br /&gt;
Os [[gal:Enterprise Java Beans|Enterprise Java Beans]] (EJB) son beans que facilitan a construcción de aplicacións empregando compoñentes Java que se poden invocar remotamente facilitando un entorno de obxectos distribuídos. Deste xeito sería posible &#039;&#039;EJB&#039;&#039; en distintas máquinas que poden ser invocados dende outras para compoñer unha aplicación. &lt;br /&gt;
Dende a especificación 2.1 de &#039;&#039;EJB&#039;&#039; existe soporte tamén para [[gal:Servicios Web|Servizos Web]] &#039;&#039;(Web Services)&#039;&#039;&lt;br /&gt;
Os &#039;&#039;EJB&#039;&#039; necesitan de un servidor de aplicacións apropiado. Un dos máis coñecidos e [[gal:JBoss|JBoss]], que é un servidor de &#039;&#039;EJB&#039;&#039; que ademáis incorpora &#039;&#039;Tomcat&#039;&#039; para servir &#039;&#039;Servlets&#039;&#039; e &#039;&#039;JSP&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Estructura dunha Aplicación Web con Java ==&lt;br /&gt;
Unha aplicación web consiste nunha xerarquía de directorios e ficheiros seguindo unhas regras concretas. Esta xerarquía pode estar directamente no sistema de ficheiros o almacenada nun ficheiro comprimido chamado &#039;&#039;WAR (Web Application ARchive)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;O directorio raíz&#039;&#039;&#039;: Na xerarquía da aplicación é tamén o documento raíz da aplicación, aquí situaránse os documentos HTML e JSP  que normalmente se ocupan da interface de usuario da aplicación e os ficheiros relacionados (CSS, JavaScript .js, ... etc). Poden tamén situarse subdirectorios si se considera oportuno.&lt;br /&gt;
*&#039;&#039;&#039;WEB-INF/web.xml&#039;&#039;&#039; : &#039;&#039;Web Application Deployment Descriptor&#039;&#039;. É un documento [[gal:XML|XML]] que describe diversas características da aplicación como os &#039;&#039;Servlets&#039;&#039; que utiliza, parámetros de inicialización e restriccións de seguridade. Co Tomcat se suministra un arquivo &#039;&#039;web.xml&#039;&#039; que pode servir de plantilla para elaborar o que nós precisemos para a aplicación.&lt;br /&gt;
*&#039;&#039;&#039;WEB-INF/classes&#039;&#039;&#039;: Conten os ficheiros &#039;&#039;.class&#039;&#039; de Java que precisa a nosa aplicación, incluíndo clases que sexan &#039;&#039;Servlets&#039;&#039; e clases que non o sexan. As clases deben estar almacenadas nunha estructura de directorios que reflexe o &#039;&#039;package&#039;&#039; ó que pertencen e non poden estar empaquetadas en ficheiros &#039;&#039;JAR&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;WEB-INF/lib&#039;&#039;&#039;: Conten ficheiros &#039;&#039;JAR&#039;&#039; cos ficheiros &#039;&#039;.class&#039;&#039; e os recursos asociados que precise a nosa aplicación. Por exemplo, librerías de outras persoas ou drivers &#039;&#039;JDBC&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Exemplo: KonaKart | https://www.konakart.com/docs/manualInstallation.html]]&lt;br /&gt;
&lt;br /&gt;
== Instalación de Aplicacións ==&lt;br /&gt;
O Tomcat ven configurado por defecto cun único &#039;&#039;Service&#039;&#039; (Catalina) que ten un so &#039;&#039;Host&#039;&#039; (normalmente chamado &#039;&#039;localhost&#039;&#039;) que colle como raíz das súas aplicacións &#039;&#039;/usr/share/tomcat5.5/webapps&#039;&#039;. Existen varios xeitos de facer unha aplicación web visible para o tomcat:&lt;br /&gt;
&lt;br /&gt;
*Si dentro do raíz do &#039;&#039;Host&#039;&#039; situamos unha nova carpeta coa nosa aplicación ou un ficheiro &#039;&#039;WAR&#039;&#039; que conteña a aplicación, o Tomcat a detectará e servirá a nosa aplicación utilizando para o &#039;&#039;Context&#039;&#039; un nome igual que o da carpeta da aplicación.&lt;br /&gt;
*Creando un arquivo &#039;&#039;XML&#039;&#039; de descripción de contexto e poñendo ese arquivo en &#039;&#039;/usr/share/tomcat5.5/conf/Catalina/localhost&#039;&#039;, supoñendo que &#039;&#039;Catalina&#039;&#039; é o nome do &#039;&#039;Service&#039;&#039; e &#039;&#039;localhost&#039;&#039; o nome do &#039;&#039;Host&#039;&#039;. Este arquivo pode chamarse como queiramos e contén a definición do contexto para a nosa aplicación, entre outras cousas o directorio onde está situada. Vexamos un exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;C&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;!--&lt;br /&gt;
    Context configuration file for the Tomcat Manager Web App&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Context path=&amp;quot;/manager&amp;quot; docBase=&amp;quot;/usr/share/tomcat5.5/server/webapps/manager&amp;quot;&lt;br /&gt;
           debug=&amp;quot;0&amp;quot; privileged=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;!-- Link to the user database we will get roles from --&amp;gt;&lt;br /&gt;
     &amp;lt;ResourceLink name=&amp;quot;users&amp;quot; global=&amp;quot;UserDatabase&amp;quot;&lt;br /&gt;
                   type=&amp;quot;org.apache.catalina.UserDatabase&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/Context&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Creando un novo Host no servidor (por exemplo, utilizando a aplicación de administración suministrada co Tomcat). Este Host pode tomar a súa raíz de documentos onde se indique e ahí poderemos situar a nosa aplicación ou un conxunto delas utilizando os métodos indicados anteriormente.&lt;br /&gt;
&lt;br /&gt;
== Enlace Apache/Tomcat ==&lt;br /&gt;
O servidor http máis extendido do mundo é o servidor [[gal:Servidor HTTP Apache|Servidor HTTP Apache]],  de xeito que si queremos ofrecer un servizo web o máis probable é que teñamos un en funcionamento. Si ademáis das páxinas web servidas polo &#039;&#039;Apache&#039;&#039; queremos servir tamén páxinas baseadas en Java, precisaremos un servidor de aplicacións Java como &#039;&#039;Tomcat&#039;&#039;.&lt;br /&gt;
Deste xeito teremos un servidor á escoita nun porto (no 80 normalmente) e o outro servidor noutro (por exemplo o 8080) e os clientes terían que especificar o porto na [[gal:URL|URL]] para acceder o servidor desexado. Esta aproximación ademáis de incómoda para os clientes é pouco efectiva, xa que o servidor Tomcat ten o seu mellor desempeño executando Servlets, non servindo as páxinas estáticas que poidan formar parte da nosa aplicación.&lt;br /&gt;
&lt;br /&gt;
Conectando o servidor Apache co Tomcat podemos conseguir:&lt;br /&gt;
&lt;br /&gt;
*Os clientes se conectan utilizando so unha &#039;&#039;URL&#039;&#039;, sen preocuparse do porto.&lt;br /&gt;
*Se pode configurar a conexión de xeito que o Tomcat so sirva as páxinas relacionadas con Java.&lt;br /&gt;
*Se poden mezclar na aplicación páxinas dinámicas que utilicen linguaxes que o Apache poida procesar (PHP. Perl, ... ), ademáis das páxinas relacionadas con Java que executará o Tomcat.&lt;br /&gt;
&lt;br /&gt;
=== Configuración no Apache ===&lt;br /&gt;
Para enlazar o Tomcat co apache é necesario un módulo chamado en Debian libapache-mod-jk ou libapache2-mod-jk segundo estemos a utilizar Apache 1.3  ou Apache 2.0:&lt;br /&gt;
&lt;br /&gt;
  apt-get install libapache2-mod-jk&lt;br /&gt;
&lt;br /&gt;
Este módulo é o encargado de conectarse co Tomcat mediante o protocolo &#039;&#039;AJP&#039;&#039;. O Tomcat debe ter configurado un Connector deste tipo.&lt;br /&gt;
&lt;br /&gt;
Para establecer as conexións e realizar as peticións utilízanse os &#039;&#039;worker&#039;&#039;. Un worker é o proceso encargado de trasladar as peticións o Tomcat e de recoller a súa resposta a través dos &#039;&#039;Connector AJP&#039;&#039; que estean configurados no &#039;&#039;Service&#039;&#039;. Por defecto, o &#039;&#039;Service Catalina&#039;&#039; de Tomcat proporciona un &#039;&#039;Connector AJP&#039;&#039; no porto 8009.&lt;br /&gt;
&lt;br /&gt;
As características dos workers que vai a utilizar apache configúranse no ficheiro &#039;&#039;&#039;workers.properties&#039;&#039;&#039; que no caso de Debian atópase en &#039;&#039;/etc/libapache2-mod-jk&#039;&#039;.É posible configurar o número de &#039;&#039;workers&#039;&#039; que se consideren necesarios e facer que se conecten a &#039;&#039;Connectors&#039;&#039; de Tomcat tanto locais como remotos.&lt;br /&gt;
&lt;br /&gt;
Para activar o módulo de conexión debemos incluir no ficheiro de configuración de &#039;&#039;Apache&#039;&#039; (&#039;&#039;/etc/apache2/apache2.conf&#039;&#039; en &#039;&#039;Apache 2.0&#039;&#039; ou &#039;&#039;/etc/apache/httpd.conf&#039;&#039; en &#039;&#039;Apache 1.3&#039;&#039;) o seguinte:&lt;br /&gt;
&lt;br /&gt;
  JkWorkersFile /etc/libapache2-mod-jk/workers.properties&lt;br /&gt;
  JkLogFile /var/log/apache2/mod_jk.log&lt;br /&gt;
  JkLogLevel info&lt;br /&gt;
&lt;br /&gt;
Logo bastará con indicar que arquivos van ir redirixidos ó Tomcat mediante o comando &#039;&#039;&#039;JkMount&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Por exemplo:&lt;br /&gt;
&lt;br /&gt;
  JkMount /* ajp13_worker&lt;br /&gt;
&lt;br /&gt;
Faría que as peticións a calquera documento do directorio raíz do servidor virtual do &#039;&#039;Apache&#039;&#039; donde se incluíu a directiva se redirixiran ó &#039;&#039;Context raíz&#039;&#039; do &#039;&#039;Host&#039;&#039; por defecto de &#039;&#039;Tomcat&#039;&#039; utilizando o &#039;&#039;worker&#039;&#039; definido en &#039;&#039;workers.properties&#039;&#039; co nome &#039;&#039;ajp13_worker&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
  JkMount /aplicacionweb/* ajp13_work&lt;br /&gt;
&lt;br /&gt;
Sería similar o anterior, pero redixiría as peticións á carpeta &#039;&#039;&#039;/aplicacionweb/&#039;&#039;&#039; no servidor virtual do &#039;&#039;Apache&#039;&#039; ó &#039;&#039;Context aplicacionweb&#039;&#039; de &#039;&#039;Tomcat&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
  JkMount /*.jsp ajp13_worker&lt;br /&gt;
  JkMount /servlet/* ajp13_worker&lt;br /&gt;
  JkMount /otherworker/*.jsp ajp13_worker_remote&lt;br /&gt;
&lt;br /&gt;
Estas directivas farían que as peticións a calquera arquivo &#039;&#039;&#039;.jsp&#039;&#039;&#039; no raíz do host virtual de &#039;&#039;Apache&#039;&#039; foran redirixidas o &#039;&#039;Context raíz&#039;&#039; do &#039;&#039;Tomcat&#039;&#039;, que calquera petición á carpeta &#039;&#039;/servlet&#039;&#039; do host virtual de &#039;&#039;Apache&#039;&#039; se redirixa o &#039;&#039;Context servlet&#039;&#039; do Tomcat e que as peticións os arquivos &#039;&#039;.jsp&#039;&#039; na carpeta &#039;&#039;otherworker&#039;&#039; se redirixan o &#039;&#039;Context otherworker&#039;&#039; de Tomcat.&lt;br /&gt;
&lt;br /&gt;
Utilízanse dous workers configurados en &#039;&#039;workers.properties&#039;&#039;, (&#039;&#039;ajp13_worker&#039;&#039; e &#039;&#039;ajp13_worker_remote&#039;&#039;) que poden estar conectando con servidores &#039;&#039;Tomcat&#039;&#039; distintos. Cando únicamente se redirixen os arquivos &#039;&#039;.jsp&#039;&#039;, os demáis son servidos mediante &#039;&#039;Apache&#039;&#039; e poden ser documentos dinámicos en calquera linguaxe soportada (PHP, Perl ...).&lt;br /&gt;
&lt;br /&gt;
=== Configuración no Tomcat ===&lt;br /&gt;
O único requisito no &#039;&#039;Tomcat&#039;&#039; para que se poda enlazar co &#039;&#039;Apache&#039;&#039; é que proporcione un &#039;&#039;Connector&#039;&#039; co protocolo &#039;&#039;AJP&#039;&#039;. O que si resulta práctico é poder utilizar un dominio para acceder a unha aplicación web a través do &#039;&#039;Apache&#039;&#039; sen necesidade de especificar o &#039;&#039;Context&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A solución consiste en definir en &#039;&#039;Tomcat&#039;&#039; un &#039;&#039;Host&#039;&#039; virtual co mesmo nome que o utilizado en &#039;&#039;Apache&#039;&#039;. Deste xeito as peticións ó documento raíz no apache mapearanse o documento raíz do &#039;&#039;Host&#039;&#039; virtual de &#039;&#039;Tomcat&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Para crear un &#039;&#039;Host&#039;&#039; virtual o máis sinxelo é utilizar a aplicación de administración suministrada co &#039;&#039;Tomcat&#039;&#039; no paquete &#039;&#039;&#039;&#039;&#039;tomcat5.5-admin&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuración dun sitio web virtual JSP a través do apache ===&lt;br /&gt;
Para configurar un sitio web, o primeiro que necesitamos é que un DNS resolva o noso dominio. Unha vez feito esto, creamos a carpeta onde se vai a hospedar a aplicación.&lt;br /&gt;
&lt;br /&gt;
A continuación, debemos dar de alta un &#039;&#039;VirtualHost&#039;&#039; no apache apuntando á carpeta de aplicación (o apache xa debe ter configurado o mod_jk coas directivas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;C&#039;&amp;gt;&lt;br /&gt;
  JkWorkersFile /etc/libapache2-mod-jk/workers.properties&lt;br /&gt;
  JkLogFile /var/log/apache2/mod_jk.log&lt;br /&gt;
  JkLogLevel info&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en /etc/apache/httpd.conf  ou /etc/apache2/httpd.conf. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName  www.radiorodeira.com  &lt;br /&gt;
    DocumentRoot /home/xavi/radiorodeira/&lt;br /&gt;
    JkMount /contexto/* ajp13_worker&lt;br /&gt;
  &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No &#039;&#039;VirtualHost&#039;&#039; debemos indicar que páxinas lle imos pasar ó tomcat mediante o parámetro &#039;&#039;JkMount&#039;&#039;. O resto de páxinas as servirá apache (podendo levar php, perl ou calqueira linguaxe de servidor soportada polo apache).&lt;br /&gt;
&lt;br /&gt;
En tomcat os nomes de contexto teñen que ser únicos en cada Host. Si queremos que tanto o apache como o tomcat utilicen o mesmo contexto no servidor virtual (para poder acceder como &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;http://www.radiorodeira.com&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039; tanto a páxinas html mediante Apache como .jsp mediante tomcat) necesitaremos crear ademáis un host virtual no tomcat co mesmo nome que o host creado no apache.&lt;br /&gt;
&lt;br /&gt;
Para crear o host virtual en tomcat5.5 é necesario editar o ficheiro &#039;&#039;server.xml&#039;&#039; (en Debian &#039;&#039;Lenny&#039;&#039; e &#039;&#039;Squeeze&#039;&#039; situado en /etc/tomcat55) e engadirlle un novo host:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;C&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;Host&lt;br /&gt;
     appBase=&amp;quot;/home/xavi/radiorodeira_contexts&amp;quot;&lt;br /&gt;
     name=&amp;quot;www.radiorodeira.com&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/Host&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Despois de facer esto e reiniciado o tomcat, debería aparecer unha carpeta en &#039;&#039;/etc/tomcat5.5/Catalina&#039;&#039; representando o novo host. Nesta carpeta é onde copiamos ou creamos o enlace ós novos contextos para este host.&lt;br /&gt;
&lt;br /&gt;
E posible que esta carpeta non apareza de xeito automático, nese caso, é necesario creala a man e reiniciar tomcat.&lt;br /&gt;
&lt;br /&gt;
== Acceso a Base de Datos ==&lt;br /&gt;
=== Utilizando un &#039;&#039;Pool&#039;&#039; de Conexións ===&lt;br /&gt;
=== Acceso sen &#039;&#039;Pool&#039;&#039; de Conexións ===&lt;br /&gt;
&lt;br /&gt;
== Utilizando &#039;&#039;Java Standard Tag Library (JSTL)&#039;&#039;==&lt;br /&gt;
== Frameworks Java: &#039;&#039;Struts&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
== Exemplo 1 ==&lt;br /&gt;
O seguinte exemplo facilita un formulario que solicita a precisión de cálculo para o número &#039;&#039;&#039;e&#039;&#039;&#039;, e facilita o resultado utilizando a sucesión de &#039;&#039;Mac Laurin&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Código ===&lt;br /&gt;
==== index.html ====&lt;br /&gt;
*Versión con procesamento mediante JSP ou Beans&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;numeroe.jsp&amp;quot;&amp;gt;&lt;br /&gt;
  Precision: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;precision&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Calcular&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Versión con procesamento mediante Servlet&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;calculo&amp;quot;&amp;gt;&lt;br /&gt;
  Precision: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;precision&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Calcular&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Procesamento do Formulario con un Java Bean ====&lt;br /&gt;
A maior ventaxa do uso de &#039;&#039;Beans&#039;&#039; no procesamento de formularios é que o código dos Beans son clases completamente autónomas do HTML e reutilizables donde sexan necesarias.&lt;br /&gt;
&lt;br /&gt;
Este é o JSP (&#039;&#039;&#039;numeroe.jsp&#039;&#039;&#039;) que visualiza o resultado:&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;jsp:useBean id=&amp;quot;e&amp;quot; class=&amp;quot;com.xavi.beane&amp;quot; scope=&amp;quot;session&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jsp:setProperty name=&amp;quot;e&amp;quot; property=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
O número &#039;e&#039; calculado cunha precisión de &amp;lt;%= e.getPrecision() %&amp;gt; é &lt;br /&gt;
&amp;lt;%= e.calcula_e() %&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O código do Bean, que deberá ir situado en &#039;&#039;WEB-INF/classes/com/xavi&#039;&#039; é o seguinte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
package com.xavi;&lt;br /&gt;
&lt;br /&gt;
public class beane {&lt;br /&gt;
  private int precision;&lt;br /&gt;
&lt;br /&gt;
  public void setPrecision(int pr) {&lt;br /&gt;
     precision=pr;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public int getPrecision() {&lt;br /&gt;
     return precision;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public long factorial(int num)&lt;br /&gt;
  {&lt;br /&gt;
     long res=1;&lt;br /&gt;
&lt;br /&gt;
     while(num&amp;gt;0)&lt;br /&gt;
     {&lt;br /&gt;
       res=res*num;&lt;br /&gt;
       num--;&lt;br /&gt;
     }&lt;br /&gt;
     return res;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public double calcula_e()&lt;br /&gt;
  {&lt;br /&gt;
    double nume=1;&lt;br /&gt;
&lt;br /&gt;
    while (precision&amp;gt;=1)&lt;br /&gt;
    {&lt;br /&gt;
      nume=nume+1.0/(double)factorial(precision);&lt;br /&gt;
      precision=precision-1;&lt;br /&gt;
    }&lt;br /&gt;
    return nume;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De especial importancia é que os atributos do &#039;&#039;Bean&#039;&#039; coincidan co nome das variables enviadas no formulario.&lt;br /&gt;
&lt;br /&gt;
==== Procesamento do Formulario cun Servlet ====&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
package com.xavi;&lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import javax.servlet.http.*;&lt;br /&gt;
&lt;br /&gt;
public class numeroe extends HttpServlet {&lt;br /&gt;
  long factorial(int num)&lt;br /&gt;
  {&lt;br /&gt;
    long res=1;&lt;br /&gt;
&lt;br /&gt;
    while(num&amp;gt;0)&lt;br /&gt;
    {&lt;br /&gt;
       res=res*num;&lt;br /&gt;
       num--;&lt;br /&gt;
    }&lt;br /&gt;
    return res;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  double calcula_e(int pr)&lt;br /&gt;
  {&lt;br /&gt;
    double nume=1;&lt;br /&gt;
    while (pr&amp;gt;=1)&lt;br /&gt;
    {&lt;br /&gt;
      nume=nume+1.0/(double)factorial(pr);&lt;br /&gt;
      pr=pr-1;&lt;br /&gt;
    }&lt;br /&gt;
    return nume;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  protected void doPost(HttpServletRequest req,HttpServletResponse res)&lt;br /&gt;
                 throws ServletException, IOException {&lt;br /&gt;
     PrintWriter out=res.getWriter();&lt;br /&gt;
     int precision=Integer.parseInt(req.getParameter(&amp;quot;precision&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
     res.setContentType(&amp;quot;text/html&amp;quot;);&lt;br /&gt;
     out.write(&amp;quot;&amp;lt;html&amp;gt;&amp;quot;);&lt;br /&gt;
     out.write(&amp;quot;&amp;lt;h1&amp;gt;Cálculo do número &#039;e&#039; mediante un Servlet&amp;lt;/h1&amp;gt;&amp;quot;);&lt;br /&gt;
     out.write(&amp;quot;O número &#039;e&#039; calculado cunha precisión de &amp;quot;+precision+&lt;br /&gt;
     &amp;quot; vale &amp;quot;+calcula_e(precision));&lt;br /&gt;
     out.write(&amp;quot;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta clase é necesario compilala a man engadíndolle o classpath as clases Servlet, que están normalmente implementadas no servidor de aplicacións. No caso concreto do Tomcat 5.5:&lt;br /&gt;
&lt;br /&gt;
  javac -classpath &amp;quot;/usr/share/tomcat5.5/common/lib/servlet-api.jar&amp;quot; numeroe.java&lt;br /&gt;
&lt;br /&gt;
O ficheiro &#039;&#039;.class&#039;&#039; resultante debe colocarse no directorio WEB-INF/classes/com/xavi do &#039;&#039;Context&#039;&#039; da aplicación, xa que a clase pertence o &#039;&#039;package com.xavi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tamén é necesario indicar no ficheiro &#039;&#039;WEB-INF/web.xml&#039;&#039; que a aplicación fará uso deste &#039;&#039;Servlet&#039;&#039;, como se accederá a él, os parámetros de inicialización,... No noso caso engadimos:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;servlet&amp;gt;&lt;br /&gt;
     &amp;lt;servlet-name&amp;gt;nume_servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
     &amp;lt;servlet-class&amp;gt;com.xavi.numeroe&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
   &amp;lt;/servlet&amp;gt;&lt;br /&gt;
   &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
      &amp;lt;servlet-name&amp;gt;nume_servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
      &amp;lt;url-pattern&amp;gt;/calculo&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
   &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por último, cada vez que modifiquemos un &#039;&#039;Servlet&#039;&#039; será necesario reinicia-lo &#039;&#039;Tomcat&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Procesamento do Formulario cun JSP ====&lt;br /&gt;
&#039;&#039;&#039;numeroe.jsp&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;%!&lt;br /&gt;
long factorial(int num)&lt;br /&gt;
{&lt;br /&gt;
   long res=1;&lt;br /&gt;
&lt;br /&gt;
   while(num&amp;gt;0)&lt;br /&gt;
   {&lt;br /&gt;
        res=res*num;&lt;br /&gt;
        num--;&lt;br /&gt;
   }&lt;br /&gt;
   return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double numeroe(int pr)&lt;br /&gt;
{&lt;br /&gt;
  double nume=1;&lt;br /&gt;
  while (pr&amp;gt;=1)&lt;br /&gt;
  {&lt;br /&gt;
    nume=nume+1.0/(double)factorial(pr);&lt;br /&gt;
    pr=pr-1;&lt;br /&gt;
  }&lt;br /&gt;
  return nume;&lt;br /&gt;
}&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%&lt;br /&gt;
 int precision=Integer.parseInt(request.getParameter(&amp;quot;precision&amp;quot;));&lt;br /&gt;
 out.print(&amp;quot;O número &#039;e&#039; calculado cunha precision de &amp;quot;+precision+&amp;quot; vale &amp;quot;+numeroe(precision));&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplo 2 ==&lt;br /&gt;
Os dous exemplos seguintes mostran o procesamento de &#039;&#039;Tag&#039;&#039;. O primeiro &#039;&#039;Tag&#039;&#039; visualiza unha mensaxe, e o segundo realiza unha iteración polos valores dunha clase.&lt;br /&gt;
&lt;br /&gt;
==== Descritor da librería ====&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE taglib&lt;br /&gt;
          PUBLIC &amp;quot;-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN&amp;quot; &lt;br /&gt;
          &amp;quot;http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;taglib&amp;gt;&lt;br /&gt;
   &amp;lt;!-- The version number of this tag library --&amp;gt;&lt;br /&gt;
   &amp;lt;tlibversion&amp;gt;1.0&amp;lt;/tlibversion&amp;gt;&lt;br /&gt;
   &amp;lt;!-- The JSP specification version required to function --&amp;gt;&lt;br /&gt;
   &amp;lt;jspversion&amp;gt;1.1&amp;lt;/jspversion&amp;gt;&lt;br /&gt;
   &amp;lt;!-- The short name of this tag library --&amp;gt;&lt;br /&gt;
   &amp;lt;shortname&amp;gt;meutag&amp;lt;/shortname&amp;gt;&lt;br /&gt;
   &amp;lt;!-- Public URI that uniquely identifies this version of the tag library --&amp;gt;&lt;br /&gt;
   &amp;lt;uri&amp;gt;/meutag&amp;lt;/uri&amp;gt;&lt;br /&gt;
   &amp;lt;!-- General information about this tag library --&amp;gt;&lt;br /&gt;
   &amp;lt;info&amp;gt;&lt;br /&gt;
      Exemplo tag Hola Mundo&lt;br /&gt;
   &amp;lt;/info&amp;gt;&lt;br /&gt;
   &amp;lt;!-- Tag Saudo --&amp;gt;&lt;br /&gt;
   &amp;lt;tag&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Saudo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;tagclass&amp;gt;com.xavi.tagHola&amp;lt;/tagclass&amp;gt;&lt;br /&gt;
      &amp;lt;bodycontent&amp;gt;empty&amp;lt;/bodycontent&amp;gt;&lt;br /&gt;
      &amp;lt;info&amp;gt;&lt;br /&gt;
         Visualiza un Saúdo&lt;br /&gt;
      &amp;lt;/info&amp;gt;&lt;br /&gt;
  &amp;lt;/tag&amp;gt;&lt;br /&gt;
  &amp;lt;tag&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;iteration&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;tagclass&amp;gt;com.xavi.tagIter&amp;lt;/tagclass&amp;gt;&lt;br /&gt;
      &amp;lt;teiclass&amp;gt;com.xavi.IterTEI&amp;lt;/teiclass&amp;gt;&lt;br /&gt;
      &amp;lt;bodycontent&amp;gt;JSP&amp;lt;/bodycontent&amp;gt;&lt;br /&gt;
      &amp;lt;attribute&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;name&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;required&amp;gt;true&amp;lt;/required&amp;gt;&lt;br /&gt;
         &amp;lt;rtexprvalue&amp;gt;true&amp;lt;/rtexprvalue&amp;gt;&lt;br /&gt;
      &amp;lt;/attribute&amp;gt;&lt;br /&gt;
      &amp;lt;attribute&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;type&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;required&amp;gt;true&amp;lt;/required&amp;gt;&lt;br /&gt;
         &amp;lt;rtexprvalue&amp;gt;true&amp;lt;/rtexprvalue&amp;gt;&lt;br /&gt;
      &amp;lt;/attribute&amp;gt;&lt;br /&gt;
      &amp;lt;attribute&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;group&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;required&amp;gt;true&amp;lt;/required&amp;gt;&lt;br /&gt;
         &amp;lt;rtexprvalue&amp;gt;true&amp;lt;/rtexprvalue&amp;gt;&lt;br /&gt;
      &amp;lt;/attribute&amp;gt;&lt;br /&gt;
  &amp;lt;/tag&amp;gt;&lt;br /&gt;
&amp;lt;/taglib&amp;gt;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Tag Hola ====&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
package com.xavi;&lt;br /&gt;
&lt;br /&gt;
import javax.servlet.jsp.*;&lt;br /&gt;
import javax.servlet.jsp.tagext.*;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class tagHola extends BodyTagSupport {&lt;br /&gt;
&lt;br /&gt;
    public int doStartTag() throws JspException {&lt;br /&gt;
        try {&lt;br /&gt;
               pageContext.getOut().print(&amp;quot;Hola dende un Tag&amp;quot;);&lt;br /&gt;
        } catch (Exception ex) {&lt;br /&gt;
              throw new JspException(&amp;quot;IO problems&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return SKIP_BODY;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Tag Iter ====&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
 * Copyright 2000 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 * Copyright 2000 Sun Microsystems, Inc. Tous droits réservés. &lt;br /&gt;
 */&lt;br /&gt;
package com.xavi;&lt;br /&gt;
&lt;br /&gt;
import javax.servlet.jsp.*;&lt;br /&gt;
import javax.servlet.jsp.tagext.*;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class tagIter extends BodyTagSupport {&lt;br /&gt;
   private String name, type;&lt;br /&gt;
   private Iterator iterator;&lt;br /&gt;
&lt;br /&gt;
   public void setName(String name) {&lt;br /&gt;
      this.name = name;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public void setType(String type) {&lt;br /&gt;
      this.type = type;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public void setGroup(Collection members) {&lt;br /&gt;
      if(members.size() &amp;gt; 0)&lt;br /&gt;
         iterator = members.iterator();&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public int doStartTag() {&lt;br /&gt;
      if(iterator == null) &lt;br /&gt;
         return SKIP_BODY;&lt;br /&gt;
      if(iterator.hasNext()) {&lt;br /&gt;
         pageContext.setAttribute(name, iterator.next());&lt;br /&gt;
         return EVAL_BODY_TAG;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         return SKIP_BODY;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public int doAfterBody() throws JspException {&lt;br /&gt;
      BodyContent body = getBodyContent();&lt;br /&gt;
      try {&lt;br /&gt;
         body.writeOut(getPreviousOut());&lt;br /&gt;
      } catch (IOException e) {&lt;br /&gt;
         throw new JspTagException(&amp;quot;IterationTag: &amp;quot; + e.getMessage());&lt;br /&gt;
      }&lt;br /&gt;
      // clear up so the next time the body content is empty&lt;br /&gt;
      body.clearBody();&lt;br /&gt;
      if (iterator.hasNext()) {&lt;br /&gt;
         pageContext.setAttribute(name, iterator.next());&lt;br /&gt;
         return EVAL_BODY_TAG;&lt;br /&gt;
      } else {&lt;br /&gt;
         return SKIP_BODY;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Tag IterTEI (Tag Extra Info) ====&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
 * Copyright 2000 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 * Copyright 2000 Sun Microsystems, Inc. Tous droits réservés. &lt;br /&gt;
 */&lt;br /&gt;
package com.xavi;&lt;br /&gt;
&lt;br /&gt;
import javax.servlet.jsp.tagext.*;&lt;br /&gt;
public class IterTEI extends TagExtraInfo {&lt;br /&gt;
  &lt;br /&gt;
   public IterTEI() {&lt;br /&gt;
      super();&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public VariableInfo[] getVariableInfo(TagData data) {&lt;br /&gt;
      VariableInfo info1&lt;br /&gt;
         = new VariableInfo(&lt;br /&gt;
            data.getAttributeString(&amp;quot;name&amp;quot;),&lt;br /&gt;
            data.getAttributeString(&amp;quot;type&amp;quot;),	&lt;br /&gt;
            true,&lt;br /&gt;
            VariableInfo.NESTED);&lt;br /&gt;
      VariableInfo [] info = { info1 };&lt;br /&gt;
      return info;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039; Exemplos de Funcionamento dos Tag Anteriores &#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tag Saudo&#039;&#039;&lt;br /&gt;
*index.jsp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;/meutag&amp;quot; prefix=&amp;quot;mt&amp;quot; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mt:Saudo/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;Tag Iteration&#039;&#039;&lt;br /&gt;
*index.jsp&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;/meutag&amp;quot; prefix=&amp;quot;mt&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Organization&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body bgcolor=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;jsp:useBean id=&amp;quot;org&amp;quot; class=&amp;quot;com.xavi.Organization&amp;quot;/&amp;gt;   &lt;br /&gt;
   &amp;lt;table border=2 cellspacing=3 cellpadding=3&amp;gt;&lt;br /&gt;
   &amp;lt;mt:iteration name=&amp;quot;departmentName&amp;quot; type=&amp;quot;String&amp;quot;  group=&amp;quot;&amp;lt;%= org.getDepartmentNames()%&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
         &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Departments&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;   &lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
         &amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;list.jsp?deptName=&amp;lt;%= departmentName %&amp;gt;&amp;quot;&amp;gt; &amp;lt;%= departmentName %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;/mt:iteration&amp;gt; &lt;br /&gt;
   &amp;lt;/table&amp;gt; &lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*list.jsp&lt;br /&gt;
&amp;lt;source lang=&#039;java&#039;&amp;gt;&lt;br /&gt;
&amp;lt;%--&lt;br /&gt;
 % Copyright 2000 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 % Copyright 2000 Sun Microsystems, Inc. Tous droits réservés. &lt;br /&gt;
--%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;/meutag&amp;quot; prefix=&amp;quot;mt&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
	&amp;lt;jsp:useBean id=&amp;quot;org&amp;quot; class=&amp;quot;com.xavi.Organization&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;%	String deptName = (String)request.getParameter(&amp;quot;deptName&amp;quot;);&lt;br /&gt;
 	  	com.xavi.Department dept = org.getDepartment(deptName); %&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
		&amp;lt;title&amp;gt;&amp;lt;%= deptName%&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body bgcolor=&amp;quot;white&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;table border=2 cellspacing=3 cellpadding=3&amp;gt;&lt;br /&gt;
		&amp;lt;tr&amp;gt;&lt;br /&gt;
			&amp;lt;td colspan=3&amp;gt;&amp;lt;b&amp;gt;&amp;lt;center&amp;gt;&amp;lt;%= deptName%&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;/tr&amp;gt;&lt;br /&gt;
		&amp;lt;tr&amp;gt;&lt;br /&gt;
			&amp;lt;td width=100&amp;gt;&amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	  		&amp;lt;td width=100&amp;gt;&amp;lt;b&amp;gt;Extension&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
			&amp;lt;td width=100&amp;gt;&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  		&amp;lt;/tr&amp;gt;&lt;br /&gt;
		&amp;lt;%-- List all department members --%&amp;gt;&lt;br /&gt;
		&amp;lt;mt:iteration name=&amp;quot;member&amp;quot; type=&amp;quot;com.xavi.Member&amp;quot; group=&amp;quot;&amp;lt;%= dept.getMembers()%&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;tr&amp;gt;&lt;br /&gt;
                       &amp;lt;td&amp;gt;&amp;lt;%=member.getName()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;%=member.getPhone()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
			&amp;lt;td&amp;gt;&amp;lt;%=member.getEmail()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;%--&lt;br /&gt;
                        &amp;lt;td&amp;gt;&amp;lt;jsp:getProperty name=&amp;quot;member&amp;quot; property=&amp;quot;name&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	  		&amp;lt;td&amp;gt;&amp;lt;jsp:getProperty name=&amp;quot;member&amp;quot; property=&amp;quot;phone&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	  		&amp;lt;td&amp;gt;&amp;lt;jsp:getProperty name=&amp;quot;member&amp;quot; property=&amp;quot;email&amp;quot;/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
--%&amp;gt;			&lt;br /&gt;
 		&amp;lt;/tr&amp;gt;&lt;br /&gt;
		&amp;lt;/mt:iteration&amp;gt;		&lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;		  	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplo 3 ==&lt;br /&gt;
Este exemplo é unha pequena aplicación de xestión dunha biblioteca, e está dispoñible na súa [[Biblioteca Web Java|páxina de desenvolvemento]]&lt;br /&gt;
&lt;br /&gt;
== Enlaces de Interese ==&lt;br /&gt;
[http://java.sun.com/javaee/javaserverfaces/ Java Server Faces]&lt;br /&gt;
&lt;br /&gt;
[http://www.exadel.com/tutorial/jsf/jsftutorial-kickstart.html Java Server Faces QuickStart]&lt;br /&gt;
&lt;br /&gt;
[http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSFIntro.html Java Server Faces Tutorial]&lt;br /&gt;
&lt;br /&gt;
[http://java.sun.com/products/jsp/jstl/ Java Server Standard Tag Libraries]&lt;br /&gt;
&lt;br /&gt;
[http://struts.apache.org/1.x/userGuide/index.html Struts 1]&lt;br /&gt;
&lt;br /&gt;
[http://struts.apache.org/1.x/struts-el/index.html JSTL]&lt;br /&gt;
&lt;br /&gt;
[http://struts.apache.org/1.x/struts-faces/index.html JSF]&lt;br /&gt;
&lt;br /&gt;
[http://stxx.sourceforge.net/ XSLT]&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3426</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3426"/>
		<updated>2025-09-12T13:17:27Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000SSSSS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=M00M&lt;br /&gt;
Jun=000000000000000000EEEEEEEEEEEEEEE&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3425</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3425"/>
		<updated>2025-09-05T17:28:31Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000SSSSS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=M&lt;br /&gt;
Jun=000000000000000000EEEEEEEEEEEEEEE&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3424</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3424"/>
		<updated>2025-09-05T17:27:35Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000SSSSS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=M&lt;br /&gt;
Jun=000000000000000EEEEEEEEEEEEEEE&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3423</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3423"/>
		<updated>2025-09-05T17:26:36Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F000000000SSS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=M&lt;br /&gt;
Jun=000000000000000EEEEEEEEEEEEEEE&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3422</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3422"/>
		<updated>2025-09-04T16:51:36Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000000SS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=M&lt;br /&gt;
Jun=000000000000000EEEEEEEEEEEEEEE&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3421</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3421"/>
		<updated>2025-09-04T16:50:41Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000000SS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3420</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3420"/>
		<updated>2025-09-04T16:50:38Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000000SS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=M&lt;br /&gt;
Jun=000000000000000EEEEEEEEEEEEEEEE&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3419</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3419"/>
		<updated>2025-09-04T16:49:09Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=000000000000000000F0000000000SS&lt;br /&gt;
Apr=SSSSSS&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3418</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3418"/>
		<updated>2025-09-04T16:47:36Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Entroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000AAA&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3417</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3417"/>
		<updated>2025-09-04T16:46:52Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=000000000000000CCC&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3416</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3416"/>
		<updated>2025-09-04T16:46:11Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C0000000000000NNNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3415</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3415"/>
		<updated>2025-09-04T16:45:48Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=0000000C00000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3414</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3414"/>
		<updated>2025-09-04T16:44:54Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=000000000000000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=01000C0000000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3413</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3413"/>
		<updated>2025-09-04T16:43:22Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=00000000000F000000000000000000S&lt;br /&gt;
Nov=00F&lt;br /&gt;
Dec=01000C0000000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3412</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3412"/>
		<updated>2025-09-04T16:40:42Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=00000000000F000000000000000000S&lt;br /&gt;
Nov=00+&lt;br /&gt;
Dec=01000C0000000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Portal_dos_Ciclos_ASIR_e_DAW_do_IES_de_Rodeira&amp;diff=3411</id>
		<title>Portal dos Ciclos ASIR e DAW do IES de Rodeira</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Portal_dos_Ciclos_ASIR_e_DAW_do_IES_de_Rodeira&amp;diff=3411"/>
		<updated>2025-09-04T16:40:00Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__&lt;br /&gt;
{|id=&amp;quot;da&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;background:#eef; border: 1px #bbf solid; padding: 8px; margin-bottom:8px;&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;30%&amp;quot;|&lt;br /&gt;
{{Titulo}}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; width=&amp;quot;20%&amp;quot;|&lt;br /&gt;
[[NOVAS]]&lt;br /&gt;
&lt;br /&gt;
[https://correo.iesrodeira.com Correo Web]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;20%&amp;quot;| &lt;br /&gt;
[https://alumnos.asir.iesrodeira.com Zona de Alumnos]&lt;br /&gt;
&lt;br /&gt;
[[Calendario Escolar|Calendario Escolar 2025 / 2026]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
{{Benvida}}&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3410</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3410"/>
		<updated>2025-09-02T15:16:14Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=*******0&lt;br /&gt;
Oct=00000000000F000000000000000000S&lt;br /&gt;
Nov=+&lt;br /&gt;
Dec=01000C0000000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3409</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3409"/>
		<updated>2025-09-02T15:15:59Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=********0&lt;br /&gt;
Oct=00000000000F000000000000000000S&lt;br /&gt;
Nov=+&lt;br /&gt;
Dec=01000C0000000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3408</id>
		<title>Calendario Escolar</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Calendario_Escolar&amp;diff=3408"/>
		<updated>2025-09-02T15:15:33Z</updated>

		<summary type="html">&lt;p&gt;Xavi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;specialday tag=&#039;*&#039; color=&amp;quot;#8ff0a4&amp;quot;&amp;gt;Preparación Inicio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;P&#039; color=&amp;quot;#85d690&amp;quot;&amp;gt;Presentación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;F&#039; color=&amp;quot;#AF1111&amp;quot;&amp;gt;Festivo&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;I&#039; color=&amp;quot;#fce94f&amp;quot;&amp;gt;Inicio das Clases&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;S&#039; color=&amp;quot;#d58deb&amp;quot;&amp;gt;Dia do Ensino&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;+&#039; color=&amp;quot;#d68eec&amp;quot;&amp;gt;Samaín&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;C&#039; color=&amp;quot;#04bdb0&amp;quot;&amp;gt;Día da Constitución&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;N&#039; color=&amp;quot;#02544f&amp;quot;&amp;gt;Vacacións de Nadal&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;A&#039; color=&amp;quot;#027d4a&amp;quot;&amp;gt;Antroido&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;X&#039; color=&amp;quot;#027d33&amp;quot;&amp;gt;Ponte de San Xosé&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;Z&#039; color=&amp;quot;#299c17&amp;quot;&amp;gt;Semana Santa&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;M&#039; color=&amp;quot;#6cc443&amp;quot;&amp;gt;Primeiro de Maio&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;E&#039; color=&amp;quot;#718c0d&amp;quot;&amp;gt;Fin de Curso&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;V&#039; color=&amp;quot;#c8f230&amp;quot;&amp;gt;Vacacións de Verán&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;1&#039; color=&amp;quot;#ff7300&amp;quot;&amp;gt;Exame DAW Programacion Primeira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;2&#039; color=&amp;quot;#fc8523&amp;quot;&amp;gt;Exame DAW Programacion Segunda Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;3&#039; color=&amp;quot;#fa9441&amp;quot;&amp;gt;Exame DAW Programacion Terceira Avaliación&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;4&#039; color=&amp;quot;#fb9441&amp;quot;&amp;gt;Exame DAW Programacion Final&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;G&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Letras Galegas&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&amp;lt;specialday tag=&#039;L&#039; color=&amp;quot;#ffa348&amp;quot;&amp;gt;Libre Elección&amp;lt;/specialday&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;calendar name=&amp;quot;Calendario Escolar 2025/2026&amp;quot; type=&amp;quot;nmonths&amp;quot; nmonths=10 startmonth=9 date=01/01/2025 title=&amp;quot;Calendario Escolar 2025 - 2026&amp;quot; format=%name:%day/%month/%year&amp;gt;&lt;br /&gt;
Sep=**********0&lt;br /&gt;
Oct=00000000000F000000000000000000S&lt;br /&gt;
Nov=+&lt;br /&gt;
Dec=01000C0000000000000000NNNNNNNNN&lt;br /&gt;
Jan=NNNNNNN&lt;br /&gt;
Feb=0&lt;br /&gt;
Mar=00AAA000000000002&lt;br /&gt;
Apr=0000000000000ZZZZZZZZ&lt;br /&gt;
May=ML00000000000000G000000003&lt;br /&gt;
Jun=0000000000000004000E000000000VV&lt;br /&gt;
&amp;lt;/calendar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--legend&amp;gt;&amp;lt;/legend--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3407</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3407"/>
		<updated>2024-11-08T20:27:31Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Instalación da contorna de desenvolvemento */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con &#039;&#039;&#039;&#039;&#039;npm run prod&#039;&#039;&#039;&#039;&#039;, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; &amp;lt;nowiki&amp;gt;{{ $attr }}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== Comezando con plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usalo dende o compoñente pai: &#039;&#039;&#039;&#039;&#039;MeuCompoñente&#039;&#039;&#039;&#039;&#039; na sección &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Os slots con nome permiten crear varios slots con nomes específicos: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/header&amp;gt; &lt;br /&gt;
    &amp;lt;main&amp;gt; &lt;br /&gt;
        &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/main&amp;gt; &lt;br /&gt;
    &amp;lt;footer&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/footer&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que se utilizaría do seguinte xeito: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;MeuCompoñente&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &lt;br /&gt;
   &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto produciría un HTML co contido definido insertado nos slots correspondentes en MeuCompoñente.&lt;br /&gt;
&lt;br /&gt;
Tamén é posible pasar e utilizar datos cos slots:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;template&amp;gt; &lt;br /&gt;
        &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que poderíamos utilizar así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &lt;br /&gt;
     &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Facendo consultas ao servidor: Axios ==&lt;br /&gt;
Aquí tes un breve titorial en galego normativo sobre o uso de Axios, unha libraría popular en JavaScript para realizar solicitudes HTTP de forma sinxela e eficiente:&lt;br /&gt;
&lt;br /&gt;
Instalación de Axios&lt;br /&gt;
Para comezar a usar Axios nun proxecto, primeiro debes instalalo. Se estás usando npm, executa o seguinte comando no terminal:&lt;br /&gt;
&lt;br /&gt;
bash&lt;br /&gt;
Copiar código&lt;br /&gt;
npm install axios&lt;br /&gt;
Para proxectos que usan Vue ou React, Axios intégrase facilmente e non require configuración adicional.&lt;br /&gt;
&lt;br /&gt;
Realizar unha Solicitude GET&lt;br /&gt;
Unha das funcións máis básicas de Axios é a solicitude GET, que permite obter datos dun servidor. Por exemplo, se queremos obter unha lista de usuarios dun endpoint, podemos facelo do seguinte xeito:&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
import axios from &#039;axios&#039;;&lt;br /&gt;
&lt;br /&gt;
axios.get(&#039;https://api.exemplo.com/usuarios&#039;)&lt;br /&gt;
    .then(response =&amp;gt; {&lt;br /&gt;
        console.log(response.data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
        console.error(&#039;Erro ao obter os usuarios:&#039;, error);&lt;br /&gt;
    });&lt;br /&gt;
Neste exemplo:&lt;br /&gt;
&lt;br /&gt;
axios.get() envía unha solicitude GET á URL especificada.&lt;br /&gt;
.then() xestiona a resposta cando a solicitude é exitosa.&lt;br /&gt;
.catch() xestiona os erros se a solicitude falla.&lt;br /&gt;
Realizar unha Solicitude POST&lt;br /&gt;
Para enviar datos ao servidor, usamos a solicitude POST. Por exemplo, para crear un novo usuario:&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
axios.post(&#039;https://api.exemplo.com/usuarios&#039;, {&lt;br /&gt;
    nome: &#039;Xoán&#039;,&lt;br /&gt;
    correo: &#039;xoan@exemplo.com&#039;&lt;br /&gt;
})&lt;br /&gt;
.then(response =&amp;gt; {&lt;br /&gt;
    console.log(&#039;Usuario creado:&#039;, response.data);&lt;br /&gt;
})&lt;br /&gt;
.catch(error =&amp;gt; {&lt;br /&gt;
    console.error(&#039;Erro ao crear usuario:&#039;, error);&lt;br /&gt;
});&lt;br /&gt;
Aquí, enviamos un obxecto JSON con información do usuario que queremos crear.&lt;br /&gt;
&lt;br /&gt;
Configuración de Parámetros e Cabeceiras&lt;br /&gt;
Para configurar parámetros ou cabeceiras adicionais, engádeos como terceiro argumento en axios.get() ou axios.post():&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
axios.get(&#039;https://api.exemplo.com/usuarios&#039;, {&lt;br /&gt;
    params: { id: 123 },&lt;br /&gt;
    headers: { &#039;Authorization&#039;: &#039;Bearer token&#039; }&lt;br /&gt;
})&lt;br /&gt;
.then(response =&amp;gt; {&lt;br /&gt;
    console.log(response.data);&lt;br /&gt;
})&lt;br /&gt;
.catch(error =&amp;gt; {&lt;br /&gt;
    console.error(&#039;Erro:&#039;, error);&lt;br /&gt;
});&lt;br /&gt;
Uso de Interceptores&lt;br /&gt;
Os interceptores permiten interceptar solicitudes ou respostas antes de que se procesen. Útil para engadir autenticación ou xestionar erros de forma global:&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
axios.interceptors.request.use(config =&amp;gt; {&lt;br /&gt;
    config.headers[&#039;Authorization&#039;] = &#039;Bearer token&#039;;&lt;br /&gt;
    return config;&lt;br /&gt;
}, error =&amp;gt; {&lt;br /&gt;
    return Promise.reject(error);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
axios.interceptors.response.use(response =&amp;gt; {&lt;br /&gt;
    return response;&lt;br /&gt;
}, error =&amp;gt; {&lt;br /&gt;
    console.error(&#039;Erro na resposta:&#039;, error);&lt;br /&gt;
    return Promise.reject(error);&lt;br /&gt;
});&lt;br /&gt;
Resumo das Funcións Básicas de Axios&lt;br /&gt;
axios.get(url, config): Solicitude GET.&lt;br /&gt;
axios.post(url, data, config): Solicitude POST.&lt;br /&gt;
axios.put(url, data, config): Solicitude PUT para actualizar recursos.&lt;br /&gt;
axios.delete(url, config): Solicitude DELETE para eliminar recursos.&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3406</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3406"/>
		<updated>2024-11-04T17:33:40Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-slot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; &amp;lt;nowiki&amp;gt;{{ $attr }}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== Comezando con plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usalo dende o compoñente pai: &#039;&#039;&#039;&#039;&#039;MeuCompoñente&#039;&#039;&#039;&#039;&#039; na sección &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Os slots con nome permiten crear varios slots con nomes específicos: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/header&amp;gt; &lt;br /&gt;
    &amp;lt;main&amp;gt; &lt;br /&gt;
        &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/main&amp;gt; &lt;br /&gt;
    &amp;lt;footer&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/footer&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que se utilizaría do seguinte xeito: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;MeuCompoñente&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &lt;br /&gt;
   &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto produciría un HTML co contido definido insertado nos slots correspondentes en MeuCompoñente.&lt;br /&gt;
&lt;br /&gt;
Tamén é posible pasar e utilizar datos cos slots:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;template&amp;gt; &lt;br /&gt;
        &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que poderíamos utilizar así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &lt;br /&gt;
     &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Facendo consultas ao servidor: Axios ==&lt;br /&gt;
Aquí tes un breve titorial en galego normativo sobre o uso de Axios, unha libraría popular en JavaScript para realizar solicitudes HTTP de forma sinxela e eficiente:&lt;br /&gt;
&lt;br /&gt;
Instalación de Axios&lt;br /&gt;
Para comezar a usar Axios nun proxecto, primeiro debes instalalo. Se estás usando npm, executa o seguinte comando no terminal:&lt;br /&gt;
&lt;br /&gt;
bash&lt;br /&gt;
Copiar código&lt;br /&gt;
npm install axios&lt;br /&gt;
Para proxectos que usan Vue ou React, Axios intégrase facilmente e non require configuración adicional.&lt;br /&gt;
&lt;br /&gt;
Realizar unha Solicitude GET&lt;br /&gt;
Unha das funcións máis básicas de Axios é a solicitude GET, que permite obter datos dun servidor. Por exemplo, se queremos obter unha lista de usuarios dun endpoint, podemos facelo do seguinte xeito:&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
import axios from &#039;axios&#039;;&lt;br /&gt;
&lt;br /&gt;
axios.get(&#039;https://api.exemplo.com/usuarios&#039;)&lt;br /&gt;
    .then(response =&amp;gt; {&lt;br /&gt;
        console.log(response.data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; {&lt;br /&gt;
        console.error(&#039;Erro ao obter os usuarios:&#039;, error);&lt;br /&gt;
    });&lt;br /&gt;
Neste exemplo:&lt;br /&gt;
&lt;br /&gt;
axios.get() envía unha solicitude GET á URL especificada.&lt;br /&gt;
.then() xestiona a resposta cando a solicitude é exitosa.&lt;br /&gt;
.catch() xestiona os erros se a solicitude falla.&lt;br /&gt;
Realizar unha Solicitude POST&lt;br /&gt;
Para enviar datos ao servidor, usamos a solicitude POST. Por exemplo, para crear un novo usuario:&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
axios.post(&#039;https://api.exemplo.com/usuarios&#039;, {&lt;br /&gt;
    nome: &#039;Xoán&#039;,&lt;br /&gt;
    correo: &#039;xoan@exemplo.com&#039;&lt;br /&gt;
})&lt;br /&gt;
.then(response =&amp;gt; {&lt;br /&gt;
    console.log(&#039;Usuario creado:&#039;, response.data);&lt;br /&gt;
})&lt;br /&gt;
.catch(error =&amp;gt; {&lt;br /&gt;
    console.error(&#039;Erro ao crear usuario:&#039;, error);&lt;br /&gt;
});&lt;br /&gt;
Aquí, enviamos un obxecto JSON con información do usuario que queremos crear.&lt;br /&gt;
&lt;br /&gt;
Configuración de Parámetros e Cabeceiras&lt;br /&gt;
Para configurar parámetros ou cabeceiras adicionais, engádeos como terceiro argumento en axios.get() ou axios.post():&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
axios.get(&#039;https://api.exemplo.com/usuarios&#039;, {&lt;br /&gt;
    params: { id: 123 },&lt;br /&gt;
    headers: { &#039;Authorization&#039;: &#039;Bearer token&#039; }&lt;br /&gt;
})&lt;br /&gt;
.then(response =&amp;gt; {&lt;br /&gt;
    console.log(response.data);&lt;br /&gt;
})&lt;br /&gt;
.catch(error =&amp;gt; {&lt;br /&gt;
    console.error(&#039;Erro:&#039;, error);&lt;br /&gt;
});&lt;br /&gt;
Uso de Interceptores&lt;br /&gt;
Os interceptores permiten interceptar solicitudes ou respostas antes de que se procesen. Útil para engadir autenticación ou xestionar erros de forma global:&lt;br /&gt;
&lt;br /&gt;
javascript&lt;br /&gt;
Copiar código&lt;br /&gt;
axios.interceptors.request.use(config =&amp;gt; {&lt;br /&gt;
    config.headers[&#039;Authorization&#039;] = &#039;Bearer token&#039;;&lt;br /&gt;
    return config;&lt;br /&gt;
}, error =&amp;gt; {&lt;br /&gt;
    return Promise.reject(error);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
axios.interceptors.response.use(response =&amp;gt; {&lt;br /&gt;
    return response;&lt;br /&gt;
}, error =&amp;gt; {&lt;br /&gt;
    console.error(&#039;Erro na resposta:&#039;, error);&lt;br /&gt;
    return Promise.reject(error);&lt;br /&gt;
});&lt;br /&gt;
Resumo das Funcións Básicas de Axios&lt;br /&gt;
axios.get(url, config): Solicitude GET.&lt;br /&gt;
axios.post(url, data, config): Solicitude POST.&lt;br /&gt;
axios.put(url, data, config): Solicitude PUT para actualizar recursos.&lt;br /&gt;
axios.delete(url, config): Solicitude DELETE para eliminar recursos.&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3405</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3405"/>
		<updated>2024-10-27T12:40:16Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Options API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; &amp;lt;nowiki&amp;gt;{{ $attr }}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== Comezando con plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usalo dende o compoñente pai: &#039;&#039;&#039;&#039;&#039;MeuCompoñente&#039;&#039;&#039;&#039;&#039; na sección &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Os slots con nome permiten crear varios slots con nomes específicos: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/header&amp;gt; &lt;br /&gt;
    &amp;lt;main&amp;gt; &lt;br /&gt;
        &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/main&amp;gt; &lt;br /&gt;
    &amp;lt;footer&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/footer&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que se utilizaría do seguinte xeito: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;MeuCompoñente&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &lt;br /&gt;
   &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto produciría un HTML co contido definido insertado nos slots correspondentes en MeuCompoñente.&lt;br /&gt;
&lt;br /&gt;
Tamén é posible pasar e utilizar datos cos slots:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;template&amp;gt; &lt;br /&gt;
        &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que poderíamos utilizar así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &lt;br /&gt;
     &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3404</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3404"/>
		<updated>2024-10-27T11:43:07Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* As plantillas en Vue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== Comezando con plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usalo dende o compoñente pai: &#039;&#039;&#039;&#039;&#039;MeuCompoñente&#039;&#039;&#039;&#039;&#039; na sección &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Os slots con nome permiten crear varios slots con nomes específicos: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/header&amp;gt; &lt;br /&gt;
    &amp;lt;main&amp;gt; &lt;br /&gt;
        &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/main&amp;gt; &lt;br /&gt;
    &amp;lt;footer&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/footer&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que se utilizaría do seguinte xeito: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;MeuCompoñente&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &lt;br /&gt;
   &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto produciría un HTML co contido definido insertado nos slots correspondentes en MeuCompoñente.&lt;br /&gt;
&lt;br /&gt;
Tamén é posible pasar e utilizar datos cos slots:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;template&amp;gt; &lt;br /&gt;
        &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que poderíamos utilizar así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &lt;br /&gt;
     &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3403</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3403"/>
		<updated>2024-10-27T11:42:41Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-slot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usalo dende o compoñente pai: &#039;&#039;&#039;&#039;&#039;MeuCompoñente&#039;&#039;&#039;&#039;&#039; na sección &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Os slots con nome permiten crear varios slots con nomes específicos: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
    &amp;lt;header&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/header&amp;gt; &lt;br /&gt;
    &amp;lt;main&amp;gt; &lt;br /&gt;
        &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/main&amp;gt; &lt;br /&gt;
    &amp;lt;footer&amp;gt; &lt;br /&gt;
       &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/footer&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que se utilizaría do seguinte xeito: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;MeuCompoñente&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &lt;br /&gt;
        &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &lt;br /&gt;
   &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto produciría un HTML co contido definido insertado nos slots correspondentes en MeuCompoñente.&lt;br /&gt;
&lt;br /&gt;
Tamén é posible pasar e utilizar datos cos slots:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;template&amp;gt; &lt;br /&gt;
        &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &lt;br /&gt;
    &amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que poderíamos utilizar así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &lt;br /&gt;
     &amp;lt;/MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3402</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3402"/>
		<updated>2024-10-27T11:31:45Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-slot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usalo dende o compoñente pai: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3401</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3401"/>
		<updated>2024-10-27T11:29:57Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-on */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3400</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3400"/>
		<updated>2024-10-27T11:28:53Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-for */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3399</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3399"/>
		<updated>2024-10-27T11:27:48Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-for */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhightligth&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhightlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3398</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3398"/>
		<updated>2024-10-27T11:26:52Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-for */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhigligth lang=html&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhightligth&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhightlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3397</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3397"/>
		<updated>2024-10-27T11:26:08Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-for */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhiglight lang=html&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhightlight&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/syntaxhightlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3396</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3396"/>
		<updated>2024-10-27T11:25:11Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-for */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhiglight lang=html&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhightlight&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente en &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;, e cada elemento sería renderizado cun valor de id único. Tamén se pode usar o índice da colección de elementos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou utilizar obxectos e as súas propiedades:&lt;br /&gt;
&amp;lt;syntaxhightlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhightlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3395</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3395"/>
		<updated>2024-10-27T11:16:52Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* v-on */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Prevención de comportamento por defecto: Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
*&#039;&#039;&#039;.stop&#039;&#039;&#039;:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
*&#039;&#039;&#039;.self&#039;&#039;&#039;:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
*&#039;&#039;&#039;.capture&#039;&#039;&#039;:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
*&#039;&#039;&#039;.once&#039;&#039;&#039;: Soamente se permite o evento unha vez.&lt;br /&gt;
*&#039;&#039;&#039;.passive&#039;&#039;&#039;: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
; Sintaxe e Exemplos &#039;&#039;&#039;Uso básico:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente, e cada elemento sería renderizado cun valor de id único.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Acceso a índice:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Renderizado de obxectos:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3394</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3394"/>
		<updated>2024-10-27T11:15:14Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Directivas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ====&lt;br /&gt;
A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
; Exemplos &#039;&#039;&#039;Uso básico:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abreviatura:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Con paso de parámetros:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prevención de comportamento por defecto:&#039;&#039;&#039; Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
;.stop:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
;.self:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
;.capture:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
;.once: Soamente se permite o evento unha vez.&lt;br /&gt;
;.passive: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
====v-for==== &lt;br /&gt;
A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
; Sintaxe e Exemplos &#039;&#039;&#039;Uso básico:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente, e cada elemento sería renderizado cun valor de id único.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Acceso a índice:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Renderizado de obxectos:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== v-slot ====&lt;br /&gt;
 A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3393</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3393"/>
		<updated>2024-10-27T11:13:57Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Directivas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*&#039;&#039;&#039;v-on&#039;&#039;&#039;: Para xestionar eventos de usuario&lt;br /&gt;
*&#039;&#039;&#039;v-for&#039;&#039;&#039;: Para procesar listas de datos de xeito repetitivo (producindo grupos de elementos HTML na plantilla)&lt;br /&gt;
*&#039;&#039;&#039;v-slot&#039;&#039;&#039;: Para pasar contido de plantilla dende o pai ao fillo&lt;br /&gt;
&lt;br /&gt;
==== v-on ==== A directiva v-on úsase para xestionar eventos de usuario, como pulsar un botón ou escribir nun campo de texto, e permite executar métodos específicos ao detectar eses eventos. Pódese abreviar usando @.&lt;br /&gt;
&lt;br /&gt;
; Exemplos &#039;&#039;&#039;Uso básico:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;button v-on:click=&amp;quot;saudar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto asocia o evento click co método saludar, que debería estar definido no compoñente na seccion &amp;lt;nowiki&amp;gt;&amp;lt;script setup&amp;gt;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abreviatura:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;saludar&amp;quot;&amp;gt;Prema aquí&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Con paso de parámetros:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;button @click=&amp;quot;incrementar(5)&amp;quot;&amp;gt;Incrementar&amp;lt;/button&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prevención de comportamento por defecto:&#039;&#039;&#039; Para evitar o comportamento por defecto dun evento (como o envío dun formulario), úsase o modificador .prevent na plantilla HTML: &amp;lt;nowiki&amp;gt;&amp;lt;form @submit.prevent=&amp;quot;procesarFormulario&amp;quot;&amp;gt;...&amp;lt;/form&amp;gt;&amp;lt;/nowiki&amp;gt;. Outros modificadores posibles para usar na xestión de eventos na plantila son:&lt;br /&gt;
;.stop:Evita a propagación do evento a través dos elementos pai.&lt;br /&gt;
;.self:Unicamente atende a eventos producidos no propio elemento, sin facer caso a os elementos fillos&lt;br /&gt;
;.capture:Indica que os eventos de este tipo producidos nos elementos interiores son xestionados por este método.&lt;br /&gt;
;.once: Soamente se permite o evento unha vez.&lt;br /&gt;
;.passive: Indica que se procesará o evento nativamente sen esperar a que se execute o xestor indicado&lt;br /&gt;
&lt;br /&gt;
Os eventos de teclado, de xeito similar poden levar &#039;&#039;.enter, .page-dowwn, .tab, .delete, .esc, .space, .up, .down, .left, .right,.ctrl,.alt,.shift,.meta&#039;&#039; identificando a tecla pulsada&#039;&#039; e os de rato &#039;&#039;.left, right ou .middle&#039;&#039; identificando o botón pulsado.&lt;br /&gt;
=== 2. v-for === A directiva v-for é empregada para renderizar listas e repetir un compoñente ou elemento en función dunha colección de datos, como un array. Require que se especifique un key único en cada elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
; Sintaxe e Exemplos &#039;&#039;&#039;Uso básico:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;elemento in lista&amp;quot; :key=&amp;quot;elemento.id&amp;quot;&amp;gt;{{ elemento.nome }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Neste caso, lista debería ser unha colección de obxectos definida no compoñente, e cada elemento sería renderizado cun valor de id único.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Acceso a índice:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;(elemento, índice) in lista&amp;quot; :key=&amp;quot;índice&amp;quot;&amp;gt; {{ índice }} - {{ elemento.nome }} &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Renderizado de obxectos:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li v-for=&amp;quot;(valor, chave) in obxecto&amp;quot; :key=&amp;quot;chave&amp;quot;&amp;gt;{{ chave }}: {{ valor }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=== 3. v-slot === A directiva v-slot permite crear e pasar contidos personalizados a compoñentes fillo desde o pai, mellorando a modularidade ao permitir especificar diferentes partes do contido dende o compoñente pai.&lt;br /&gt;
&lt;br /&gt;
; Exemplo de uso básico Definir un slot nun compoñente: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usalo dende o compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este parágrafo será amosado dentro do slot do compoñente.&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots con nome Permite crear varios slots con nomes específicos: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;header&amp;gt; &amp;lt;slot name=&amp;quot;cabeceira&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;footer&amp;gt; &amp;lt;slot name=&amp;quot;pé&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/footer&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Usando slots con nome no compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente&amp;gt; &amp;lt;template v-slot:cabeceira&amp;gt; &amp;lt;h1&amp;gt;Cabeceira personalizada&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Este é o contido principal.&amp;lt;/p&amp;gt; &amp;lt;template v-slot:pé&amp;gt; &amp;lt;p&amp;gt;Pé de páxina personalizado&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
; Slots dinámicos Pódese pasar datos ao slot e acceder a eles mediante o uso de “scoped slots”: &amp;lt;nowiki&amp;gt;&amp;lt;template&amp;gt; &amp;lt;slot :datos=&amp;quot;datosExemplo&amp;quot;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No compoñente pai: &amp;lt;nowiki&amp;gt;&amp;lt;MeuCompoñente v-slot=&amp;quot;{ datos }&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Os datos pasados son: {{ datos }}&amp;lt;/p&amp;gt; &amp;lt;/MeuCompoñente&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3392</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3392"/>
		<updated>2024-10-27T10:56:11Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Directivas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; en función da veracidade do valor da expresión lóxica &#039;&#039;seen&#039;&#039;. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3391</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3391"/>
		<updated>2024-10-27T10:54:53Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3390</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3390"/>
		<updated>2024-10-27T10:53:47Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{ formatDate(date) }}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3389</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3389"/>
		<updated>2024-10-27T10:52:33Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
# &#039;&#039;&#039;{{ formatDate(date) }}&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
#* &#039;&#039;&#039;formatDate(date)&#039;&#039;&#039;: Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3388</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3388"/>
		<updated>2024-10-27T10:51:01Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. &lt;br /&gt;
: Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;{{ formatDate(date) }}&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
;;* formatDate(date): Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3387</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3387"/>
		<updated>2024-10-27T10:50:46Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title. : Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;{{ formatDate(date) }}&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
;;* formatDate(date): Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3386</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3386"/>
		<updated>2024-10-27T10:50:00Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
#* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title.&lt;br /&gt;
:&lt;br /&gt;
Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;{{ formatDate(date) }}&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
;;* formatDate(date): Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3385</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3385"/>
		<updated>2024-10-27T10:47:09Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:title=&amp;quot;toTitleDate(date)&amp;quot;&#039;&#039;&#039;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
;;* &#039;&#039;&#039;toTitleDate(date)&#039;&#039;&#039;: Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title.&lt;br /&gt;
&lt;br /&gt;
;Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;:datetime=&amp;quot;date&amp;quot;&#039;&#039;&#039;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;{{ formatDate(date) }}&#039;&#039;&#039;: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
;;* formatDate(date): Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3384</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3384"/>
		<updated>2024-10-27T10:45:43Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# :title=&amp;quot;toTitleDate(date)&amp;quot;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
;* toTitleDate(date): Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
&lt;br /&gt;
# :datetime=&amp;quot;date&amp;quot;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
&lt;br /&gt;
#{{ formatDate(date) }}: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
&lt;br /&gt;
formatDate(date): Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3383</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3383"/>
		<updated>2024-10-27T10:45:21Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Chamando funcións */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighligth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# :title=&amp;quot;toTitleDate(date)&amp;quot;: O atributo title establécese de forma dinámica mediante v-bind, utilizando a sintaxe abreviada :. Isto indica que title tomará o seu valor do resultado da chamada ao método toTitleDate(date).&lt;br /&gt;
;* toTitleDate(date): Este método debería estar definido no compoñente, ben na sección methods (en Options API) ou directamente na función setup (en Composition API). A súa finalidade é formatear a data (date) nunha cadea que será usada como valor do atributo title.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, toTitleDate podería devolver algo como &amp;quot;20 de Outubro de 2024&amp;quot; para amosar unha data legible cando o usuario poña o cursor enriba do tempo.&lt;br /&gt;
&lt;br /&gt;
# :datetime=&amp;quot;date&amp;quot;: Aquí tamén se usa v-bind para ligar o valor do atributo datetime a unha variable date. Isto fai que datetime reciba directamente o valor de date. O atributo datetime en etiquetas &amp;lt;time&amp;gt; require un formato específico (xeralmente o formato ISO 8601, como 2024-10-20T00:00:00Z), xa que axuda a indicar a data exacta para fins de SEO e accesibilidade.&lt;br /&gt;
&lt;br /&gt;
#{{ formatDate(date) }}: O contido dentro da etiqueta &amp;lt;time&amp;gt; utiliza formatDate(date) para amosar a data formateada.&lt;br /&gt;
&lt;br /&gt;
formatDate(date): Este método, similar a toTitleDate, debería estar definido no compoñente e pode transformar date nun formato amigable para o usuario, como &amp;quot;20/10/2024&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3382</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3382"/>
		<updated>2024-10-27T10:42:43Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Usando expresións de JavaScript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente. As comiñas invertidas ` na última expresión, permiten incluir variables para crear un texto pechadas con ${}.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3381</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3381"/>
		<updated>2024-10-27T10:38:41Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Instalación */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3380</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3380"/>
		<updated>2024-10-27T10:38:03Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Desenvolvendo o Frontend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
==Instalación==&lt;br /&gt;
Existen varios modos de instalación:&lt;br /&gt;
===Inclusión Direta con &amp;lt;script&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creación dunha aplicación Vue con Node ===&lt;br /&gt;
Vue proporciona un completo framework baseado en Node.js co que podemos desenvolver unha aplicación, &amp;quot;compilar&amp;quot; as plantillas e conseguir unha versión final de distribución. Para iso se empregan unha serie de utilidades (build tools) que nos axudarán nas distintas fases do proxecto. Unha desas ferramentas é &#039;&#039;&#039;Vite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Vite&#039;&#039; é unha ferramenta de desenvolvemento de front-end moderna que se utiliza para a creación de aplicacións web rápidas e eficientes. Foi creada por Evan You, o mesmo creador de &#039;&#039;Vue.js&#039;&#039;, aínda que &#039;&#039;Vite&#039;&#039; non está limitado só a &#039;&#039;Vue&#039;&#039;, xa que tamén soporta outros frameworks como &#039;&#039;React&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A función de &#039;&#039;Vite&#039;&#039; dentro do ecosistema Vue é a &amp;quot;compilación&amp;quot; das plantillas (ES Modules) durante o desenvolvemento e a optimización final para producción.&lt;br /&gt;
&lt;br /&gt;
En primeiro lugar, se debe crear a estrutura da aplicación mediante o uso de xestores de paquetes JavaScript como &#039;&#039;&#039;npm&#039;&#039; (Node Package Manager) ou &#039;&#039;&#039;yarn&#039;&#039; (Yet Another Resource Negotiator) entre outros:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durante a configuración inicial da aplicación o sistema nos preguntará detalles como:&lt;br /&gt;
* &#039;&#039;&#039;o nome do proxecto&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;si imos usar TypeScript&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;si queremos JSX&#039;&#039;&#039; (unha extensión para escribir capas de presentacón dentro do JavaScript para crear interfaces demasiado complexas para as plantillas)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Vue-Router&#039;&#039;&#039; (que nos facilita a creación de SPA a través de rutas para a transición entre compoñentes para presentar o contido solicitado ao servidor)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Plinia&#039;&#039;&#039; (que nos permite compartir o estado --información-- entre distintos compoñentes da aplicación Vue)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Vitest&#039;&#039;&#039; (que é un framework para a realización de tests unitarios &#039;&#039;&#039;)&lt;br /&gt;
*&#039;&#039;&#039;si queremos engadir un sistema de Testing&#039;&#039;&#039; (nos ofrece Cypress, Nightwatch ou Playwrigth)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar ESLint&#039;&#039;&#039; (analiza problemas de estilo, erros de sintaxe, se xera a configuración para VSCode e podemos utilizalo dende a liña de comandos con &#039;&#039;&#039;npx eslint .&#039;&#039;&#039; ou &#039;&#039;&#039;npx eslint . --fix&#039;&#039;&#039;. Mediante npx podemos executar paquetes instalados con npm sen instalalos no sistema)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Prettier&#039;&#039;&#039; (formatea o código revisando tabuladores, espazos.. de xeito que quede lexible)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar as extensións de depuración de Vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unha vez iniciado o proxecto o sistema nos indicará:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Done. Now run:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;quot;&amp;lt;proxecto&amp;gt;&amp;quot;&lt;br /&gt;
  npm install&lt;br /&gt;
  npm run dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;npm install&#039;&#039;&#039; instalará todos os módulos JavaScript necesarios para Vue&lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; lanzará unha instancia do servidor web de Node para probar o noso proxecto. Inicialmente so aceptará conexións en localhost. Para cambiar a configuración deste servidor de desenvolvemento debemos modificar o arquivo &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O esquema do proxecto será similar a este:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Co obxectivo de usar rutas correctas a os distintos recursos, se dispón nos compoñentes de Vue do caracter @ para indicar src como raíz. Cando se desenvolva para producción as url se axustarán do xeito necesario.&lt;br /&gt;
Para crear a aplicación que serviremos mediante un Apache, debemos construila con &#039;&#039;&#039;npm run build&#039;&#039;&#039; e instalar o contido da carpeta build no root do sitio web. Debemos habilitar o módulo &#039;&#039;rewrite&#039;&#039; para que funcionen as rutas de Vue.&lt;br /&gt;
&lt;br /&gt;
Unha aplicación básica tería o seguinte aspecto:&lt;br /&gt;
*&#039;&#039;&#039;index.htnl&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Hola Mundo con Vue 3&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt; &lt;br /&gt;
    &amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- Elemento donde se montará la aplicación --&amp;gt; &lt;br /&gt;
    &amp;lt;script type=&amp;quot;module&amp;quot; src=&amp;quot;/src/main.ts&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;
    &amp;lt;/script&amp;gt;   &lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/src/App.vue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
        import Module from &#039;@/components/Module/Module.vue&#039;&lt;br /&gt;
        const nombre=&amp;quot;Test para Iass Cloud&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
        &amp;lt;Module msg=&amp;quot;You did it!&amp;quot; /&amp;gt;&lt;br /&gt;
        {{ nombre }}    Hola Mundo!&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/src/compoents/Module/Module.vue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style src=&amp;quot;@/components/Module/module.css&amp;quot; scoped&amp;gt;&amp;lt;/style&amp;gt; &amp;lt;!-- Importar CSS específico del componente --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
        defineProps&amp;lt;{msg: string}&amp;gt;()&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt; {{msg}} It&#039;s Work - Has a background icon ?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este contexto, o marcador @ indica nas URL a carpeta /src do proxecto, e se pode usar como inicio de acceso aos recursos dentro de /src&lt;br /&gt;
&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3379</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3379"/>
		<updated>2024-10-26T17:34:50Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Composition API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
==Desenvolvendo o Frontend==&lt;br /&gt;
&lt;br /&gt;
==Instalación==&lt;br /&gt;
Existen varios modos de instalación:&lt;br /&gt;
===Inclusión Direta con &amp;lt;script&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creación dunha aplicación Vue con Node ===&lt;br /&gt;
Vue proporciona un completo framework baseado en Node.js co que podemos desenvolver unha aplicación, &amp;quot;compilar&amp;quot; as plantillas e conseguir unha versión final de distribución. Para iso se empregan unha serie de utilidades (build tools) que nos axudarán nas distintas fases do proxecto. Unha desas ferramentas é &#039;&#039;&#039;Vite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Vite&#039;&#039; é unha ferramenta de desenvolvemento de front-end moderna que se utiliza para a creación de aplicacións web rápidas e eficientes. Foi creada por Evan You, o mesmo creador de &#039;&#039;Vue.js&#039;&#039;, aínda que &#039;&#039;Vite&#039;&#039; non está limitado só a &#039;&#039;Vue&#039;&#039;, xa que tamén soporta outros frameworks como &#039;&#039;React&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A función de &#039;&#039;Vite&#039;&#039; dentro do ecosistema Vue é a &amp;quot;compilación&amp;quot; das plantillas (ES Modules) durante o desenvolvemento e a optimización final para producción.&lt;br /&gt;
&lt;br /&gt;
En primeiro lugar, se debe crear a estrutura da aplicación mediante o uso de xestores de paquetes JavaScript como &#039;&#039;&#039;npm&#039;&#039; (Node Package Manager) ou &#039;&#039;&#039;yarn&#039;&#039; (Yet Another Resource Negotiator) entre outros:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durante a configuración inicial da aplicación o sistema nos preguntará detalles como:&lt;br /&gt;
* &#039;&#039;&#039;o nome do proxecto&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;si imos usar TypeScript&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;si queremos JSX&#039;&#039;&#039; (unha extensión para escribir capas de presentacón dentro do JavaScript para crear interfaces demasiado complexas para as plantillas)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Vue-Router&#039;&#039;&#039; (que nos facilita a creación de SPA a través de rutas para a transición entre compoñentes para presentar o contido solicitado ao servidor)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Plinia&#039;&#039;&#039; (que nos permite compartir o estado --información-- entre distintos compoñentes da aplicación Vue)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Vitest&#039;&#039;&#039; (que é un framework para a realización de tests unitarios &#039;&#039;&#039;)&lt;br /&gt;
*&#039;&#039;&#039;si queremos engadir un sistema de Testing&#039;&#039;&#039; (nos ofrece Cypress, Nightwatch ou Playwrigth)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar ESLint&#039;&#039;&#039; (analiza problemas de estilo, erros de sintaxe, se xera a configuración para VSCode e podemos utilizalo dende a liña de comandos con &#039;&#039;&#039;npx eslint .&#039;&#039;&#039; ou &#039;&#039;&#039;npx eslint . --fix&#039;&#039;&#039;. Mediante npx podemos executar paquetes instalados con npm sen instalalos no sistema)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Prettier&#039;&#039;&#039; (formatea o código revisando tabuladores, espazos.. de xeito que quede lexible)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar as extensións de depuración de Vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unha vez iniciado o proxecto o sistema nos indicará:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Done. Now run:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;quot;&amp;lt;proxecto&amp;gt;&amp;quot;&lt;br /&gt;
  npm install&lt;br /&gt;
  npm run dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;npm install&#039;&#039;&#039; instalará todos os módulos JavaScript necesarios para Vue&lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; lanzará unha instancia do servidor web de Node para probar o noso proxecto. Inicialmente so aceptará conexións en localhost. Para cambiar a configuración deste servidor de desenvolvemento debemos modificar o arquivo &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O esquema do proxecto será similar a este:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Co obxectivo de usar rutas correctas a os distintos recursos, se dispón nos compoñentes de Vue do caracter @ para indicar src como raíz. Cando se desenvolva para producción as url se axustarán do xeito necesario.&lt;br /&gt;
Para crear a aplicación que serviremos mediante un Apache, debemos construila con &#039;&#039;&#039;npm run build&#039;&#039;&#039; e instalar o contido da carpeta build no root do sitio web. Debemos habilitar o módulo &#039;&#039;rewrite&#039;&#039; para que funcionen as rutas de Vue.&lt;br /&gt;
&lt;br /&gt;
Unha aplicación básica tería o seguinte aspecto:&lt;br /&gt;
*&#039;&#039;&#039;index.htnl&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Hola Mundo con Vue 3&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt; &lt;br /&gt;
    &amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- Elemento donde se montará la aplicación --&amp;gt; &lt;br /&gt;
    &amp;lt;script type=&amp;quot;module&amp;quot; src=&amp;quot;/src/main.ts&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;
    &amp;lt;/script&amp;gt;   &lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/src/App.vue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
        import Module from &#039;@/components/Module/Module.vue&#039;&lt;br /&gt;
        const nombre=&amp;quot;Test para Iass Cloud&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
        &amp;lt;Module msg=&amp;quot;You did it!&amp;quot; /&amp;gt;&lt;br /&gt;
        {{ nombre }}    Hola Mundo!&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/src/compoents/Module/Module.vue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style src=&amp;quot;@/components/Module/module.css&amp;quot; scoped&amp;gt;&amp;lt;/style&amp;gt; &amp;lt;!-- Importar CSS específico del componente --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
        defineProps&amp;lt;{msg: string}&amp;gt;()&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt; {{msg}} It&#039;s Work - Has a background icon ?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este contexto, o marcador @ indica nas URL a carpeta /src do proxecto, e se pode usar como inicio de acceso aos recursos dentro de /src&lt;br /&gt;
&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3378</id>
		<title>Vue 3</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Vue_3&amp;diff=3378"/>
		<updated>2024-10-26T17:33:05Z</updated>

		<summary type="html">&lt;p&gt;Xavi: /* Composition API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introdución==&lt;br /&gt;
Vue (pronunciado /vjuː/, como view) é un framework progresivo para construír interfaces de usuario.  A biblioteca central está enfocada só na capa de visualización, e é doada de utilizar e integrar con outras bibliotecas ou proxectos existentes.&lt;br /&gt;
&lt;br /&gt;
Vue dispón dun &amp;quot;compilador&amp;quot; que se encarga de transformar as plantillas (compoñentes) de Vue en código JavaScript optimizado que utilizará o navegador para visualizar a páxina, encargándose de procesar as plantillas e os datos para producir o contido.&lt;br /&gt;
&lt;br /&gt;
As distribucións de desenvolvemento de &#039;&#039;Vue&#039;&#039; inclúen o compilador, polo que podemos crear e probar a aplicación con ficheiros individuais cos distintos compoñentes da nosa web (arquivos .vue) e probala mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;. Con Vue normalmente ven integrado un xestor de proxectos (Vite e Vue CLI) que ademais proporciona un servidor web para poder ir probando o desenvolvemento.&lt;br /&gt;
&lt;br /&gt;
Unha vez rematado o frontend, se &amp;quot;compila&amp;quot; (build) xerando o frontend de produción mediante o comando &#039;&#039;&#039;&#039;&#039;npm run build&#039;&#039;&#039;&#039;&#039;. Este comando xerará unha versión da distribución da web dentro da carpeta build que podemos copiar ao raiz do noso servidor de produción.&lt;br /&gt;
&lt;br /&gt;
==Elaboración dun Front-End con Vue==&lt;br /&gt;
===Instalación da contorna de desenvolvemento ===&lt;br /&gt;
Para desenvolver un frontend con Vue o mais apropiado e o uso do xestor de paquetes &#039;&#039;&#039;npm&#039;&#039;&#039; dentro da carpeta onde imos desenvolver o frontend, que non ten nada que ver coa carpeta onde se instalará o servizo web de producción.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mediante este comando se recopilan todos os módulos necesarios para o desenvolvemento e creación de frontend realizando unha serie de preguntas sobre as tecnoloxías que queremos empregar. E recomendable o uso de TypeScript e ESLint. Normalmente o axeitado e desenvolver mediante VSCode, xa que trae plugins que fan cómodo o desenvolvemento. Vue instalará un compoñente de &amp;quot;Benvida&amp;quot;, que será o &amp;quot;frontend por defecto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Unha vez executado ese comando, se crea a lista de software necesario que podemos instalar no proxecto &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A estrutura da aplicación na carpeta será similar a esta:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── vite.config.ts&lt;br /&gt;
└── eslint.config.ts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;index.html&#039;&#039;&#039; e o punto de carga do frontend de desenvolvemento (unha vez compilado con npm run prod, se creará unha versión de index.html preparada para o despregamento na carpeta build). O desenvolvemento terá lugar na carpeta &#039;&#039;&#039;src&#039;&#039;&#039;, que se identificará no proxecto como a carpeta @ para as rutas.&lt;br /&gt;
&lt;br /&gt;
Dentro da carpeta &#039;&#039;&#039;src&#039;&#039;&#039; temos o punto de entrada do frontend Vue, que é o arquivo &#039;&#039;main.ts&#039;&#039; ou &#039;&#039;main.js&#039;&#039; (dependendo de si utilizamos JavaScript ou TypeScript) e &#039;&#039;&#039;&#039;&#039;App.vue&#039;&#039;&#039;&#039;&#039; que é o compoñente principal que &amp;quot;debuxará&amp;quot; o frontend a presentar dentro do &#039;&#039;index.html&#039;&#039; da páxina.&lt;br /&gt;
&lt;br /&gt;
En App.vue teremos o frontend que se amosará si lanzamos a versión de desenvolvemento mediante &#039;&#039;&#039;&#039;&#039;npm run dev&#039;&#039;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
Si queremos poder acceder cun cliente remoto (en outra máquina) debemos modificar a información do ficheiro &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
vite.config.ts:&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O punto de entrada dunha aplicación &amp;quot;&amp;quot;&amp;quot;Vue&amp;quot;&amp;quot;&amp;quot; é normalmente un arquivo chamado &amp;quot;&amp;quot;&amp;quot;main.js&amp;quot;&amp;quot;&amp;quot; (ou &amp;quot;&amp;quot;&amp;quot;main.ts&amp;quot;&amp;quot;&amp;quot; se estás utilizando TypeScript). Este arquivo é onde se crea e configura a instancia da aplicación Vue e se monta nun elemento HTML-&lt;br /&gt;
&lt;br /&gt;
=== Internacionalización===&lt;br /&gt;
Si queremos que o noso frontend soporte varios idiomas necesitaremos o módulo &#039;&#039;vue-i18n&#039;&#039; que podemos instalar con &#039;&#039;&#039;npm install vue-i18n&#039;&#039;&#039;. Este módulo nos proporcionará a posibilidade de utilizar diccionarios en JSON nos que estarán as traduccións das distintas cadeas de texto do front-end situados en &#039;&#039;&#039;src/locales&#039;&#039;&#039; como &#039;&#039;es.json&#039;&#039;, &#039;&#039;gl.json&#039;&#039; ou &#039;&#039;en.json&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Configure&amp;quot;:&amp;quot;Configurar&amp;quot;,&lt;br /&gt;
&amp;quot;Log Out&amp;quot;:&amp;quot;Saír&amp;quot;,&lt;br /&gt;
&amp;quot;Log In&amp;quot;: &amp;quot;Iniciar Sesión&amp;quot;,&lt;br /&gt;
&amp;quot;User&amp;quot;:&amp;quot;Usuario&amp;quot;,&lt;br /&gt;
&amp;quot;Password&amp;quot;:&amp;quot;Contrasinal&amp;quot;,&lt;br /&gt;
&amp;quot;Did you forget your password?&amp;quot;:&amp;quot;¿ Esqueciches o teu contrasinal ?&amp;quot;,&lt;br /&gt;
&amp;quot;Incorrect username or password&amp;quot;:&amp;quot;Usuario ou contrasinal incorrectas&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Será necesario a carga do módulo &#039;&#039;&#039;i18n&#039;&#039;&#039; no programa principal &#039;&#039;&#039;main.ts&#039;&#039;&#039;, que pode quedar algo similar a esto:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import App from &#039;@/App.vue&#039;;&lt;br /&gt;
import { createApp } from &#039;vue&#039;;&lt;br /&gt;
import { createI18n } from &#039;vue-i18n&#039;;&lt;br /&gt;
&lt;br /&gt;
import en from &#039;@/locales/en.json&#039;;&lt;br /&gt;
import es from &#039;@/locales/es.json&#039;;&lt;br /&gt;
import gl from &#039;@/locales/gl.json&#039;;&lt;br /&gt;
&lt;br /&gt;
const messages={ en, es, gl };&lt;br /&gt;
&lt;br /&gt;
// Collemos por defecto a linguaxe do navegador&lt;br /&gt;
const userLocale = navigator.language || &#039;gl&#039;;&lt;br /&gt;
&lt;br /&gt;
// Crear a instancia de i18n e definir o idioma predeterminado&lt;br /&gt;
const i18n = createI18n({&lt;br /&gt;
  locale: userLocale, // Idioma predeterminado&lt;br /&gt;
  fallbackLocale: &#039;en&#039;,  // Si non atopamos no idioma actual, usamos este&lt;br /&gt;
  messages,     // Recursos de tradución&lt;br /&gt;
  numberFormats: {&lt;br /&gt;
    en: { currency: { style: &#039;currency&#039;, currency: &#039;USD&#039; } },&lt;br /&gt;
    es: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } },&lt;br /&gt;
    gl: { currency: { style: &#039;currency&#039;, currency: &#039;EUR&#039; } }&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
const app=createApp(App).use(i18n).mount(&#039;#app&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto nos proporcionará nas plantillas o método &#039;&#039;&#039;$t()&#039;&#039;&#039;, que se encargará de substituír o texto entre paréntese polo lido do dicionario.&lt;br /&gt;
&lt;br /&gt;
===Os Compoñentes Vue===&lt;br /&gt;
Os frontends construídos en Vue comezan no script &#039;&#039;main.ts ou main.js&#039;&#039; coa creación dunha intancia de aplicación mediante a función &#039;&#039;&#039;createApp&#039;&#039;&#039;. Esa aplicación consiste nun compoñente que se incrustará nun elemento do DOM de index.html. Ese compoñente pode facer uso a súa vez de outros compoñentes para conformar o frontend. Aínda que un frontend pode ter varias aplicacións cada unha co seu compoñente raíz, o habitual e ter unha única aplicación.&lt;br /&gt;
&lt;br /&gt;
Un SFC (Single File Component) de Vue, como suxire o nome, encapsula a lóxica do compoñente (JavaScript), a plantilla (HTML) e os estilos (CSS) nun único ficheiro normalmente coa extensión &#039;&#039;&#039;.vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un exemplo de compoñente Vue (Vue.js) mínimo que pode ser &amp;quot;incrustado&amp;quot; pode ser este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
    const nome=&amp;quot;O meu primeiro compoñente Vue&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;  &lt;br /&gt;
   Hola Mundo!!! {{ nome }}&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O contido do main.js, podería ser o seguinte:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { createApp } from &#039;vue&#039;&lt;br /&gt;
// import the root component App from a single-file component.&lt;br /&gt;
import App from &#039;./App.vue&#039;   // Importamos o compoñente&lt;br /&gt;
&lt;br /&gt;
const app = createApp(App) // Creamos a aplicación&lt;br /&gt;
app.mount(&amp;quot;#app&amp;quot;); // Incrustamos o compoñente Vue no index.html no elemento con id &amp;quot;app&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos observar no compoñente Vue, se aprecian tres seccións diferentes:&lt;br /&gt;
;&amp;lt;script setup&amp;gt;: Esta sección contén o código javascript que se levará a cabo cando se &amp;quot;monte&amp;quot; o compoñente na páxina, o que normalmente sucede unha única vez. Os compoñentes poden recibir parámetros dende main.ts ou main.js ou dende outro código javascript dun compoñente.&lt;br /&gt;
;&amp;lt;template&amp;gt;: Contén a plantilla HTML que producirá a presentación a ser incrustada na páxina, reemplazando a información na plantilla segundo a linguaxe de plantillas de Vue.&lt;br /&gt;
;&amp;lt;style&amp;gt;: Conten o código CSS para a plantilla indicada en &amp;lt;template&amp;gt; Si especificamos &#039;&#039;scoped&#039;&#039; os estilos aquí especificados unicamente serán efectivos para esta plantilla, si non, serán efectivos de xeito global.&lt;br /&gt;
&lt;br /&gt;
=== Options API ===&lt;br /&gt;
Options API é un dos sistemas de deseño de compoñentes que pode usar Vue. Options API é o &amp;quot;modo tradicional&amp;quot;, e consiste en definir a lóxica dun compoñente usando un obxecto javascript con distintos métodos e atributos que cubren o ciclo de vida e funcionalidades do compoñente:&lt;br /&gt;
;name: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; indica o nome do compoñente.&lt;br /&gt;
;data(): Este &#039;&#039;&#039;método&#039;&#039;&#039; define o estado reactivo local do compoñente. Retorna un obxecto coas propiedades que desexamos sexan empregados no procesamento da plantilla de xeito reactivo.&lt;br /&gt;
;created(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é creado.&lt;br /&gt;
;mounted():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cando o compoñente é montado no DOM. &lt;br /&gt;
;updated():  Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que é necesario actualizar a plantilla.&lt;br /&gt;
;destroyed(): Este &#039;&#039;&#039;método&#039;&#039;&#039; se executa cada vez que o compoñente se elimina.&lt;br /&gt;
;provide() / inject:  O &#039;&#039;&#039;método provide()&#039;&#039;&#039; permite compartir datos entre compoñentes &amp;quot;pais&amp;quot; e &amp;quot;fillos&amp;quot;. &#039;&#039;provide()&#039;&#039; Debe retornar un obxecto onde se especifique como atributos a información a compartir. Esta información pode ser accedida polos fillos mediante o &#039;&#039;&#039;atributo inject&#039;&#039;&#039;, que indicará nun array o conxunto de datos &amp;quot;provided&amp;quot; a utilizar.&lt;br /&gt;
;props: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; especifica os datos (parámetros) que pode recibir o compoñente cando é &amp;quot;incluído&amp;quot; na web. &lt;br /&gt;
;computed: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos especificar como atributos na plantilla, deste xeito podemos eliminar a lóxica da plantilla deixandoa máis limpa e fácil de manter.&lt;br /&gt;
;methods: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que podemos chamar dende a plantilla, principalmente como xestores de eventos. Si queremos, podemos usar para o método o mesmo identificador que o atributo que queremos &amp;quot;recalcular&amp;quot;, de xeito que se refrescará cando o valor do atributo cambie.&lt;br /&gt;
;watch: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén métodos que &amp;quot;observan&amp;quot; certas propiedades, executando un método cando se produce un cambio. Debemos identificar o método co mesmo nome que o atributo que queremos vixiar, e recibirá como parámetros o valor futuro e o valor actual.&lt;br /&gt;
;components: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena un obxecto que contén compoñentes dos que queremos poder facer uso no compoñente actual.&lt;br /&gt;
;mixins: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que permite reutilizar funcionalidade para que sexa utilizada en varios compoñentes. Permiten compartir métodos, datos e ciclo de vida entre diferentes compoñentes. En primeiro lugar, se debe crar o &amp;quot;mixin&amp;quot; que consistirá nunha variable que almacene un obxecto coa información a reutilizar. Esa información se poderá utilizar en novos compoñentes especificando os mixin desexados no seu atributo mixins.&lt;br /&gt;
;directives: Este atributo almacena obxectos que almacena métodos a aplicar a elementos concretos do DOM en unha frase concreta do ciclo de vida do compoñente (hooks). Os elementos que especifiquen v-[metodo] executarán a directiva no hook indicado que pode ser &#039;&#039;&#039;created,beforeMount,mounted,beforeUpdate,updated,beforeUmount e unmounted&amp;quot;. &lt;br /&gt;
;extends: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; permite especificar un compoñente base do que se herdan as funcionalidades. E similar aos mixin, pero indicando un único compoñente.&lt;br /&gt;
;inheritAttrs: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; booleano controla a herdanza dos atributos. Por defecto os atributos especificados nun compoñente incluído que non son declarados como propiedades, se inclúen como atributos no elemento raíz do template, engadíndose as existentes si é o caso. Especificando &#039;&#039;&#039;false&#039;&#039;&#039; evitamos este comportamento, pero serán accesibles co prefixo &amp;quot;$&amp;quot; {{ $attr }}&lt;br /&gt;
;emits:Este &#039;&#039;&#039;atributo&#039;&#039;&#039; é un array que conten un conxunto de métodos que &amp;quot;poden ser emitidos&amp;quot; mediante &#039;&#039;&#039;&#039;&#039;this.$emit&#039;&#039;&#039;&#039;&#039;. Este evento pode ser capturado co atributo &#039;&#039;@evento&#039;&#039; na chamada ao compoñente.&lt;br /&gt;
;template: Este &#039;&#039;&#039;atributo&#039;&#039;&#039; almacena a plantilla a ser transformada en HTML e incrustada no DOM. Tamén pode indicarse fora do script entre &amp;lt;template&amp;gt; e &amp;lt;/template&amp;gt;. A template define o documento a ser incrustado no DOM unha vez procesado coa información producida pola sección &amp;lt;script&amp;gt; e aplicando o estilo especificado na sección &amp;lt;style&amp;gt;.  A reactividade garante que si os datos cambian, o template é procesado de novo para xerar unha nova saida.&lt;br /&gt;
&lt;br /&gt;
=== Composition API ===&lt;br /&gt;
Coa Composition API utilízamos normalmente &amp;lt;script setup&amp;gt; para indicar o JavaScript a utilizar na inicialización do componente. Outra posibilidade é especificar un método setup() co mesmo código. &lt;br /&gt;
Si queremos que o compoñente poda recibir parámtros, os debemos especificar mediante o atributo &#039;&#039;&#039;props&#039;&#039;&#039;, que conten un obxecto que indica todos os atributos que se poden recibir cando se chama ao compoñente.&lt;br /&gt;
Todos os parámetros declarados en &#039;&#039;props&#039;&#039; son reactivos. En esta API podemos seleccionar que outros datos queremos que sexan reactivos de modo específico mediante os métodos&#039;&#039;&#039;ref&#039;&#039;&#039; ou &#039;&#039;&#039;reactive&#039;&#039;&#039; (en options API, os datos se teñen que declarar en data() e sempre son reactivos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ref&#039;&#039;&#039; é axeitado para datos simples, mentres que &#039;&#039;&#039;reactive&#039;&#039;&#039; é máis axeitado para obxectos complexos, que podan ter outros obxectos como atributos que tamén queremos que sexan reactivos. Cando definimos un dato como reactivo mediante o método &#039;&#039;&#039;ref&#039;&#039;&#039; necesitaremos usar o atributo &#039;&#039;.value&#039;&#039; para acceder ao seu valor. Outra posibilidade é &#039;&#039;&#039;shallowRef&#039;&#039;&#039; (que simplemente comproba si cambia a referencia do obxecto, en lugar do obxecto en sí).&lt;br /&gt;
&lt;br /&gt;
Nos compoñentes con compositionAPI podemos definir as funcionalidades desexadas mediante métodos javascript. Estas funcionalidades simplemente variarán valores reactivos que provocan o repintado e polo tanto o &amp;quot;recálculo&amp;quot; da plantilla. Todo o código irá dentro do método setup(), ou si queremos unha sintaxe mais simple, dentro de &amp;lt;script setup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vexamos un exemplo de compoñente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
import { ref, onMounted } from &#039;vue&#039;&lt;br /&gt;
&lt;br /&gt;
// reactive state&lt;br /&gt;
const count = ref(0)&lt;br /&gt;
&lt;br /&gt;
// functions that mutate state and trigger updates&lt;br /&gt;
function increment() {&lt;br /&gt;
  count.value++&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// lifecycle hooks&lt;br /&gt;
onMounted(() =&amp;gt; {&lt;br /&gt;
  console.log(`The initial count is ${count.value}.`)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button @click=&amp;quot;increment&amp;quot;&amp;gt;Count is: {{ count }}&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style scoped&amp;gt;&lt;br /&gt;
button {&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os hook da composition API son maiores que en Options API:  setup(), onMounted(), onUpdated(), onUnmounted(), onBeforeMount(), onBeforeUpdate(), onBeforeUnmount, onErrorCaptured, onActivated, onDeactivated(),&lt;br /&gt;
&lt;br /&gt;
Ambos os estilos de API son plenamente capaces de cubrir casos de uso comúns. Son interfaces diferentes impulsadas polo mesmo sistema subxacente. De feito, a Options API está implementada sobre a Composition API. Os conceptos fundamentais e o coñecemento sobre Vue son compartidos entre os dous estilos.&lt;br /&gt;
&lt;br /&gt;
Se es novo en Vue, aquí está a nosa recomendación xeral:&lt;br /&gt;
&lt;br /&gt;
Para fins de aprendizaxe, escolla o estilo que lle pareza máis fácil de entender. De novo, a maioría dos conceptos básicos son compartidos entre os dous estilos. Sempre podes aprender o outro estilo máis adiante.&lt;br /&gt;
&lt;br /&gt;
Para uso en produción:&lt;br /&gt;
&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Options API&#039;&#039;&#039; se non está a usar ferramentas de construción, ou se planea usar Vue principalmente en escenarios de baixa complexidade, por exemplo, mellora progresiva.&lt;br /&gt;
*Escolla a &#039;&#039;&#039;Composition API&#039;&#039;&#039; + Compoñentes de Ficheiro Único se planea construir aplicacións completas con Vue.&lt;br /&gt;
&lt;br /&gt;
Neste documento utilizaremos principalmente Composition API.&lt;br /&gt;
&lt;br /&gt;
==Instalación==&lt;br /&gt;
Existen varios modos de instalación:&lt;br /&gt;
===Inclusión Direta con &amp;lt;script&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creación dunha aplicación Vue con Node ===&lt;br /&gt;
Vue proporciona un completo framework baseado en Node.js co que podemos desenvolver unha aplicación, &amp;quot;compilar&amp;quot; as plantillas e conseguir unha versión final de distribución. Para iso se empregan unha serie de utilidades (build tools) que nos axudarán nas distintas fases do proxecto. Unha desas ferramentas é &#039;&#039;&#039;Vite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Vite&#039;&#039; é unha ferramenta de desenvolvemento de front-end moderna que se utiliza para a creación de aplicacións web rápidas e eficientes. Foi creada por Evan You, o mesmo creador de &#039;&#039;Vue.js&#039;&#039;, aínda que &#039;&#039;Vite&#039;&#039; non está limitado só a &#039;&#039;Vue&#039;&#039;, xa que tamén soporta outros frameworks como &#039;&#039;React&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A función de &#039;&#039;Vite&#039;&#039; dentro do ecosistema Vue é a &amp;quot;compilación&amp;quot; das plantillas (ES Modules) durante o desenvolvemento e a optimización final para producción.&lt;br /&gt;
&lt;br /&gt;
En primeiro lugar, se debe crear a estrutura da aplicación mediante o uso de xestores de paquetes JavaScript como &#039;&#039;&#039;npm&#039;&#039; (Node Package Manager) ou &#039;&#039;&#039;yarn&#039;&#039; (Yet Another Resource Negotiator) entre outros:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
npm create vue@latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durante a configuración inicial da aplicación o sistema nos preguntará detalles como:&lt;br /&gt;
* &#039;&#039;&#039;o nome do proxecto&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;si imos usar TypeScript&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;si queremos JSX&#039;&#039;&#039; (unha extensión para escribir capas de presentacón dentro do JavaScript para crear interfaces demasiado complexas para as plantillas)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Vue-Router&#039;&#039;&#039; (que nos facilita a creación de SPA a través de rutas para a transición entre compoñentes para presentar o contido solicitado ao servidor)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Plinia&#039;&#039;&#039; (que nos permite compartir o estado --información-- entre distintos compoñentes da aplicación Vue)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Vitest&#039;&#039;&#039; (que é un framework para a realización de tests unitarios &#039;&#039;&#039;)&lt;br /&gt;
*&#039;&#039;&#039;si queremos engadir un sistema de Testing&#039;&#039;&#039; (nos ofrece Cypress, Nightwatch ou Playwrigth)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar ESLint&#039;&#039;&#039; (analiza problemas de estilo, erros de sintaxe, se xera a configuración para VSCode e podemos utilizalo dende a liña de comandos con &#039;&#039;&#039;npx eslint .&#039;&#039;&#039; ou &#039;&#039;&#039;npx eslint . --fix&#039;&#039;&#039;. Mediante npx podemos executar paquetes instalados con npm sen instalalos no sistema)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar Prettier&#039;&#039;&#039; (formatea o código revisando tabuladores, espazos.. de xeito que quede lexible)&lt;br /&gt;
*&#039;&#039;&#039;si queremos usar as extensións de depuración de Vue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unha vez iniciado o proxecto o sistema nos indicará:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Done. Now run:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;quot;&amp;lt;proxecto&amp;gt;&amp;quot;&lt;br /&gt;
  npm install&lt;br /&gt;
  npm run dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;npm install&#039;&#039;&#039; instalará todos os módulos JavaScript necesarios para Vue&lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; lanzará unha instancia do servidor web de Node para probar o noso proxecto. Inicialmente so aceptará conexións en localhost. Para cambiar a configuración deste servidor de desenvolvemento debemos modificar o arquivo &#039;&#039;&#039;vite.config.ts&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
import { fileURLToPath, URL } from &#039;node:url&#039;&lt;br /&gt;
&lt;br /&gt;
import { defineConfig } from &#039;vite&#039;&lt;br /&gt;
import vue from &#039;@vitejs/plugin-vue&#039;&lt;br /&gt;
&lt;br /&gt;
// https://vite.dev/config/&lt;br /&gt;
export default defineConfig({&lt;br /&gt;
  plugins: [&lt;br /&gt;
    vue(),&lt;br /&gt;
  ],&lt;br /&gt;
  resolve: {&lt;br /&gt;
    alias: {&lt;br /&gt;
      &#039;@&#039;: fileURLToPath(new URL(&#039;./src&#039;, import.meta.url))&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  server: {&lt;br /&gt;
        host: &#039;0.0.0.0&#039;, // Escoitar en todas as interfaces&lt;br /&gt;
        port: 8000, // O porto no que se esperan conexións&lt;br /&gt;
        strictPort: true, // Opcional: fallará si o porto xa está en uso&lt;br /&gt;
    },&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O esquema do proxecto será similar a este:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;proxecto&amp;gt;/&lt;br /&gt;
│&lt;br /&gt;
├── index.html            // Archivo HTML principal&lt;br /&gt;
├── src/                  // Carpeta de código fuente&lt;br /&gt;
│   ├── assets/           // Archivos estáticos (imágenes, etc.)&lt;br /&gt;
│   ├── components/       // Componentes de Vue&lt;br /&gt;
│   ├── views/            // Vistas de la aplicación&lt;br /&gt;
│   ├── App.vue           // Componente raíz&lt;br /&gt;
│   └── main.js           // Archivo de entrada de JavaScript&lt;br /&gt;
│&lt;br /&gt;
├── package.json&lt;br /&gt;
└── ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Co obxectivo de usar rutas correctas a os distintos recursos, se dispón nos compoñentes de Vue do caracter @ para indicar src como raíz. Cando se desenvolva para producción as url se axustarán do xeito necesario.&lt;br /&gt;
Para crear a aplicación que serviremos mediante un Apache, debemos construila con &#039;&#039;&#039;npm run build&#039;&#039;&#039; e instalar o contido da carpeta build no root do sitio web. Debemos habilitar o módulo &#039;&#039;rewrite&#039;&#039; para que funcionen as rutas de Vue.&lt;br /&gt;
&lt;br /&gt;
Unha aplicación básica tería o seguinte aspecto:&lt;br /&gt;
*&#039;&#039;&#039;index.htnl&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;es&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Hola Mundo con Vue 3&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt; &lt;br /&gt;
    &amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- Elemento donde se montará la aplicación --&amp;gt; &lt;br /&gt;
    &amp;lt;script type=&amp;quot;module&amp;quot; src=&amp;quot;/src/main.ts&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;
    &amp;lt;/script&amp;gt;   &lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/src/App.vue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script setup&amp;gt;&lt;br /&gt;
        import Module from &#039;@/components/Module/Module.vue&#039;&lt;br /&gt;
        const nombre=&amp;quot;Test para Iass Cloud&amp;quot;;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
        &amp;lt;Module msg=&amp;quot;You did it!&amp;quot; /&amp;gt;&lt;br /&gt;
        {{ nombre }}    Hola Mundo!&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/src/compoents/Module/Module.vue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style src=&amp;quot;@/components/Module/module.css&amp;quot; scoped&amp;gt;&amp;lt;/style&amp;gt; &amp;lt;!-- Importar CSS específico del componente --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script setup lang=&amp;quot;ts&amp;quot;&amp;gt;&lt;br /&gt;
        defineProps&amp;lt;{msg: string}&amp;gt;()&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt; {{msg}} It&#039;s Work - Has a background icon ?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este contexto, o marcador @ indica nas URL a carpeta /src do proxecto, e se pode usar como inicio de acceso aos recursos dentro de /src&lt;br /&gt;
&lt;br /&gt;
== As plantillas en Vue ==&lt;br /&gt;
Vue utiliza unha sintaxe de templates baseada en HTML que che permite ligar de forma declarativa o DOM renderizado cos datos subxacentes da instancia do compoñente. Todos os templates de Vue son sintacticamente HTML válido, que pode ser analizado por navegadores compatibles co estándar e parsers de HTML.&lt;br /&gt;
&lt;br /&gt;
Por debaixo, Vue compila os templates en código JavaScript altamente optimizado. Combinado co sistema de reactividade, Vue pode determinar de maneira intelixente o número mínimo de compoñentes que precisa volver renderizar e aplicar a mínima cantidade de manipulacións no DOM cando cambia o estado da aplicación.&lt;br /&gt;
&lt;br /&gt;
As plantillas Vue se definen nos compoñentes dentro das etiquetas &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt; e dispoñen dunha linguaxe de procesado de plantillas bastante simple e potente que procesará a información procesada na sección &amp;lt;script&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
====Interpolación de Texto====  &lt;br /&gt;
A forma máis básica de vinculación de datos é a interpolación de texto utilizando a sintaxe de &amp;quot;mostacho&amp;quot; (dobres chaves):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt;Message: {{ msg }}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A etiqueta de mostacho será substituída polo valor da propiedade `msg` da instancia do componente correspondente. Ademais, actualizarase cada vez que a propiedade `msg` cambie.&lt;br /&gt;
&lt;br /&gt;
====Vinculación de Atributos====&lt;br /&gt;
As chaves non se poden usar dentro dos atributos HTML. En vez diso, usa a directiva `v-bind`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div v-bind:id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A directiva `v-bind` indica a Vue que mantén o atributo id do elemento sincronizado coa propiedade `dynamicId` do compoñente. Se o valor vinculado é `null` ou `undefined`, o atributo será eliminado do elemento renderizado.&lt;br /&gt;
&lt;br /&gt;
Sintaxe Abreviada  &lt;br /&gt;
Como `v-bind` se usa con moita frecuencia, ten unha sintaxe abreviada dedicada:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;div :id=&amp;quot;dynamicId&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTML Crudo====&lt;br /&gt;
As dobres chaves interpretan os datos como texto sin formato, non como HTML. Para saír HTML real, necesitas usar a directiva `v-html`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando interpolación de texto: {{ rawHtml }}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Usando a directiva v-html: &amp;lt;span v-html=&amp;quot;rawHtml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Atributos Booleanos====&lt;br /&gt;
Os atributos booleanos son atributos que poden indicar valores verdadeiros/falsos pola súa presenza nun elemento. Por exemplo, `disabled` é un dos atributos booleanos máis comúns.&lt;br /&gt;
&lt;br /&gt;
`v-bind` funciona dun xeito algo diferente neste caso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;template&amp;gt;&lt;br /&gt;
  &amp;lt;button :disabled=&amp;quot;isButtonDisabled&amp;quot;&amp;gt;Button&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/template&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O atributo `disabled` incluirase se `isButtonDisabled` ten un valor verdadeiro. Tamén se incluirá se o valor é unha cadea de texto vacía, mantendo a coherencia con `&amp;lt;button disabled=&amp;quot;&amp;quot;&amp;gt;`. Para outros valores falsos, o atributo será omxido.&lt;br /&gt;
&lt;br /&gt;
====Vinculación dinámica de múltiples atributos====&lt;br /&gt;
&lt;br /&gt;
Se tes un obxecto de JavaScript que representa múltiples atributos e que ten a seguinte estrutura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const objectOfAttrs = {&lt;br /&gt;
  id: &#039;container&#039;,&lt;br /&gt;
  class: &#039;wrapper&#039;,&lt;br /&gt;
  style: &#039;background-color:green&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podes vinculalos a un único elemento utilizando `v-bind` sen un argumento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div v-bind=&amp;quot;objectOfAttrs&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Usando expresións de JavaScript====&lt;br /&gt;
&lt;br /&gt;
Até agora, só vinculamos claves de propiedades sinxelas nas nosas plantillas. Pero Vue realmente admite toda a potencia das expresións de JavaScript dentro de todas as vinculaciones de datos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{ number + 1 }}&lt;br /&gt;
&lt;br /&gt;
{{ ok ? &#039;SÍ&#039; : &#039;NON&#039; }}&lt;br /&gt;
&lt;br /&gt;
{{ message.split(&#039;&#039;).reverse().join(&#039;&#039;) }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div :id=&amp;quot;`list-${id}`&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas expresións serán avaliadas como JavaScript no ámbito de datos da actual instancia do componente.&lt;br /&gt;
&lt;br /&gt;
Nas plantillas de Vue, as expresións de JavaScript pódense usar nas seguintes posicións:&lt;br /&gt;
&lt;br /&gt;
- Dentro das interpolacións de texto (mustaches)&amp;lt;br/&amp;gt;&lt;br /&gt;
- No valor dos atributos de calquera directiva de Vue (atributos especiais que comezan con `v-`)&lt;br /&gt;
&lt;br /&gt;
====Chamando funcións====&lt;br /&gt;
&lt;br /&gt;
É posible chamar a un método exposto por un componente dentro dunha expresión de vinculación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;time :title=&amp;quot;toTitleDate(date)&amp;quot; :datetime=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
  {{ formatDate(date) }}&lt;br /&gt;
&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As funcións chamadas dentro das expresións de vinculación serán executadas cada vez que o componente se actualice, polo que non deben ter efectos secundarios, como cambiar datos ou acender operacións asincrónicas.&lt;br /&gt;
As expresións de plantilla están illadas e só teñen acceso a unha lista restrinxida de globais. A lista expón globais incorporados de uso común como Math e Date.&lt;br /&gt;
&lt;br /&gt;
Os globais&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 que non están incluídos na lista de forma explícita, como as propiedades engadidas polo usuario a window, non serán accesibles nas expresións de plantilla. Con todo, pódese definir explícitamente globais adicionais para todas as expresións de Vue engadíndoas a app.config.globalProperties.&lt;br /&gt;
&lt;br /&gt;
====Directivas====&lt;br /&gt;
&lt;br /&gt;
As directivas son atributos especiais co prefijo `v-`. Vue proporciona unha serie de directivas incorporadas, incluíndo `v-html` e `v-bind.&lt;br /&gt;
&lt;br /&gt;
Os valores dos atributos das directivas esperan ser expresións de JavaScript únicas (con excepción de `v-for`, `v-on` e `v-slot`). O traballo dunha directiva é aplicar actualizacións de forma reactiva no DOM cando o valor da súa expresión cambia. Tomemos como exemplo `v-if`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p v-if=&amp;quot;seen&amp;quot;&amp;gt;Agora me ves&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso, a directiva `v-if` eliminaría ou inseriría o elemento `&amp;lt;p&amp;gt;` en función da veracidade do valor da expresión `seen`. Outras directivas son:&lt;br /&gt;
*v-on&lt;br /&gt;
*v-for&lt;br /&gt;
*v-slot&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
</feed>