Skip to content

12. Esempio [nuxt-09]: controllo della navigazione

L’esempio [nuxt-09] utilizza un middleware per controllare la navigazione del client. Inoltre, viene aggiunta una nuova vista per i casi in cui l’utente richieda al server una URL che non esiste nell’applicazione.

L’esempio [nuxt-09] è stato inizialmente ottenuto copiando l’esempio [nuxt-01]:

Image

12.1. La pagina [_.vue]

Abbiamo detto che i percorsi dell’applicazione vengono generati a partire dal contenuto della cartella [pages]. In questo caso, abbiamo aggiunto in tale cartella la pagina [_.vue]. Questa pagina specifica viene visualizzata ogni volta che l’applicazione viene indirizzata verso una pagina che non esiste. Nel nostro esempio, ciò non può verificarsi per il client. Tuttavia, può verificarsi per il server se, ad esempio, gli viene richiesta la pagina URL [/nuxt-09/abcd]. Poiché la pagina [abcd] non esiste, verrà visualizzata la pagina [_.vue]. In questo caso, sarà la seguente:

Image

Il codice della pagina [_.vue] è il seguente:


<!-- definizione HTML della vista -->
<template>
  <!-- impaginazione -->
  <Layout :left="true" :right="true">
    <!-- avviso nella colonna di destra -->
    <template slot="right">
      <!-- messaggio su sfondo giallo -->
      <b-alert show variant="warning" align="center">
        <h4>La page demandée n'existe pas</h4>
      </b-alert>
    </template>
    <!-- menu di navigazione nella colonna di sinistra -->
    <Navigation slot="left" />
  </Layout>
</template>

<script>
/* eslint-disable no-undef */
/* eslint-disable no-console */
/* eslint-disable nuxt/no-env-in-hooks */

import Layout from '@/components/layout'
import Navigation from '@/components/navigation'

export default {
  name: '404',
  // componenti utilizzati
  components: {
    Layout,
    Navigation
  },
  // ciclo di vita
  beforeCreate() {
    // client e server
    console.log('[404 beforeCreate]')
  },
  created() {
    // client e server
    console.log('[404 created]')
  },
  beforeMount() {
    // solo client
    console.log('[404 beforeMount]')
  },
  mounted() {
    // solo client
    console.log('[404 mounted]')
  }
}
</script>

12.2. Il middleware del client

Il codice del middleware del client [client-routing] è il seguente:


/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function({ route, from, redirect }) {
  // solo client
  if (process.client) {
    console.log('[client-routing]')
    // ordine di navigazione desiderato
    const routes = ['index', 'page1', 'page2', 'index']
    // percorso attuale
    const current = route.name
    // percorso precedente
    const previous = from.name
    // si desidera una navigazione circolare
    // percorsi[i] verso percorsi[i+1]
    for (let i = 0; i < routes.length - 1; i++) {
      if (previous === routes[i] && current !== routes[i + 1]) {
        // si rimane sulla stessa pagina
        redirect({ name: routes[i] })
        return
      }
    }
  }
}
  • riga 3: sappiamo che la funzione di routing riceve un solo parametro, l'oggetto [context] di chi la esegue, sia esso il server o il client. La notazione [function({ route, from, redirect })]
    • è equivalente a [function({ route:route, from:from, redirect:redirect })];
    • il che fa sì che { route:route, from:from, redirect:redirect } <-- contesto;
    • il che crea tre parametri [route, from, redirect] come:
      • route=context.route;
      • redirect=context.redirect;
      • from=context.from;

La documentazione di [nuxt] utilizza ampiamente questa notazione. È necessario conoscerla;

  • riga 8: un array dei nomi delle pagine nell’ordine di navigazione desiderato
  • riga 10: il nome della pagina di destinazione del percorso corrente;
  • riga 12: il nome della pagina precedente del percorso corrente;
  • riga 14: come esercizio, consentiremo solo una navigazione circolare [index --> page1 --> page2 --> index];
  • righe 15-21: si percorre l’array che indica l’ordine di navigazione desiderato;
  • riga 16: se si scopre che routes[i] era l’ultima pagina instradata, allora la successiva deve essere routes[i+1];
  • righe 18-19: se non è così, si reindirizza l’applicazione a routes[i], ovvero non si cambia pagina: si rifiuta la navigazione;

12.3. Exécution

Si esegue l’esempio con il seguente file [nuxt.config.js]:


export default {
  mode: 'universal',
  /*
   ** Headers of the page
   */
  head: {
    title: process.env.npm_package_name || "Introduction à nuxt.js par l'exemple",
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }
    ],
    link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
  },
  /*
   ** Customize the progress-bar color
   */
  loading: { color: '#fff' },
  /*
   ** Global CSS
   */
  css: [],
  /*
   ** Plugins to load before mounting the App
   */
  plugins: [],
  /*
   ** Nuxt.js dev-modules
   */
  buildModules: [
    // Doc: https://github.com/nuxt-community/eslint-module
    '@nuxtjs/eslint-module'
  ],
  /*
   ** Nuxt.js modules
   */
  modules: [
    // Doc: https://bootstrap-vue.js.org
    'bootstrap-vue/nuxt',
    // Doc: https://axios.nuxtjs.org/usage
    '@nuxtjs/axios'
  ],
  /*
   ** Axios module configuration
   ** See https://axios.nuxtjs.org/options
   */
  axios: {},
  /*
   ** Build configuration
   */
  build: {
    /*
     ** You can extend webpack config here
     */
    extend(config, ctx) {}
  },
  // directory del codice sorgente
  srcDir: 'nuxt-09',
  router: {
    base: '/nuxt-09/',
    middleware: ['client-routing']
  },
  // server
  server: {
    port: 81, // impostazione predefinita: 3000
    host: 'localhost' // impostazione predefinita: localhost
  }
}

Verificate i seguenti punti:

  • quando ci si trova sulla pagina [Home], è possibile navigare solo verso la pagina [Page 1];
  • quando ci si trova sulla pagina [Page 1], è possibile navigare solo verso la pagina [Page 2];
  • quando ci si trova sulla pagina [Page 2], è possibile navigare solo verso la pagina [Home];
  • quando si richiede una URL errata, ad esempio [http://localhost:81/nuxt-09b/abcd], viene visualizzata una pagina che indica che la pagina richiesta non esiste;