Framework: Vue.js

Keywords: Vue, componenti, servizi, routing, moduli, template, compiler...

Esercizio precedente Esercizio successivo

Vue.js

Vue.js è un framework JavaScript per la creazione di interfacce utente frontend. Con Vue.js è possibile iniziare in modo semplice e aggiungere progressivamente gli strumenti e le funzionalità necessarie per sviluppare un'applicazione web complessa. Al centro del framework, Vue.js fornisce un modo per creare componenti che incapsulano dati o stati nel tuo JavaScript e collegare reattivamente tali stati ad un template HTML. Questi componenti vengono chiamati declarative views, poiché gli stessi input di dati produrranno sempre la stessa uscita nell'interfaccia utente visuale.

Come usare Vue.js

Per utilizzare Vue.js, è necessario includere il framework nel proprio progetto. Ci sono diversi modi per farlo, ma il modo più semplice è includere Vue.js come script JavaScript in una pagina HTML. Per fare ciò, è possibile utilizzare un CDN (Content Delivery Network). Un po' come quando ci serve chiamare gli script JS per Bootstrap. Per includere Vue.js, è necessario aggiungere il seguente tag <script> alla pagina HTML:

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

Oppure possiamo installare Vue.js come libreria e poi richiederlo nel nostro codice. Per fare ciò useremo Vite seguendo la documentazione di Vue.js

Creiamo una nuova cartella e vediamo insieme l'ambiente. I comandi necessari sono:

npm init vite@latest
cd vite-app //spostiamoci nella cartella
npm install //installiamo le librerie
npm run dev //apriamo il cli
//si aprirà una porta (probabilmente la 5173)

Vite ci da accesso ad un server di sviluppo molto semplice da gestire nonché un template di partenza per i nostri progetti

Angular, Vue o React?

Qualunque domanda o questione su quale framework sia meglio è completamente inutile. Spesso chi sviluppa un framework fa parte anche del team di sviluppo di un altro: la vera differenza è il contesto di utilizzo. Un framework privilegia un certo aspetto rispetto ad un altro, e di conseguenza ogni framework è più adatto ad un certo tipo di applicazione.

Angular diversamente da Vue.js richiede una struttura molto più complessa, ma è ottimo per progetti molto grandi che necessitano un certo rigore. Vue.js è molto leggero e progressivo, ovvero possiamo aggiungere funzioni mano mano che ci servono senza utilizzare tutto il framework insieme.

Architettura


\vue-project
├── .vscode/
├── node_modules/
├── public/
├── src/
├── .gitignore
├── index.html
├── package-lock.json
├── package.json
├── README.md
└── vite.config.js

Dentro src troviamo la nostra App che monta tutti i componenti. Andiamo a guardare ./src/components

Proviamo ad osservare insieme un semplice calcolatore come abbiamo visto per gli altri componenti

<template>
    <section>
        <p v-if="likes > 0">
            This page has {{likes}} likes
        </p>
        <p v-else>
            This page has no likes :(
        </p>
        <button v-on:click="like()">
            Like this page!
        </button>
    </section>
  </template>

  <script>    
  export default {
    data() {
        return {
            likes: 0,
        }
    },

    methods: {
        like() {
            this.likes++
            alert("You liked this page!")
        }
    }
  }
  </script>

Creando un nuovo componente chiamato "Likes.vue", importiamolo nell'App e proviamo ad utilizzarlo

Dobbiamo importare questo componente nell'App, quindi andiamo su App.vue e aggiungiamo il seguente codice:

  <template>
  <div>
    <Likes />
  </div>
</template>

<script>
import Likes from "@/components/Likes.vue";

export default {
  components: {
    Likes,
  },
};
</script>

Vite ricaricherà il server in automatico una volta salvato il tutto.

Architettura di un componente

Un componente Vue si divide in tre parti principali:

  • Template
  • Script
  • Style

Il template è la parte HTML del componente, il codice che vediamo nel browser. Il template può essere scritto in HTML o in Pug, un linguaggio di template che permette di scrivere codice HTML in modo più semplice e veloce.

Lo script è la parte JavaScript del componente, dove vengono definite le funzioni e le variabili che il componente utilizza. Lo script può essere scritto in JavaScript o in TypeScript, un linguaggio di programmazione che aggiunge tipi statici a JavaScript.

Lo style è la parte CSS del componente, dove vengono definite le regole di stile che il componente utilizza. Lo style può essere scritto in CSS o in SCSS, un preprocessore CSS che aggiunge funzionalità avanzate a CSS.

 <template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: 'Hello World',
      message: 'This is a simple Vue component'
    }
  }
}
</script>

<style>
h1 {
  font-size: 2rem;
  font-weight: bold;
}

p {
  font-size: 1rem;
  color: gray;
}
</style>

export default è una funzionalità del sistema dei moduli ES6 usato in JavaScript che consente di esportare un singolo valore da un modulo. L'istruzione export default viene utilizzata per specificare l'esportazione predefinita di un modulo, che può quindi essere importato da altri moduli tramite l'istruzione import.

In Vue.js, il metodo data() è un'opzione del componente utilizzata per definire i dati iniziali di un componente. Il metodo data() dovrebbe restituire un oggetto con proprietà che rappresentano lo stato del componente. Quando il componente viene creato, Vue.js unisce le proprietà dell'oggetto data() all'istanza del componente, rendendole reattive. Ciò significa che se una delle proprietà dell'oggetto data() cambia, il componente verrà automaticamente ri-renderizzato per riflettere lo stato aggiornato.

  <template>
      <div>
        <p>{{ message }}</p>
        <button v-on:click="changeMessage">Cambia Messaggio</button>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          message: 'Ciao Mondo!'
        }
      },
      methods: {
        changeMessage() {
          this.message = 'Nuovo Messaggio!'
        }
      }
    }
    </script>

Altri esempi


  //HelloWorld.vue
  <script>
  export default {
    data() {
      return {
        message: 'Ciao Mondo!'
      }
    },
    computed: {
      reversedMessage() {
        return this.message.split('').reverse().join('')
      }
    },
    methods: {
      greet() {
        alert(this.message)
      }
    }
  }
  </script>

  <template>
    <div>
      <h1>{{ reversedMessage }}</h1>
      <button v-on:click="greet">Saluta</button>
    </div>
  </template>

In questo esempio, abbiamo definito un componente semplice con un'opzione data che contiene una stringa di messaggio, una proprietà computed che restituisce il messaggio invertito e un metodo che mostra un messaggio in una finestra di dialogo di avviso.

Aggiorniamo anche App.vue

  <template>
  <div>
    <Likes />
    <HelloWorld />
  </div>
</template>

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

export default {
  components: {
    Likes,
    HelloWorld,
  },
};
</script>

L'elemento script dentro HelloWorld.vue definisce l'oggetto da esportare tramite la funzione data(). Ritorna un elemento message con dentro una stringa; computed poi esporta un messaggio che modifica tramite this.message il testo originario, e l'oggetto methods esporta la funzione che andrà eseguita dentro il template

Esercizi con Vue.js

Mettiamo mano passo passo a Vue. Questi non sono esercizi attivi quanto più un modo per inserirsi dentro la logica di Vue.js e fare un po' di pratica.

  1. Modificare il titolo della pagina:

    • Aprire il file index.html nella cartella public.
    • Modificare il contenuto della tag con un titolo personalizzato.
    • Salvare il file e visualizzare la pagina nel browser per vedere il nuovo titolo.
  2. Creare un nuovo file Hello.vue all'interno della cartella components.

    • Inserire il seguente codice nel file Hello.vue:
    •   <template>
                      <div>
                        <h2>{{ message }}</h2>
                      </div>
                    </template>
                  
                    <script>
                    export default {
                      data() {
                        return {
                          message: 'Benvenuti in Vue!'
                        }
                      }
                    }
                    </script>
    • Importare il componente Hello all'interno del file App.vue aggiungendo import Hello from '@/components/Hello.vue'; all'inizio del file.
    • Registrare il componente Hello all'interno del file App.vue aggiungendo components: { Hello }, all'interno dell'oggetto export default.
    • Utilizzare il componente Hello all'interno del file App.vue aggiungendo l'elemento "Hello" al template principale.
    • Salvare il file e visualizzare la pagina nel browser per vedere il nuovo componente Hello visualizzato.
  3. Aggiungere un input per modificare il messaggio di benvenuto:

    1. Aggiungere un nuovo input all'interno del template Hello.vue utilizzando la seguente sintassi:
      <input v-model="message" />
    2. Salvare il file e visualizzare la pagina nel browser per vedere il nuovo input.
    3. Aggiungere il seguente stile all'interno del tag <style> di Hello.vue per modificare l'aspetto dell'input
      input {
                    padding: 10px;
                    font-size: 1.2rem;
                    margin-bottom: 20px;
                  }
  4. Aggiungere un bottone per ripristinare il messaggio di benvenuto predefinito:

    1. Aprire il file Hello.vue nella cartella components.
    2. Aggiungere un nuovo bottone all'interno del template Hello.vue utilizzando la seguente sintassi:
        <button v-on:click="resetMessage">Reset</button>
                    
    3. Aggiungere il seguente metodo all'interno dell'oggetto export default di Hello.vue per ripristinare il messaggio di benvenuto predefinito:
      methods: {
                      resetMessage() {
                        this.message = 'Benvenuti in Vue!';
                      }
                    }
    4. Salvare il file e visualizzare la pagina nel browser per vedere il nuovo bottone e il suo funzionamento.
  5. Esercizio per casa:

    Crea un componente Vue. E' composto da un contatore che, ogni volta che viene cliccato, aggiunge un pallino dentro un div. Ogni volta che un pallino viene aggiunto, essi cambiano colore. Trova su internet una svg o un'icona che può essere modificata tramite css per farlo. Fai riferimento alla documentazione ufficiale per trovare i metodi e le funzioni necessarie.


© Andrea Schimmenti & Fabio Vitali. TW 2022-2023.