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 サイト アプリケーションを作成する (複数の方法)

推薦する

VueはPCで写真をアップロードする機能を実現

この記事の例では、PC上で写真アップロード機能を実現するためのVueの具体的なコードを参考までに共有...

MySQLデータベースで外部キー制約を使用する必要があるかどうかの詳細な説明

1. はじめに外部キー制約を使用するかどうかという話題は、すでに決まり文句になっています。学校では、...

HTML5で見逃せないAPIやヒントのまとめ

これまでのブログ投稿では、HTML 5 ではあまり使われていないが注目すべき API やヒントに焦点...

vue router-view のネストされた表示実装

目次1. ルーティング構成2. Vueページのネスト3. ネストされた関係1. ルーティング構成 定...

vue-amap のインストールと使用手順

以前、Amap API を非同期にロードする方法を紹介しました。今回は、vue-amap の使用方法...

MySQL FAQ シリーズ: ibdata1 ファイルのサイズが突然増加しないようにする方法

0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...

WeChatアプレットは左にスワイプしてリスト項目を削除する効果を実現

この記事では、WeChatミニプログラムの具体的なコードを共有し、左にスワイプしてリスト項目を削除す...

デザイン理論:テキスト表現とユーザビリティ

<br />テキストデザインでは、通常、テキストのレイアウト、つまりテキストをより美しく...

Linux の操作とメンテナンスの基本システムディスク管理チュートリアル

1. ディスクパーティション: 2. fdiskパーティションディスクが2 TB未満の場合はfdis...

CSSの2つの特別な値は、カスケードの継承と初期メソッドを制御するために使用されます。

カスケードを制御するために CSS の任意のプロパティに割り当てることができる特別な値が 2 つあり...

Linux システムで複数のバージョンの PHP を共存させるソリューション (超シンプル)

PHP7が出たので、最新バージョンのファンとしては、早速アップグレードして体験してみました。しかし...

ネイティブ JS 音楽プレーヤー

この記事の例では、音楽プレーヤーを実装するためのJSの具体的なコードを参考までに共有しています。具体...

Mysql5.7 のルートパスワードを忘れた場合の対処法 (シンプルで効果的な方法)

前回の記事では、MySQL 5.7でルートパスワードを忘れた場合と、MySQL 5.7でルートパスワ...

Zabbix ベースの Jenkins プロセス監視の詳細な説明

1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...