Skip to content

12. Приклад [nuxt-09]: контроль навігації

У прикладі [nuxt-09] використовується проміжне програмне забезпечення для керування навігацією клієнта. Крім того, додається новий вигляд для випадків, коли користувач запитує у сервера URL, якого немає в додатку.

Приклад [nuxt-09] спочатку отримується шляхом копіювання прикладу [nuxt-01]:

Image

12.1. Сторінка [_.vue]

Ми вже зазначали, що маршрути додатка формуються на основі вмісту папки [pages]. Тут ми додали до цієї папки сторінку [_.vue]. Ця конкретна сторінка відображається щоразу, коли додаток перенаправляє користувача на сторінку, яка не існує. У нашому прикладі така ситуація не може виникнути для клієнта. Однак вона може статися на стороні сервера, якщо, наприклад, йому надсилається запит на сторінку URL або [/nuxt-09/abcd]. Оскільки сторінка [abcd] не існує, буде відображено сторінку [_.vue]. У даному випадку це буде наступна сторінка:

Image

Код сторінки [_.vue] такий:


<!-- визначення HTML для подання -->
<template>
  <!-- форматування -->
  <Layout :left="true" :right="true">
    <!-- сповіщення у правій колонці -->
    <template slot="right">
      <!-- повідомлення на жовтому тлі -->
      <b-alert show variant="warning" align="center">
        <h4>La page demandée n'existe pas</h4>
      </b-alert>
    </template>
    <!-- меню навігації у лівій колонці -->
    <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',
  // використовувані компоненти
  components: {
    Layout,
    Navigation
  },
  // життєвий цикл
  beforeCreate() {
    // клієнт і сервер
    console.log('[404 beforeCreate]')
  },
  created() {
    // клієнт і сервер
    console.log('[404 created]')
  },
  beforeMount() {
    // тільки клієнт
    console.log('[404 beforeMount]')
  },
  mounted() {
    // тільки клієнт
    console.log('[404 mounted]')
  }
}
</script>

12.2. Клієнтське проміжне програмне забезпечення

Код клієнтського проміжного програмного забезпечення [client-routing] такий:


/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function({ route, from, redirect }) {
  // тільки клієнт
  if (process.client) {
    console.log('[client-routing]')
    // бажаний порядок навігації
    const routes = ['index', 'page1', 'page2', 'index']
    // поточний маршрут
    const current = route.name
    // попередній маршрут
    const previous = from.name
    // потрібна циклічна навігація
    // маршрути [i] до маршрутів [i+1]
    for (let i = 0; i < routes.length - 1; i++) {
      if (previous === routes[i] && current !== routes[i + 1]) {
        // залишаємося на тій самій сторінці
        redirect({ name: routes[i] })
        return
      }
    }
  }
}
  • рядок 3: ми знаємо, що функція маршрутизації отримує лише один параметр — об’єкт [context] від того, хто її виконує, — сервера чи клієнта. Позначення [function({ route, from, redirect })]
    • еквівалентна [function({ route:route, from:from, redirect:redirect })];
    • в результаті чого { route:route, from:from, redirect:redirect } <-- контекст;
    • що створює три параметри [route, from, redirect], а саме:
      • route=context.route;
      • redirect=context.redirect;
      • from=context.from;

У документації до [nuxt] ця нотація використовується дуже часто. Її необхідно знати;

  • рядок 8: масив імен сторінок у бажаному порядку навігації
  • рядок 10: назва сторінки призначення поточного маршруту;
  • рядок 12: назва попередньої сторінки поточного маршруту;
  • рядок 14: як вправу, ми дозволимо лише циклічну навігацію [index --> page1 --> page2 --> index];
  • рядки 15–21: пробігаємо масив, що задає бажаний порядок навігації;
  • рядок 16: якщо виявляється, що routes[i] була останньою сторінкою маршрутизації, то наступною має бути routes[i+1];
  • рядки 18–19: якщо це не так, додаток перенаправляється на routes[i], тобто сторінка не змінюється: навігація відхиляється;

12.3. Exécution

Виконуємо приклад із таким файлом [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: [
    // Документація: https://github.com/nuxt-community/eslint-module
    '@nuxtjs/eslint-module'
  ],
  /*
   ** Nuxt.js modules
   */
  modules: [
    // Документація: https://bootstrap-vue.js.org
    'bootstrap-vue/nuxt',
    // Документація: 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) {}
  },
  // каталог з вихідним кодом
  srcDir: 'nuxt-09',
  router: {
    base: '/nuxt-09/',
    middleware: ['client-routing']
  },
  // сервер
  server: {
    port: 81, // за замовчуванням: 3000
    host: 'localhost' // за замовчуванням: localhost
  }
}

Перевірте наступні моменти:

  • коли ви перебуваєте на сторінці [Home], ви можете перейти лише на сторінку [Page 1];
  • перебуваючи на сторінці [Page 1], ви можете перейти лише на сторінку [Page 2];
  • якщо ви перебуваєте на сторінці [Page 2], ви можете перейти лише на сторінку [Home];
  • якщо ви запитуєте неправильну сторінку URL, наприклад [http://localhost:81/nuxt-09b/abcd], то ви отримаєте повідомлення про те, що запитувана сторінка не існує;