Skip to content

3. progetto [vuejs-01]: le basi

Per spiegare il codice eseguito in [vuejs-00], lo semplificheremo in [vuejs-01]. Duplichiamo la cartella [vuejs-00] in [vuejs-01]:

Image

Il progetto [vuejs-01] comprende essenzialmente quattro file:

  • [main.js] e [2], che costituisce il punto di ingresso del progetto;
  • [App.vue, HelloWorld.vue] e [3-4] sono componenti di [Vue.js], che possono includere facoltativamente i seguenti elementi:
    • [<template>...</template>]: il codice HTML;
    • [<script>...</script>]: il codice JavaScript associato al codice HTML;
    • [<style>...</style>]: lo stile CSS associato al codice HTML;
  • [public/index.html] [5]: il documento HTML visualizzato dal comando [npm run serve];

Il file [public/index.html] visualizzato all’esecuzione del progetto è il seguente:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>vuejs</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- i file generati verranno inseriti automaticamente -->
  </body>
</html>

Questo file HTML non visualizza quindi nulla in modo statico. Qui non è presente alcun codice HTML. La visualizzazione è dinamica: il codice jS del progetto genererà il codice HTML, che sostituirà interamente il tag [<div id=’app’>] della riga 14. Il codice HTML, generato dal codice jS del progetto e inserito al posto del tag [<div>] della riga 14, proviene dai tag [template] dei componenti [vue.js], i cui file hanno il suffisso [.vue].

Il codice HTML viene inserito dinamicamente alla riga 14 dallo script [vuejs-01/main.js] seguente:


// importazioni
import Vue from 'vue'
import App from './App.vue'

// configurazione
Vue.config.productionTip = false

// istanza del progetto [App]
new Vue({
  render: h => h(App),
}).$mount('#app')

Commenti

  • riga 2: l’oggetto [Vue] è fornito dal framework [vue.js];
  • riga 3: l'oggetto [App] è fornito dal file [vuejs-01/App.vue];
  • riga 6: configurazione dell’oggetto [Vue];
  • righe 9-11: sono le righe che:
    • generano il codice HTML dell’applicazione. Alla riga 10, è il file [App.vue] a generarlo;
    • caricano il codice HTML generato alla riga 10 nella sezione [<div id=’app’></div>] del file [public/index.html];

Qualsiasi progetto [Vue.js] può mantenere il file [index.html] così com’è.

Il file [App.vue] del progetto iniziale [vuejs-00] viene semplificato come segue nel progetto [vuejs-01]:


<template>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <HelloWorld msg="Notre première application Vue.js" />
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

export default {
  name: "app",
  components: {
    HelloWorld
  }
};
</script>

Commenti

  • un frammento [.vue] comprende al massimo tre sezioni:
    • [<template>...</template>]: codice HTML;
    • [<script>...</script>]: il codice JavaScript associato al codice HTML;
    • [<style>...</style>]: lo stile CSS associato al codice HTML;

Qui non è presente la sezione [style].

  • righe 1-6: il codice HTML del frammento (pagina, componente, vista, ...);
  • righe 2-5: la sezione [template] può contenere un solo elemento. In genere si inserisce una sezione [div] che racchiude l'intero HTML del frammento. È possibile inserire anche un tag <template>;
  • riga 3: un'immagine;

Image

  • riga 4: un componente denominato [HelloWorld]. Il principio di [Vue.js] consiste nel costruire pagine web utilizzando frammenti definiti in file [.vue], come in questo caso [App.vue]. Questo componente è definito dal file [HelloWorld.vue], definito alla riga 9 dello script associato jS;
  • riga 4: un componente può accettare parametri. Il parametro in questo caso è l’attributo [msg];
  • righe 8-17: lo script jS del frammento (o componente);
  • riga 9: per poter utilizzare il componente [HelloWorld] nel componente [App], è necessario importarne la definizione nella parte [script];
  • righe 11-16: lo script definisce un oggetto e lo esporta per renderlo disponibile all’esterno;
  • riga 12: l’attributo [name] definisce il nome del componente esportato;
  • righe 13-15: l’attributo [components] elenca i componenti utilizzati dal componente [App]. Essi vengono esportati insieme ad esso;

Riga 9: non è obbligatorio che il componente [HelloWorld] abbia lo stesso nome del file che lo definisce. Si potrebbe importarlo come [X] ed esportarlo come componente [Bonjour]:

Image

  • riga 14: il componente [X] viene esportato con il nome [Bonjour]. Viene quindi utilizzato con questo nome, riga 4;

La prima versione è quella più comune, pertanto definiremo i nostri componenti in questo modo;


<template>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <HelloWorld msg="Notre première application Vue.js" />
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

export default {
  name: "app",
  components: {
    HelloWorld
  }
};
</script>

La riga 14 è una scorciatoia per il codice [HelloWorld : HelloWorld]: il componente [HelloWorld] (a destra, importato alla riga 9) viene esportato con il nome [HelloWorld] (a sinistra).

Image

Semplifichiamo il componente [HelloWorld.vue] nel modo seguente:


<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String
  }
};
</script>

Commenti

  • il componente [HelloWorld] ha la stessa struttura di file del componente principale [App];
  • riga 3: qui si ha una valutazione di un'espressione JavaScript, in questo caso l'espressione [msg];
  • righe 10-12: definiscono le proprietà del componente, più precisamente i suoi parametri. Quando il componente [App] ha istanziato un componente [HelloWorld], lo ha fatto con la seguente sintassi:

<HelloWorld msg="Notre première application Vue.js" />

Il componente [HelloWorld] viene istanziato assegnando un valore al parametro (attributo) [msg]. Se si segue il [template] del componente [HelloWorld], quest’ultimo diventa:


<div>
    <h1>Notre première application Vue.js</h1>
</div>
  • righe 7-14: le proprietà del componente definite sotto forma di oggetto che viene esportato;
    • riga 9: il componente viene esportato con il nome [HelloWorld];
    • righe 10-12: i suoi parametri sono definiti dalla proprietà [props];

Infine, se si uniscono i modelli dei due componenti [App, HelloWorld] utilizzati, il file [index.html] visualizzato sarà il seguente:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <title>vuejs</title>
</head>
<body>
  <noscript>
    <strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="myApp">
    <img alt="Vue logo" src="./assets/logo.png" />
    <div>
      <h1>Notre première application Vue.js</h1>
    </div>
  </div></body>
</html>

Avviamo l’applicazione modificando il comando [serve] [1] nel file [package.json]:

Image

La pagina visualizzata è quindi [2].

Ora esaminiamo il codice di questa pagina:

Image

  • in [1], diventare [clic droit];
  • in [2], il codice sorgente della pagina. Si nota che si tratta del codice del file iniziale [index.html] e non è questo che è stato visualizzato. È proprio la pagina [index.html] che è stata caricata inizialmente. Successivamente, in modo dinamico, del codice JavaScript ha modificato questa pagina, ma ciò non ci viene mostrato;

Quando le pagine vengono generate dinamicamente da JavaScript, l’opzione [2] non serve a nulla. È necessario accedere agli strumenti del browser (F12 su Firefox) per visualizzare il codice della pagina attualmente visualizzata:

Image

  • in [1], l’ispettore del DOM (Document Object Model) del documento visualizzato;
  • in [2], ciò che contiene effettivamente questo DOM;
  • [3-4], gli strumenti che useremo per visualizzare gli oggetti JavaScript utilizzati dal framework [Vue.js];
  • [4] è un'estensione (in questo caso per Firefox) per il debug delle applicazioni [Vue.js]:
    • per Firefox: [https://addons.mozilla.org/fr/firefox/addon/vue-js-devtools/];
    • per Chrome: [https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd];

Esaminiamo la scheda [Vue] [4]:

Image

La vista [1-4] ci mostra la struttura [Vue.js] del documento: la radice del documento [2] (index.html) comprende il componente [App] (3), che a sua volta comprende il componente [HelloWorld] (4). Cliccando su [4] vengono visualizzate le proprietà del componente [HelloWorld] [5].

In [4] (a destra) è visibile l’indicatore [$vm0]. Questo è il nome della variabile che è possibile utilizzare nella console JavaScript [6] per indicare l’oggetto [HelloWorld]. Proviamo:

Image

  • in [2], si fa valutare l’espressione [$vm0], il che ha l’effetto di visualizzarne la struttura. Normalmente non dovremo utilizzare direttamente questa struttura;

Concludiamo mostrando la capacità di [hot reload] del comando [serve] utilizzato per eseguire il progetto:

  • in [App.vue], modificate il messaggio visualizzato da [HelloWorld]:

Image

  • in [1], si modifica il messaggio visualizzato;
  • in [2-3], la pagina viene aggiornata automaticamente senza alcun intervento da parte nostra;

Ora creeremo diversi progetti [vuejs-xx] per illustrare i punti importanti di [Vue.js]. Per «importanti» si intende «quelli che utilizzeremo nel client [vue.js] del server di calcolo delle imposte». Altri punti “importanti” verranno tralasciati se non vengono utilizzati nel client. Non si tratterà quindi di una presentazione esaustiva di [vue.js].