Skip to content

5. Progetto [vuejs-03]: Gestione degli eventi

Il progetto [vuejs-03] introduce due concetti:

  • gestione di un evento [click] su un pulsante;
  • la direttiva [v-if], che consente di visualizzare un blocco HTML in modo condizionale;

La struttura delle directory del progetto è la seguente:

Image

5.1. Lo script principale [main.js]

Lo script [main.js] rimane invariato:


// imports
import Vue from 'vue'
import App from './App.vue'
 
// plugins
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);
 
// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
 
// configuration
Vue.config.productionTip = false
 
// instanciation projet [App]
new Vue({
  render: h => h(App),
}).$mount('#app')

5.2. Il componente principale [App.vue]

Il componente principale [App.vue] utilizza il componente [ClickOnMe] al posto del componente [HelloBootstrap]:


<template>
  <b-container>
    <b-card>
    <!-- Bootstrap Jumbotron -->
    <b-jumbotron>
      <!-- ligne -->
      <b-row>
        <!-- colonne de largeur 4 -->
        <b-col cols="4">
          <img src="./assets/logo.jpg" alt="Cerisier en fleurs" />
        </b-col>
        <!-- colonne de largeur 8 -->
        <b-col cols="8">
          <h1>Calculez votre impôt</h1>
        </b-col>
      </b-row>
    </b-jumbotron>
    <!-- composant -->
    <ClickOnMe msg="Information..." />
    </b-card>
  </b-container>
</template>
 
 
<script>
import ClickOnMe from "./components/ClickOnMe.vue";
 
export default {
  name: "app",
  components: {
    ClickOnMe
  }
};
</script>

5.3. Il componente [ClickOnMe]

Il componente [ClickOnMe] introduce i seguenti nuovi concetti:


<template>
  <div>
    <!-- message on green background -->
    <b-alert show variant="success" align="center">
      <h4>[vuejs-03] : événement @click, directive v-if, méthodes</h4>
    </b-alert>
    <!-- message on yellow background -->
    <b-alert show variant="warning" align="center" v-if="show">
      <h4>{{msg}}</h4>
    </b-alert>
    <!-- blue button -->
    <b-button variant="primary" @click="changer">{{buttonTitle}}</b-button>
  </div>
</template>
 
<script>
  export default {
    name: "ClickOnMe",
    // paramètres du composant
    props: {
      msg: String
    },
    // attributs du composant
    data() {
      return {
        // titre du bouton
        buttonTitle: "Cacher",
        // contrôle l'affichage du message
        show: true
      };
    },
    // méthodes
    methods: {
      // montre / cache le message
      changer() {
        if (this.show) {
          // on cache le message
          this.show = false;
          this.buttonTitle = "Montrer";
        } else {
          // on montre le message
          this.show = true;
          this.buttonTitle = "Cacher";
        }
      }
    }
  };
</script>

Commenti

  • righe 4–6: un avviso verde di Bootstrap. Il numero di colonne utilizzate non è specificato. Pertanto, vengono utilizzate le 12 colonne di Bootstrap;
  • righe 8–10: un avviso giallo di Bootstrap:
    • riga 8: la direttiva [v-if] di [Vue.js] controlla la visibilità di un blocco HTML. L'avviso è controllato qui da un valore booleano [show] (riga 29). Se [show==true], l'avviso sarà visibile; altrimenti, non lo sarà;
    • riga 9: l'avviso visualizza un messaggio [msg], che è una proprietà (righe 20–22) del componente;
  • riga 12: un pulsante blu su cui cliccare per nascondere/mostrare l'avviso [warning];
  • righe 16–48: il codice JavaScript del componente. Questo codice controlla il comportamento dinamico del componente:
  • righe 20–22: le proprietà del componente;
  • righe 24–31: gli attributi del componente;

Qual è la differenza tra le [proprietà] e gli [attributi] di un componente, e tra i campi [props] e [data] dell'oggetto esportato dal componente nelle righe 17–47?

  • Come abbiamo già visto, i [props] di un componente sono i suoi parametri. I loro valori vengono impostati dall'esterno del componente. Un componente A che utilizza un componente B con proprietà [prop1, prop2, ..., propn] lo utilizzerà come segue: <B :prop1='val1' :prop2='val2' ...>;
  • L'oggetto restituito dalla funzione [data] nelle righe 24–31 rappresenta lo stato o gli attributi del componente. Questo stato viene manipolato dai metodi del componente (righe 33–46). Il <template> nelle righe 1–14 utilizza sia [properties] che [attributes]:
    • i valori delle proprietà sono impostati da un componente padre;
    • i valori degli attributi sono inizialmente impostati dalla funzione [data] e possono poi essere modificati dai metodi;
    • In entrambi i casi, la resa visiva reagisce immediatamente alle modifiche di una proprietà (componente padre) o di un attributo (metodo del componente). Questo viene definito interfaccia reattiva;

Nel [template] di un componente, non c'è differenza tra un attributo [prop] e un attributo [data]. Per determinare se i dati dinamici nel [template] debbano essere inseriti nell'attributo [props] o nell'oggetto restituito dalla funzione [data], basta chiedersi chi imposta il valore di quei dati:

  • se la risposta è il componente padre, allora i dati vanno nell'attributo [props];
  • se la risposta è il metodo del componente che gestisce quell'evento, allora i dati vanno nell'oggetto restituito dalla funzione [data];

Il [modello] utilizza qui i seguenti dati dinamici:

  • [show], riga 8. Questo dato viene gestito internamente dal metodo [changer], che gestisce l'evento [click] sul pulsante alla riga 12. Si tratta quindi di un attributo costruito dalla funzione [data] (riga 29);
  • [msg], riga 9. Si tratta di un messaggio impostato dal componente padre. Lo inseriamo quindi nell'attributo [props] (riga 21);
  • [buttonTitle], riga 12. Questo dato viene gestito internamente dal metodo [changer], che gestisce l'evento [click] sul pulsante alla riga 12. Si tratta quindi di un attributo creato dalla funzione [data] (riga 27);
  • I nomi degli attributi [name, props, data, methods] dell'oggetto esportato dal componente sono predefiniti. Non è possibile utilizzare altri nomi;
  • riga 12: l'attributo [@click] del pulsante viene utilizzato per specificare il metodo che deve rispondere a un clic sul pulsante. Questo metodo deve trovarsi nella proprietà [methods] del componente;
  • riga 33: l'attributo [methods] del componente contiene tutti i suoi metodi. Il più delle volte si tratta di funzioni che rispondono a un evento del componente;
  • righe 35–46: il metodo [changer] viene chiamato quando l'utente clicca sul pulsante:
    • se l'avviso [warning] è visualizzato, viene nascosto e il testo del pulsante cambia in [Show] (riga 39);
    • se l'avviso [warning] è nascosto, viene visualizzato e il testo del pulsante cambia in [Hide] (riga 43);
    • per mostrare/nascondere l'avviso [warning], modifichiamo il valore del booleano [show] (righe 38 e 42);
    • quando un metodo deve fare riferimento all'attributo [attr] restituito dalla funzione [data], scriviamo [this.attr] (righe 38 e 42). Ciò significa che gli attributi dell'oggetto restituito dalla funzione [data] sono attributi diretti del componente [this];

5.4. Esecuzione del progetto

Image

Il risultato è il seguente:

Image

Image