Nuxt.js 自定義路由(在外部可拿到路由配置routes,可自定義 meta 等屬性)

修訂:新的方式使用了 process.cwd() 替代了 __dirname,能夠隨意在外部引用自定的 routes

首先,在 nuxt.config.js 中,有 router 屬性可配置 ,且 router 可配置對(duì)象中有 extendRoutes 擴(kuò)展路由方法。

1:在根目錄下新增 router 文件夾并創(chuàng)建 Index.js 文件。(就像vue中一樣)
2:引入 path 模塊,并簡(jiǎn)單封裝成resolve方法,這里不要用 __dirname,否則路由暴露出去調(diào)用時(shí) 刷新頁(yè)面會(huì)出錯(cuò),因?yàn)樗⑿聲r(shí)__dirname是不存在的。

這里要用 process.cwd(),process.cwd() 會(huì)拿到你項(xiàng)目運(yùn)行時(shí)所在的文件目錄。
// router/index.js
// 引入path
import path from 'path'

// 要使用 process.cwd()
const resolve = (pagePath) => path.resolve(process.cwd(), `./${pagePath}`)

// 下面這種方式不可取
// const resolve = (pagePath) => path.resolve(__dirname, pagePath)

3:自定義路由相關(guān)屬性(就像vue中定義的一樣)

// router/index.js
// 簡(jiǎn)單定義一下
export const $routes = [
    {
        path: '/',
        name: 'Home',
        component: resolve('pages/home/index.vue'),
        meta: {
            title: '首頁(yè)',
            icon: 'icon-home'
        }
    },
    {
        path: '/dashboard',
        component: resolve('pages/dashboard/index.vue'),
        meta: {
            title: '控制臺(tái)',
            icon: 'icon-dashboard'
        },
        children: [
            {
                path: '',
                name: 'dashboard-cloud',
                component: resolve('pages/dashboard/cloud/index.vue'),
                meta: {
                    title: '云云云',
                    icon: 'icon-cloud'
                }
            }
        ]
    }
]

4:定義 extendRoutes 方法,清除原有的nuxt自動(dòng)生的路由,添加自己的新路由(最重要的一步), routes.length = 0

// router/index.js
const extendRoutes = (routes) => {
    routes.length = 0
    routes.push(...$routes)
}

5:最后定義router對(duì)象并暴露出去,然后直接在 nuxt.config.js中使用即可

// router/index.js
export default { base: '/', extendRoutes }

完整代碼附上:

// router/index.js
import path from 'path'

const resolve = (pagePath) => path.resolve(process.cwd(), `./${pagePath}`)

export const $routes = [
    {
        path: '/',
        name: 'Home',
        component: resolve('pages/home/index.vue'),
        meta: {
            title: '首頁(yè)',
            icon: 'icon-home'
        }
    },
    {
        path: '/dashboard',
        component: resolve('pages/dashboard/index.vue'),
        meta: {
            title: '控制臺(tái)',
            icon: 'icon-dashboard'
        },
        children: [
            {
                path: '',
                name: 'dashboard-cloud',
                component: resolve('pages/dashboard/cloud/index.vue'),
                meta: {
                    title: '云云云',
                    icon: 'icon-cloud'
                }
            }
        ]
    }
]

const extendRoutes = (routes) => {
    routes.length = 0 // 清除 nuxt 自己生成的路由,這里不要用 空數(shù)組 賦值
    routes.push(...$routes)
}

export default { base: '/', extendRoutes }
// nuxt.config.js
import router from './router'

export default {
    ..., // 其他屬性配置
    router,
    ... // 其他屬性配置
}

此時(shí),自定的路由規(guī)則也可以到外部拿到了。

// xxx.vue
import { $routes } from '@/router'

console.log($routes)

以上為個(gè)人整理,如有錯(cuò)誤請(qǐng)指正,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容