vuejsのルーティング実装原理を詳しく解説
この記事では、vuejs のルーティング実装原理について詳しく説明します。必要な方は参考にしていただければ幸いです。
一般的なソース コードでは、window.history と location.hash が使用されます。
history の実装
window.history オブジェクトには、ブラウザとウィンドウの履歴が含まれます。書き込み時に履歴オブジェクトが使用されます。ウィンドウ接頭辞を使用する必要はありません。 History は、SPA フロントエンド ルーティングを実装するための主流の方法です。これには、いくつかの独自のメソッドがあります。
history.back()
ブラウザの [戻る] ボタンをクリックするのと同じです#。##history.forward()ブラウザで進むボタンをクリックするのと同じ
history.go(n)
パラメータとして整数を受け入れ、その整数で指定されたページに移動します。たとえば、go(1) は forward() と同等、go(-1) は back() と同等、go(0) は同等です。現在のページを更新します。If 移動された位置がアクセス履歴の境界を超えている場合、上記の 3 つのメソッドはエラーを報告しませんが、通知せずに失敗します。
title: 新しいページのタイトルですが、現在すべてのブラウザはこの値を無視するため、ここに null を入力できます。
url: 新しい URL は、現在のページと同じドメイン内にある必要があります。ブラウザのアドレス バーにこの URL が表示されます。
PushState に関しては、注目すべき点がいくつかあります。
ここの URL は、悪意のあるスクリプトが他の Web サイトの URL を模倣してユーザーを欺くことを防ぐために、同一生成元ポリシーによって制限されています。ポリシーに違反すると、エラーが報告されます。
注: このイベントは、pushState メソッドまたは replaceState メソッドを呼び出すだけではトリガーされません。ユーザーがブラウザーの「戻る」ボタンおよび「進む」ボタンをクリックした場合、または JavaScript を使用して「戻る」、「進む」、および「進む」メソッドを呼び出した場合にのみトリガーされます。また、このイベントは同じドキュメントのみを対象とします。閲覧履歴の切り替えにより異なるドキュメントが読み込まれる場合、このイベントはトリガーされません。
使用法: 使用する場合、popstate イベントのコールバック関数を指定できます。このコールバック関数のパラメータはイベント オブジェクトであり、その state 属性は、現在の URL の PushState メソッドと replaceState メソッドによって提供される state オブジェクト (つまり、これら 2 つのメソッドの最初のパラメータ) を指します。
<a class="spa">abc.html</a>
<a class="spa">123.html</a>
<a href="/rdhub" class="spa ">rdhub</a>
// 注册路由
document.querySelectorAll('.spa').forEach(item => {
item.addEventListener('click', e => {
e.preventDefault();
let link = item.textContent;
if (!!(window.history && history.pushState)) {
// 支持History API
window.history.pushState({name: 'history'}, link, link);
} else {
// 不支持,可使用一些Polyfill库来实现
}
}, false)
});
// 监听路由
window.addEventListener('popstate', e => {
console.log({
location: location.href,
state: e.state
})
}, false)
popstate监听函数里打印的e.state便是history.pushState()里传入的第一个参数,在这里即为{name: 'history'}
ログイン後にコピー
<a class="spa">abc.html</a> <a class="spa">123.html</a> <a href="/rdhub" class="spa ">rdhub</a> // 注册路由 document.querySelectorAll('.spa').forEach(item => { item.addEventListener('click', e => { e.preventDefault(); let link = item.textContent; if (!!(window.history && history.pushState)) { // 支持History API window.history.pushState({name: 'history'}, link, link); } else { // 不支持,可使用一些Polyfill库来实现 } }, false) }); // 监听路由 window.addEventListener('popstate', e => { console.log({ location: location.href, state: e.state }) }, false) popstate监听函数里打印的e.state便是history.pushState()里传入的第一个参数,在这里即为{name: 'history'}
hash
ハッシュの基本的な概要URL にはハッシュ http:/ を含めることができます/localhost :9000/#/rdhub.html
ウィンドウ オブジェクトに onhashchange というイベントがあります。このイベントは次の状況でトリガーされます:- ブラウザのアドレスを変更します。最後に直接 #hash を追加または変更します;
- location.href または location.hash の値を変更することによって;
- トリガーすることによってアンカーされたリンクをクリックする ;
- 2 つの Web ページ アドレスのハッシュ値が異なる場合、ブラウザを前後に移動するとハッシュが変化する可能性があります。
<a href="/rdhub" class="spa">rdhub</a>
<a href="/abc" class="spa">abc</a>
<a href="/123" class="spa">123</a>
<a href="/hash" class="spa">hash</a>
document.querySelectorAll('.spa').forEach(item => {
item.addEventListener('click', e => {
e.preventDefault();
let link = item.textContent;
location.hash = link;
}, false)
});
// 监听路由
window.addEventListener('hashchange', e => {
console.log({
location: location.href,
hash: location.hash
})
}, false)
ログイン後にコピー
<a href="/rdhub" class="spa">rdhub</a> <a href="/abc" class="spa">abc</a> <a href="/123" class="spa">123</a> <a href="/hash" class="spa">hash</a> document.querySelectorAll('.spa').forEach(item => { item.addEventListener('click', e => { e.preventDefault(); let link = item.textContent; location.hash = link; }, false) }); // 监听路由 window.addEventListener('hashchange', e => { console.log({ location: location.href, hash: location.hash }) }, false)
ハッシュ モードと履歴モード。これら 2 つのモードはブラウザ インターフェイスを通じて実装されますが、次の点が異なります。 vue-router は、非ブラウザ環境用の抽象モードも用意しています。その原理は、配列スタックを使用してブラウザ履歴スタックの機能をシミュレートすることです。もちろん、上記は一部のコア ロジックにすぎません。システムの堅牢性を確保するために、ソース コードには多くの補助ロジックが含まれており、これも学ぶ価値があります。
pushState は、後で使用するために title 属性を追加で設定できます
履歴モードに関する問題
単一ページ アプリケーションの場合、理想的な使用シナリオは、アプリケーションに入るときにのみindex.htmlをロードすることであり、その後のネットワーク操作は Ajax を通じて完了し、ロードされることはありません。 URL はページを再リクエストしますが、ユーザーがアドレス バーに直接入力して Enter キーを押す、ブラウザが再起動してアプリケーションをリロードするなど、特殊な状況が発生することは避けられません。
ハッシュ モードでは、ハッシュ部分の内容のみが変更され、ハッシュ部分は HTTP リクエストには含まれません:
http://rdhub.cn/#/user/id / / など 再リクエストでは http://rdhub.cn/
のみが送信されるため、ハッシュ モードの URL に基づいてページをリクエストする場合は問題ありません。
履歴モードでは、通常のリクエスト バックエンド URL と同じになるように URL が変更されます
http://rdhub.cn/user/id
この場合、リクエストをバックエンドに再送信します。 , バックエンドに /user/id に対応するルーティング処理が設定されていない場合、404 エラーが返されます。
公式に推奨される解決策は、すべての状況をカバーする候補リソースをサーバーに追加することです。URL が静的リソースに一致しない場合は、アプリが依存する同じindex.html ページが返されるはずです。ページ上で。同時に、これを実行すると、すべてのパスに対して Index.html ファイルが返されるため、サーバーは 404 エラー ページを返さなくなります。これを回避するには、Vue アプリケーションですべてのルーティング状況をカバーしてから、404 ページを与えます。または、Node.js をバックエンドとして使用する場合は、サーバー側のルーティングを使用して URL を照合し、一致するルートがない場合に 404 を返すことにより、フォールバックを実装できます。
以上がvuejsのルーティング実装原理を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Vue フレームワークを使用してフロントエンド プロジェクトを開発する場合、デプロイ時に複数の環境をデプロイすることになりますが、開発環境、テスト環境、オンライン環境で呼び出されるインターフェイス ドメイン名が異なることがよくあります。どうすれば区別できるでしょうか?それは環境変数とパターンを使用することです。

Ace は、JavaScript で書かれた埋め込み可能なコード エディターです。 Sublime、Vim、TextMate などのネイティブ エディターの機能とパフォーマンスに匹敵します。あらゆる Web ページや JavaScript アプリケーションに簡単に埋め込むことができます。 Ace は Cloud9 IDE のメイン エディタとして維持されており、Mozilla Skywriter (Bespin) プロジェクトの後継です。

コンポーネント化とモジュール化の違い: モジュール化はコード ロジックの観点から分割され、コードの階層化された開発が容易になり、各機能モジュールの機能の一貫性が保証されます。コンポーネント化は UI インターフェイスの観点から計画され、フロントエンドのコンポーネント化により UI コンポーネントの再利用が容易になります。

前書き: vue3 の開発では、reactive は応答性の高いデータを実装するメソッドを提供します。これは日常の開発で頻繁に使用される API です。この記事では、著者はその内部動作メカニズムを探ります。

Vue.js は、今日のフロントエンド開発において非常に人気のあるフレームワークとなっています。 Vue.js が進化し続けるにつれて、単体テストの重要性がますます高まっています。今日は、Vue.js 3 で単体テストを作成する方法を検討し、いくつかのベスト プラクティスと一般的な問題と解決策を提供します。

Vue3 動的コンポーネントで例外を処理するにはどうすればよいですか?次の記事では、Vue3 の動的コンポーネントの例外処理方法について説明します。

Vue.js では、開発者は、JSX 構文とテンプレート構文という 2 つの異なる構文を使用してユーザー インターフェイスを作成できます。どちらの構文にもそれぞれ長所と短所があるので、それらの違い、長所と短所について説明します。

実際の開発プロジェクトのプロセスでは、比較的大きなファイルをアップロードする必要がある場合がありますが、その場合はアップロードが比較的遅くなり、バックグラウンドでフロントエンドがファイルのスライスをアップロードする必要がある場合があります。これは非常に簡単です。たとえば、1Aギガバイトのファイル ストリームはいくつかの小さなファイル ストリームに分割され、インターフェイスはそれぞれの小さなファイル ストリームを配信するように要求されます。
