Nuxt3自定义部分模块路由

项目场景:

Nuxt3项目中,部分页面的路由需要改成特定的路由名称显示


问题描述

由于Nuxt3的路由生成规则,例如创建了page-cart-index.vue的目录,那么生成的路由就会是/cart,但是现在需要将/cart的路由路径展示改成user-cart,我尝试过将文件夹名称直接改为user-cart,虽然达到了效果,但是感觉这样命名文件夹很怪,而且对应的index.vue里面使用const router = useRouter(),ts会报警告,虽然不影响功能,但是会很不舒服,所以走自定义路由方向。

相关截图说明:
改之前:
在这里插入图片描述
在这里插入图片描述

改之后:(文件夹改成这种带横线的,useRouter会报警告,但是不影响功能)
在这里插入图片描述
在这里插入图片描述

虽然功能生效,但是这种警告怪怪的,所以放弃以上方式。

解决方案(两种):

文件夹还是cart名称,不修改文件夹名称为user-cart, 通过自定义路由来达成目的,研究了下官方文档后,有如下两种方案:①根目录下创建app/router.options.ts ②配置nuxt.config.ts文件

  • 方案①:根目录下创建app/router.options.ts
// 不删除文件夹默认生成的路由,则会/cart和/user-cart都可以跳转到购物车,
// 跳转逻辑肯定是写的/user-cart,但是如果手动输入/cart的也会跳转到购物车,因为该路由是存在的
import type { RouterConfig } from "@nuxt/schema";
const customRoutes = [
  {
    name: "user-cart",
    path: "/user-cart",
    component: () => import("../pages/cart/index.vue"),
  },
];
export default <RouterConfig>{
  routes: (_routes) => {
    return [..._routes,...customRoutes];
  },
};
// 删除文件夹默认生成的cart路由
import type { RouterConfig, NuxtPage } from "@nuxt/schema";
const customRoutes = [
  {
    name: "user-cart",
    path: "/user-cart",
    component: () => import("../pages/cart/index.vue"),
  },
];
export default <RouterConfig>{
  routes: (routes) => {
    let _routes = [...routes];
    const arr = ["cart"]; // 配置需要删除的路由的名单
    // remove routes
    function removePagesMatching(arr: string[], _routes: any[]) {
      const routeToRemove = [];
      for (const _route of _routes) {
       	// 这块由于cart目录比较简单,简单的包含判断即可,如果遇到复杂的关系自己添加判断
        if (arr.includes(_route.name!)) routeToRemove.push(_route) 
        // else removePagesMatching(name, page.children); // 子路由自己如果遇到去判断处理
      }
      for (const route of routeToRemove )
        _routes.splice(_routes.indexOf(route), 1);
    }
    removePagesMatching(arr, _routes);
    return [..._routes, ...customRoutes];
  },
};
  • 方案②: 配置nuxt.config.ts文件
export default defineNuxtConfig({
  ...,
  hooks: {
    // 自定义某个页面路由
    "pages:extend": function (pages) {
      // add a route
      pages.push({
        name: "user-cart",
        path: "/user-cart",
        file: "~/pages/cart/index.vue",
      });
      // 看需不需要pages/cart目录默认生成的路由,不管的话/user-cart和/cart都可以跳转到同一个页面,上面的代码就可以了,如果需要删除掉对应的目录生成的路由,则需要下面的删除操作
      const arr = ["cart"]; // 配置需要删除的路由的名单
      // remove routes
      function removePagesMatching(arr: string[], pages: NuxtPage[] = []) {
        const pagesToRemove = [];
        for (const page of pages) {
          if (arr.includes(page.name!)) pagesToRemove.push(page);
          // else removePagesMatching(name, page.children); // 这块是涉及子路由的,你自己需要操作这块的时候自己去调试代码,我这块不需要暂时不管
        }
        for (const page of pagesToRemove) pages.splice(pages.indexOf(page), 1);
      }
      removePagesMatching(arr, pages);
    },
  },
  ...,
 });

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值