Vue3.0 ルーティング自動インポート方法の例

Vue3.0 ルーティング自動インポート方法の例

1. 前提条件

インポートには require.context メソッドを使用します。vite で作成したプロジェクトで使用すると、「require not found」というエラーが報告されるため、webpack を使用してプロジェクトを作成する必要があります。または、Vite でこの問題を解決する方法を教えてもらえますか。

II. ルール

私たちが使用するルールは、src/views/ パスの下にあるすべてのディレクトリとサブディレクトリを検索し、「index.vue」という名前のファイルを検索し、親ディレクトリの名前を登録用のコンポーネント名として使用することです。構造は次のとおりです。

パブリックコンポーネントの登録と同様に、index.vue コンポーネントのみを登録し、他の名前のコンポーネントは登録されません。

3. インポート

// src/router/index.ts

'vue-router' から {createRouter、createWebHashHistory、createWebHistory、RouteRecordRaw} をインポートします。
「@/store」からストアをインポートします。
import daxie from "@/util/upper"; // 文字列の最初の文字を大文字にするメソッドを導入します。私はパス名の最初の文字を大文字にすることに慣れています。 // 自動ルーティング登録 const routerList:any = []
const requireComponent = require.context('@/views', true, /index.vue$/) // views パスの下にあるすべてのファイルを検索 const dynamic_route = requireComponent.keys().filter(fileName => {
    真を返す
})
// これでファイル配列の順序が乱れました。まず親ルートを先頭にして並べ替えます。子ルートが先頭にあり、親ルートが作成されていない場合は、エラーが報告されます。 // console.log(dynamic_route,"Before sorting")
dynamic_route.sort(関数(a,b):数値{
    const jieguoa:any = a.split("").filter((item:string)=>{
        戻り値 "/" == 項目
    })
    const jieguob:any = b.split("").filter((item:string)=>{
        戻り値 "/" == 項目
    })
    (jieguoa.length<jieguob.length)の場合{-1を返す}
    jieguoa.length>jieguob.lengthの場合{1を返す}
    0を返す
})

// console.log(dynamic_route,"ソート後")


dynamic_route.forEach(ファイル名 => {
    const パス = ファイル名.replace(".", "")
    const namelist = fileName.replace(".", "").replace("index.vue", "").split("/").filter((i:any) => {
        戻る
    })
    // テスト構成 const componentConfig = requireComponent(fileName)
    // コンポーネントは任意の属性を任意に追加できます。現在、必要な動的パラメータを格納する配列である canshu 属性が追加されています。// console.log(componentConfig.default,"Component Configuration 2")
    // 各レイヤーは手動で指定する必要があるため、3 つのレイヤーだけを指定します if (namelist.length == 1) {
        ルータリスト.push({
            パス:"/"+ namelist[namelist.length - 1],
            名前: daxie(namelist[namelist.length-1]),
            コンポーネント:()=>import(`../views${path}`),
            子供たち:[]、
        })
    }そうでない場合(namelist.length == 2){
        routerList.forEach((item:any)=>{
            if(item.name == daxie(namelist[0])){
                // コンポーネントにパラメータが必要かどうかを判定する const canshu = componentConfig.default.canshu || []
                if(canshu){
                    (i=0;i<canshu.length;i++) の場合
                        カンシュ[i] = "/:"+カンシュ[i]
                    }
                    アイテム.children.push({
                        パス: namelist[namelist.length-1] + canshu.join(""),
                        名前: daxie(namelist[namelist.length-1]),
                        コンポーネント:()=>import(`../views${path}`),
                        子供たち:[]、
                    })
                }それ以外{
                    アイテム.children.push({
                        パス: namelist[namelist.length-1],
                        名前: daxie(namelist[namelist.length-1]),
                        コンポーネント:()=>import(`../views${path}`),
                        子供たち:[]、
                    })
                }
            }
        })
    }そうでない場合(namelist.length == 3){
        routerList.forEach((item:any)=>{
            if(item.name == daxie(namelist[0])){
                item.children.forEach((yuansu:any)=>{
                    if (yuansu.name == daxie(namelist[1])){
                        // パラメータが必須かどうかを判定する const canshu = componentConfig.default.canshu || []
                        if(canshu){
                            (i=0;i<canshu.length;i++) の場合
                                カンシュ[i] = "/:"+カンシュ[i]
                            }
                            yuansu.children.push({
                                パス: namelist[namelist.length - 1]+canshu.join(""),
                                名前: daxie(namelist[namelist.length-1]),
                                コンポーネント:()=>import(`../views${path}`),
                            })
                        }それ以外 {
                            yuansu.children.push({
                                パス: namelist[namelist.length - 1],
                                名前: daxie(namelist[namelist.length-1]),
                                コンポーネント:()=>import(`../views${path}`),
                            })
                        }
                    }
                })
            }
        })
    }
})
const ルート: Array<RouteRecordRaw> = [
    {
        パス: '/'、
        名前: 'ホーム'、
        コンポーネント: ()=>import("@/views/shouye/shouye.vue")
    },
    {
        パス: '/about',
        名前: 'About'、
        コンポーネント: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
    },
    ...ルーターリスト、
    {
        パス: '/404',
        名前: '404',
        コンポーネント: () => import('@/views/404.vue')
    },
    {
        パス: '/:pathMatch(.*)',
        リダイレクト: '/404'
    },
]
// 順序に注意してください。最新のルーティング マッチング ルールによれば、404 ページは最後にある必要があります。
console.log(routes,"ルーティングテーブルの内容を表示する")

const ルーター = createRouter({
    履歴: createWebHistory(),
    // 履歴: createWebHashHistory(),
    ルート
})

デフォルトルーターをエクスポートする

このように、ルールに従ってコンポーネントを作成するだけで、ルートに自動的に登録されます。面倒な手動登録操作を排除します。

要約する

これで、vue3.0 ルート自動インポートに関するこの記事は終了です。vue3.0 ルート自動インポートに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3.0 CLI - 3.2 ルーティングの基本チュートリアル
  • Vue2/vue3 ルーティング権限管理方法の例
  • Vue3ルーティングVueRouter4を使用する簡単な例

<<:  Ubuntu仮想マシンでシリアル通信にcutecomを使用する方法

>>:  Docker を使用して静的 Web サイト アプリケーションを作成する (複数の方法)

推薦する

レスポンシブウェブデザインを実現するためにIEでCSS3メディアクエリをサポートする

今日の画面解像度は、320 ピクセル (iPhone) ほど小さいものから、2560 ピクセル以上 ...

フィボナッチ数列のJavaScript出力を実装する方法

目次トピック分析する基本的な解決策基本的な再帰再帰最適化要約するトピック私たちが答えなければならない...

ubuntu20.04 上の CLion2020.1.3 での ROS のインストールと設定の詳細な説明

1. CLionをダウンロード、インストール、アクティベートするオンラインで提供されるチュートリアル...

Docker での WSL の構成と変更の問題について

https://docs.microsoft.com/ja-jp/windows/wsl/wsl-...

MySQL 挿入時間の 8 時間の違いの問題の解決方法

MySQL挿入時の8時間の時差の問題を解決する通常、jdbc の URL にはいくつかのパラメータを...

CSSアニメーションに基づくSVGボタンのサンプルコード

具体的なコードは次のとおりです。 <a href="#"> <...

MySQL 8.0 の新しいリレーショナル データベース機能の詳細な説明

序文MySQL 8.0 の最新バージョンは 8.0.4 rc であり、正式版は近日中にリリースされる...

MySQL 8.0.11 Mac 用インストール ガイド

MACはmysql8.0をインストールします。具体的な内容は次のとおりです。 1. ダウンロードアド...

MySQL トランザクションと分離レベルの基本原理の簡単な分析

目次序文1. 取引の基本原則の簡単な分析原子性:持続性分離:一貫性: 2. 分離レベルの基本原理の分...

WeChatアプレットのスケルトン画面の実装例

目次スケルトンスクリーンとはアプレットでスケルトン画面を生成する方法導入方法表示と非表示ユーザーエク...

Linux の Centos7 に Mysql5.7.19 をインストールする詳細なチュートリアル

1. MySQLをダウンロードするURL: https://dev.mysql.com/downlo...

HTML チュートリアル: よく使われる HTML タグのコレクション (5)

関連記事:初心者が学ぶ HTML タグ (4)導入された HTML タグは、必ずしも XHTML 仕...

JSブラウザストレージの詳しい説明

目次導入クッキークッキーとはクッキー生成方法クッキーの適用シナリオクッキーのデメリット回避策ローカル...

Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...