Skip to content
On this page

nuxt3中路由的改变

nuxt3正式版刚刚发布了,但是用法和api跟nuxt2有很多的不同,包括nuxt3 rc版本中很多用法在正式版中也已经发生了改变,但是官网文档没有及时的更新,导致之前使用过nuxt旧版本的项目在升级后不能正常运行。

约定式路由

nuxt3会自动将根目录下的pages中的文件注册为路由,index.vue映射为/,文件名映射为同名path。首先需要在根目录下新建一个pages目录,然后新建一个about.vue的页面,重新启动nuxt服务(新建页面需要重启),就可以通过/about来访问about页面了,这点和nuxt2保持一致。

动态路由

在详情页面,一般都是需要通过id来生成动态路由,比如在/pages/news目录下,新建一个[id].vue的文件,就可以通过/news/1来访问id为1的详情页面了(nuxt2中是新建_id.vue文件)。

如果在文件名或者文件夹名称里面包含了方括号,它们将被转换为动态路由参数。

在详情页面,就可以通过route.params.id在获取id参数了

const route=useRoute()
const id=route.params.id

嵌套路由

当创建的文件名和文件夹名相同时,会自动创建嵌套路由,然后在父组件中使用NuxtChild展示子组件的内容

比如下面目录结构:
-| pages/
---| parent/
------| child.vue
---| parent.vue

路由中间件

全局中间件

Nuxt3提供了路由中间件的概念,你可以在整个应用使用它,目的是在导航到某一个页面之前,执行一些代码,所以可以用路由中间件实现路由拦截的功能。 在根目录创建一个middleware文件夹,然后新建一个default.global.ts文件。其中.global表示这是一个全局中间件,也就是在每次跳转时都会执行。

export default defineNuxtRouteMiddleware((to,from)={
    console.log("要去那个页面:"+to.path)
  console.log("来自那个页面:"+from.path)
  if(to.path==='/admin'){
        // 停止导航
        abortNavigation()
        return navigateTo('/')
    }
})

局部中间件

在middleware中新建中间件时不加global就是局部中间件了

// customer.ts
export default defineNuxtRouteMiddleware((to,from)=>{
    console.log('局部中间件')
})

然后在需要使用中间件的页面通过definePageMeta引入中间件

<!-- about.vue -->
definePageMeta({
    middleware:['customer'],
    <!-- 或者middleware:'customer' -->
})

Released under the MIT License.