自学内容网 自学内容网

vue3(十七)-基础入门之vue-nuxt路由

一、路由

Nuxt.js 依据 pages 目录结构自动生成 vue-router 模块的路由配置。

要在页面之间使用路由,建议使用 < nuxt-link> 标签。

<template>
  <nuxt-link to="/">首页</nuxt-link>
</template>

1、基础路由

  • pages 的目录结构如下:
pages/
--| user/
-----| index.vue
-----| one.vue
--| index.vue
  • Nuxt.js 自动生成的路由配置如下:
router: {
  routes: [
    {
      name: 'index',
      path: '/',
      component: 'pages/index.vue'
    },
    {
      name: 'user',
      path: '/user',
      component: 'pages/user/index.vue'
    },
    {
      name: 'user-one',
      path: '/user/one',
      component: 'pages/user/one.vue'
    }
  ]
}
<!--pages/index.vue -->
<template>
  <div>
    <h1>Page index</h1>
    <nuxt-child />
  </div>
</template>

<!-- pages/user/index.vue -->
<template>
  <div>
    <h1>Users index</h1>
  </div>
</template>

<!-- pages/user/one.vue -->
<template>
  <div>
    <h1>User one</h1>
  </div>
</template>

测试结果:

  • http://localhost:3000/

在这里插入图片描述

  • http://localhost:3000/user
    在这里插入图片描述

  • http://localhost:3000/user/one
    在这里插入图片描述

2、动态路由

在 Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录。

pages 目录结构:

pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| users/
-----| _id.vue
--| index.vue

Nuxt.js 生成对应的路由配置表为:

router: {
  routes: [
    {
      name: 'index',
      path: '/',
      component: 'pages/index.vue'
    },
    {
      name: 'users-id',
      path: '/users/:id?',
      component: 'pages/users/_id.vue'
    },
    {
      name: 'slug',
      path: '/:slug',
      component: 'pages/_slug/index.vue'
    },
    {
      name: 'slug-comments',
      path: '/:slug/comments',
      component: 'pages/_slug/comments.vue'
    }
  ]
}
<!--pages/index.vue -->
<template>
  <div>
    <h1>Page index</h1>
    <nuxt-child />
  </div>
</template>

<!-- pages/users/_id.vue -->
<template>
  <div>
    <h1>Users index</h1>
  </div>
</template>

<!-- pages/_slug/index.vue -->
<template>
  <div>
    <h1>_slug index</h1>
  </div>
</template>

<!-- pages/_slug/index.vue -->
<template>
  <div>
    <h1>_slug comments</h1>
  </div>
</template>

名称为 users-id 的路由路径带有 :id? 参数,表示该路由是可选的。如果想将它设置为必选的路由,需要在 users/_id 目录内创建一个 index.vue 文件。

测试结果:

http://localhost:3000
在这里插入图片描述
http://localhost:3000/users/

在这里插入图片描述

http://localhost:3000/123/

在这里插入图片描述

http://localhost:3000/123/comments

在这里插入图片描述

3、路由参数校验

可以在动态路由组件中定义参数校验方法

例如:在 pages/users/_id.vue 文件中定义 validate 方法

export default {
  validate({ params }) {
    // 必须是number类型
    return /^\d+$/.test(params.id)
  }
}

如果校验方法返回的值不为 true或Promise中 resolve 解析为false或抛出 Error , Nuxt.js 将自动加载显示 404 错误页面或 500 错误页面。

4、嵌套路由

创建内嵌子路由,需要添加一个 Vue 文件,同时添加一个与该文件同名的目录用来存放子视图组件。

注意:别忘了在父组件(.vue文件) 内增加 用于显示子视图内容。

  • pages 目录结构
pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue
  • Nuxt.js 自动生成的路由配置如下:
router: {
  routes: [
    {
      path: '/users',
      component: 'pages/users.vue',
      children: [
        {
          path: '',
          component: 'pages/users/index.vue',
          name: 'users'
        },
        {
          path: ':id',
          component: 'pages/users/_id.vue',
          name: 'users-id'
        }
      ]
    }
  ]
}
<!-- pages/users.vue -->
<template>
  <div>
    <h1>Users Page</h1>
    <nuxt-child />
  </div>
</template>

<!-- pages/users/_id.vue -->
<template>
  <div>
    <h1>User _id</h1>
  </div>
</template>

<!-- pages/users/index.vue -->
<template>
  <div>
    <h1>Users index</h1>
  </div>
</template>

测试结果:

  • http://localhost:3000/users

在这里插入图片描述

  • http://localhost:3000/users/123

在这里插入图片描述

二、声明式导航

pages 目录结构:

pages/
--| users/
-----| _id.vue
-----| index.vue
--| index.vue
<template>
  <div>
    <nav>
      <!-- 使用<nuxt-link>实现页面导航 -->
      <nuxt-link to="/">pages</nuxt-link>
      <nuxt-link to="/users/123">Users _id</nuxt-link>
      <nuxt-link to="/users">Users</nuxt-link>
    </nav>
    <!-- nuxt2中必须添加<Nuxt />标签,否则 pages 中的页面不显示-->
    <Nuxt />
  </div>
</template>

三、重定向

方式一、配置 nuxt.config.js 实现

需要先清除 nuxt 默认生成的路由,否则会与配置的路由冲突。

router: {
    extendRoutes (routes, resolve) {
      // 首先清除默认的根路由
      const routesToRemove = ['/', '/users']
      routesToRemove.forEach(path => {
        const index = routes.findIndex(route => route.path === path)
        if (index > -1) {
          routes.splice(index, 1)
        }
      })

      // 添加新的重定向规则
      routes.push({
        path: '/',
        redirect: '/users/test'
      })
      routes.push({
        path: '/users',
        redirect: { name: 'about' }
      })
      // 打印所有路由,用于调试
      console.log(
        '所有路由配置:',
        routes.map(route => ({
          path: route.path,
          redirect: route.redirect
        }))
      )
    }
  }

方式二、中间件来实现

middleware/redirect.js

其中函数的参数为可选

export default function ({
  isHMR,
  app,
  store,
  params,
  error,
  redirect,
  route
}) {
  if (isHMR) {
    return
  }
  // 重定向规则
  const redirectRules = {
    '/': '/users/test', // 将根路径重定向到 /users/test
    '/users': '/about' // 将 /users 重定向到 /about
  }

  // 检查当前路径是否需要重定向
  if (redirectRules[route.path]) {
    return redirect(redirectRules[route.path])
  }
}

nuxt.config.js

export default {
  router: {
    middleware: ['redirect']
    }
}

原文地址:https://blog.csdn.net/weixin_43520586/article/details/143985746

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!