Skip to content

13. Progetto [vuejs-11]: routing e navigazione

Il routing è ciò che permette agli utenti di navigare tra le diverse pagine dell'applicazione.

La struttura delle directory del progetto è la seguente:

Image

13.1. Installazione delle dipendenze

Il routing in [Vue.js] richiede la dipendenza [vue-router]:

Image

  • Nei passaggi [1-3], installiamo la dipendenza [vue-router];
  • Nei passaggi [4-6], dopo aver installato la dipendenza, il file [package.json] è stato modificato;

13.2. Lo script di routing [router.js]

Le regole di navigazione dell'applicazione sono definite nel file [router.js] (il nome dello script può essere qualsiasi cosa):


// imports nécessaires au routage
import Vue from 'vue'
import VueRouter from 'vue-router'
 
// plugin de routage
Vue.use(VueRouter)
 
// les composants cibles du routage
import Component1 from './components/Component1.vue'
import Component2 from './components/Component2.vue'
import Component3 from './components/Component3.vue'
 
 
// les routes de l'application
const routes = [
  // home
  { path: '/', name: 'home', component: Component1 },
  // Component1
  {
    path: '/vue1', name: 'vue1', component: Component1
  },
  {
    // Component2
    path: '/vue2', name: 'vue2', component: Component2
  },
  // Component3
  {
    path: '/vue3', name: 'vue3', component: Component3
  },
]
 
// le routeur
const router = new VueRouter({
  routes,
  mode: 'history',
})
 
// export du routeur
export default router

Commenti

  • Lo script [router.js] definirà le regole di routing per la nostra applicazione;
  • righe 1–6: Abilitazione del plugin [vue-router] necessario per il routing. Ciò richiede l'importazione della classe/funzione [Vue] (riga 2) e del plugin di routing (riga 3). Questo plugin è stato installato con la dipendenza [router] che abbiamo appena installato;
  • righe 8–11: importazione delle viste di destinazione per il routing;
  • righe 15–21: definizione dell'array delle rotte. Ogni elemento di questo array è un oggetto con le seguenti proprietà:
    • [path]: l'URL della vista, quello che vogliamo vedere visualizzato nel campo [URL] del browser. Sei libero di inserire quello che vuoi;
    • [name]: il nome del percorso. Anche qui puoi inserire quello che vuoi;
    • [component]: il componente che visualizza la vista. Deve trattarsi di un componente esistente;

Quindi qui abbiamo quattro route: [/], /view1, /view2, /view3.

  • Righe 33–36: Il router è un'istanza della classe [VueRouter] importata alla riga 3. Il costruttore [VueRouter] viene utilizzato qui con due parametri:
    • i percorsi dell'applicazione;
    • una modalità per la scrittura degli URL nel browser: la modalità predefinita [hash] scrive gli URL nella forma [localhost:8080/#/view1] (# è l'hash). La modalità [history] rimuove il # [localhost:8080/view1];
  • Riga 39: Esporta il router;

13.3. Lo script principale [main.js]

Lo script principale [main.js] è il seguente:


// 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'
 
// routeur
import monRouteur from './router'
 
// configuration
Vue.config.productionTip = false
 
// instanciation projet [App]
new Vue({
  name: "app",
  // vue principale
  render: h => h(App),
  // routeur
  router: monRouteur,
}).$mount('#app')

Commenti

  • riga 14: importiamo il router esportato dallo script [router.js];
  • riga 25: questo router viene passato come parametro al costruttore della classe [View], che visualizzerà la vista principale [App], associata alla proprietà [router] della vista;

13.4. La vista principale [App]

Il codice della vista principale è il seguente:


<template>
  <div class="container">
    <b-card>
      <!-- a message -->
      <b-alert show variant="success" align="center">
        <h4>[vuejs-11] : routage et navigation</h4>
      </b-alert>
      <!-- the current routing view -->
      <router-view />
    </b-card>
  </div>
</template>
 
<script>
  export default {
    name: "app"
  };
</script>

Commenti

  • riga 9: visualizza la vista corrente nel router. Il tag <router-view> viene riconosciuto solo se la proprietà [router] della vista è stata inizializzata;

13.5. Layout della vista

Il layout della vista è gestito dal seguente componente [Layout]:


<template>
  <!-- line -->
  <div>
    <b-row>
      <!-- three-column zone -->
      <b-col cols="2" v-if="left">
        <slot name="left" />
      </b-col>
      <!-- nine-column zone -->
      <b-col cols="10" v-if="right">
        <slot name="right" />
      </b-col>
    </b-row>
  </div>
</template>
 
<script>
  export default {
    // paramètres
    props: {
      left: {
        type: Boolean
      },
      right: {
        type: Boolean
      }
    }
  };
</script>

Abbiamo già utilizzato e spiegato questo layout nel progetto [vuejs-06] nella sezione [vuejs-06].

13.6. Il componente di navigazione

Il componente [Navigation] fornisce un menu di navigazione all'utente:

Image

Il componente che genera il blocco [1] è il seguente:


<template>
  <!-- bootstrap menu with three options -->
  <b-nav vertical>
    <b-nav-item to="/vue1" exact exact-active-class="active">Vue 1</b-nav-item>
    <b-nav-item to="/vue2" exact exact-active-class="active">Vue 2</b-nav-item>
    <b-nav-item to="/vue3" exact exact-active-class="active">Vue 3</b-nav-item>
  </b-nav>
</template>
  • Questo codice genera il primo dei tre link di navigazione;
  • l'attributo [to] dei tag <b-nav-item> deve corrispondere a una delle proprietà [path] delle rotte del router dell'applicazione;

13.7. Le viste

La vista n. 1 è la seguente:

Image

Le aree [3-4] sono generate dal seguente componente [Component1]:


<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message-->
    <b-alert show variant="primary" slot="right">Vue 1</b-alert>
  </Layout>
</template>
 
<script>
  import Navigation from './Navigation';
  import Layout from './Layout';
 
  export default {
    name: "component1",
    // composants utilisés
    components: {
      Layout, Navigation
    }
  };
</script>

Commenti

  • riga 2: la vista n. 1 utilizza il layout del componente [Layout], che consiste in due slot denominati [left] e [right];
  • riga 4: il menu di navigazione è posizionato nello slot sinistro. Si tratta dell'area [3] mostrata sopra;
  • riga 6: un messaggio è posizionato nello slot destro. Si tratta dell'area [4] mostrata sopra;

Le viste 2 e 3 sono simili.

Vista n. 2 visualizzata dal componente [Component2]:


<!-- vue n° 2 -->
<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message -->
    <b-alert show variant="secondary" slot="right">Vue 2</b-alert>
  </Layout>
</template>
 
<script>
  import Navigation from './Navigation';
  import Layout from './Layout';
 
  export default {
    name: "component2",
    // composants de la vue
    components: {
      Layout, Navigation
    }
  };
</script>

Vista n. 3 visualizzata dal componente [Component3]:


<!-- vue n° 3 -->
<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message -->
    <b-alert show variant="info" slot="right">Vue 3</b-alert>
  </Layout>
</template>
 
<script>
  import Navigation from "./Navigation";
  import Layout from "./Layout";
 
  export default {
    name: "component3",
    // composants de la vue
    components: {
      Layout,
      Navigation
    }
  };
</script>

13.8. Esecuzione del progetto

Image

All'esecuzione, viene visualizzata la seguente schermata:

Image

  • in [1], l'URL è [http://localhost:8080]. È stata quindi eseguita la seguente regola di routing:

{ path: '/', name: 'home', component: Component1 }

Pertanto, è stato visualizzato il componente [Component1]. Esso mostra la vista n. 1 [2]. Ora clicchiamo sul link [View 1], il cui codice è il seguente:


<b-nav-item to="/vue1" exact exact-active-class="active">Vue 1</b-nav-item>

La visualizzazione ora appare così:

  • In [3] è stata eseguita la seguente regola di routing:

path: '/vue1', name: 'vue1', component: Component1

Quindi, ancora una volta, è stato visualizzato il componente [Component1] e, di conseguenza, la Vista 1 [4]. Ora clicchiamo sul link [View 2], il cui codice è il seguente:


<b-nav-item to="/vue2" exact exact-active-class="active">Vue 2</b-nav-item>

La nuova vista è quindi la seguente:

Image

  • in [5], è stata eseguita la seguente regola di routing:

path: '/vue2', name: 'vue2', component: Component2

Pertanto, è stato visualizzato il componente [Component2], che corrisponde alla Vista 2. Se ora clicchiamo sul link [Vista 3], il cui codice è il seguente:


<b-nav-item to="/vue3" exact exact-active-class="active">Vue 3</b-nav-item>

Otteniamo la seguente nuova vista:

Image

  • in [6], è stata eseguita la seguente regola di routing:

path: '/vue3', name: 'vue3', component: Component3

Pertanto, è stato visualizzato il componente [Component3], ovvero la vista n. 3 [8].