フロントエンドでルーティング変更を実装する方法は主に2つあります。この2つの方法の最大の特徴は、リフレッシュ機能なしでURL切り替えを実装することです。
歴史主に歴史を理解するため pushState() メソッドこれには、ステータス オブジェクト、タイトル (現在は無視されます)、(オプション) URL の 3 つのパラメータが必要です。それぞれについて詳しく説明しましょう。 状態オブジェクト — 状態オブジェクト状態は、pushState() を介して新しい履歴エントリを作成する JavaScript オブジェクトです。ユーザーが新しい状態に移動するたびに、popstate イベントが発生し、イベントの状態プロパティには履歴エントリの状態オブジェクトのコピーが含まれます。 状態オブジェクトは、シリアル化できるものであれば何でも構いません。その理由は、Firefox はユーザーがブラウザを再起動したときに使用するために状態オブジェクトをユーザーのディスクに保存し、状態オブジェクトのシリアル化された表現に 640k のサイズ制限を設定しているためです。シリアル化後に 640k を超える状態オブジェクトを pushState() メソッドに渡すと、メソッドは例外をスローします。より多くのスペースが必要な場合は、sessionStorage と localStorage を使用することをお勧めします。 title — Firefox は現在このパラメータを無視しますが、将来的には使用される可能性があります。ここで空の文字列を渡すと、このメソッドが将来変更されても安全になります。オプションで、リダイレクト先の状態の短いタイトルを渡すこともできます。 URL — このパラメータは、新しい履歴 URL レコードを定義します。ブラウザは pushState() を呼び出した直後に URL をロードするのではなく、ユーザーがブラウザを再度開いたときなど、後で URL をロードする場合があることに注意してください (リソースはロードされませんが、変更をリッスンしてビューを変更することができ、ページを更新せずに単一ページ ルーティングを実装する方法になります)。新しい URL は絶対パスである必要はありません。新しい URL が相対パスの場合、現在の URL を基準として扱われます。新しい URL は現在の URL と同じオリジン (同一オリジン ポリシー) である必要があります。そうでない場合、pushState() は例外をスローします。このパラメータはオプションであり、デフォルトでは現在の URL になります。 ある意味では、pushState() を呼び出すことは、現在のページに新しい履歴レコードを作成してアクティブ化する点で、window.location = "#foo" を設定することに似ています。しかし、pushState() には次のような利点があります。 新しい URL は、現在の URL と同じオリジンを持つ任意の URL にすることができます。逆に、ハッシュを変更する場合、window.location の設定は同じドキュメントのみになります。 新しい URL が古い URL とハッシュのみが異なる場合でも、pushState() は hashchange イベントをトリガーしないことに注意してください。 pushState() の使用シナリオ履歴は更新せずにURLまたはURLパラメータを変更できます window.history.replaceState('', '', `${window.location.origin}${window.location.pathname}type=a`); replaceState() メソッドhistory.replaceState() の使用は history.pushState() と非常に似ていますが、違いは replaceState() が新しい履歴項目を作成するのではなく、現在の履歴項目を変更することです。 ただし、これによって、グローバル ブラウザ履歴に新しい履歴項目が作成されなくなるわけではないことに注意してください。 ポップステートイベントwindow.onpopstate を使用して戻りイベントをリッスンする window.onpopstate = funcRef; funcRef : (イベント:{状態:任意})=>void アクティブな履歴レコードが変更されるたびに、対応するウィンドウ オブジェクト (window.onpopstate) で popstate イベントがトリガーされます。現在アクティブな履歴エントリが history.pushState() メソッドによって作成されたか、または history.replaceState() メソッドによって変更された場合、popstate イベント オブジェクトの状態プロパティには、履歴エントリの状態オブジェクトのコピーが含まれます。 **知らせ:
pushState と replaceState を監視する方法は?サブスクリプション公開モードを通じて、これを自分で実装することができます。まず、サブスクリプション公開モードであるDepとWatchを使用します。これは、実際にはVueソースコードdepとwantcher間の実装方法の簡略化されたバージョンです。 class Dep { // サブスクリプションプールコンストラクター(名前){ this.id = new Date() //ここでは、サブスクリプションプールのIDとしてタイムスタンプを使用します this.subs = [] //このイベントでサブスクライブされたオブジェクトのコレクション} defined(){ // サブスクライバーを追加します Dep.watch.add(this); } notification() { // 購読者に変更を通知する this.subs.forEach((e, i) => { if(typeof e.update === 'function'){ 試す { e.update.apply(e) // サブスクライバー更新関数をトリガーする} catch(err){ コンソール.warr(エラー) } } }) } } Dep.watch = null; クラスウォッチ{ コンストラクタ(名前,関数){ this.name = name; //サブスクリプションメッセージの名前 this.id = new Date(); //ここでは、タイムスタンプをサブスクライバーのIDとして使用します this.callBack = fn; //サブスクリプションメッセージが送信され変更されると、サブスクライバーによってコールバック関数が実行されます} add(dep) { // サブスクライバーを dep サブスクリプション プールに追加します dep.subs.push(this); } update() { // サブスクライバーメソッドを更新 var cb = this.callBack; // 関数内で呼び出される this を変更しないように割り当てる cb(この名前); } } historyメソッドを再実装し、addHistoryListenerメソッドを追加します。 const addHistoryMethod = (関数(){ var historyDep = new Dep() // サブスクリプションプールを作成する return function (name) { if(name==='履歴変更'){ var event = new Watch(name,fn); 依存関係ウォッチ = evnet; historyDep.defind(); // サブスクライバーを追加 Dep.watch = null; }それ以外の場合(name==='pushState'||name==='replaceState'){ var メソッド = history[名前]; 関数()を返す{ method.apply(履歴、引数) 履歴を通知します。 } } } })() window.addHistoryListener = addHistoryMethod('historyChange') history.pushState = addHistoryMethod('pushState'); history.replaceState = addHistoryMethod('replaceState'); カプセル化は成功しました。テスト使用例 window.addHistoryListener('履歴',function(){ console.log('ウィンドウ履歴が変更されました') }) window.addHistoryListener('履歴',function(){ console.log('ウィンドウ履歴が変更されました。私もそれを聞きました') // 複数のリスニングイベントをバインドできます console.log(history.state) }) history.pushState({foo:bar}, 'title', '/car') 現在のステータスを取得するページが読み込まれると、null 以外の状態オブジェクトが存在する場合があります。これは、たとえば、ページが状態オブジェクトを(pushState() または replaceState() メソッドを介して)設定し、その後ユーザーがブラウザを再起動した場合などに発生する可能性があります。その後、ページがリロードされると、ページは onload イベントを受信しますが、popstate イベントは受信しません。ただし、history.state プロパティを読み取ると、popstate がトリガーされた場合と同じ状態オブジェクトが取得されます。 popstate イベントを待たずに現在の履歴項目の状態オブジェクトを読み取ることができます。次のように history.state プロパティを使用します。 現在の状態を history.state とします。 対比
要約する履歴は非更新ルーティングを実装する方法であり、安定したシステムエクスペリエンスを確保するための単一ページ開発に特に適しています。ただし、履歴は pushState と replaceState の動作を監視せず、go、back、forward の動作のみを監視します。ただし、サブスクリプション公開モードを使用し、Dep と Watch を使用し、pushState および replaceState イベントを再パッケージ化し、呼び出し後に通知メソッドを自動的にトリガーし、addHistoryListener メソッドを追加してリスニング コールバック (サブスクライバー) を追加することができます。 これで、JavaScript を使用してルート変更を監視する方法についての記事は終了です。JavaScript を使用してルート変更を監視する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: MySQL テーブル削除操作の実装 (delete、truncate、drop の違い)
この記事では、ソーシャル ウェブサイトのホームページを比較分析することで洞察を得て、ソーシャル ウェ...
皆さんもJDを使ったことがあると思います。ホームページには非常によく見られる機能があります。階段の特...
目次プレースホルダーの置き換えコンソール印刷テーブル()ログ、情報、警告、エラーグループ()、グルー...
一部の障害コード テーブルでは、履歴またはパフォーマンス上の理由から、次の設計パターンが使用されます...
JS で関数を定義する 3 つの方法例を挙げて説明しましょう。 <スクリプト> //メソ...
目次ハッシュと履歴の違いハッシュ履歴getCurrentLocation の実装setupListe...
目次序文: 1. Navicatの紹介2. シンプルなチュートリアルの共有接続管理ライブラリテーブル...
この記事では、WeChatアプレットのスクロールビューの左右連動を実現するための具体的なコードを参考...
目次1. はじめに2. setIntervalとsetTimeoutの違い3.タイムアウトを設定する...
序文最近、フロントエンドの学習に関する以前のメモを整理したところ、モバイル Web 画面の適応 (r...
1. コントロールパネルで、MySQLのすべてのコンポーネントをアンインストールします。コントロール...
この記事では、フロア効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。...
実際の使用では、ミニプログラムを友人や友人サークルと共有する必要があることが多く、通常は一度に 1 ...
プロジェクトの開発中に、データベースのデータがどんどん大きくなり、その結果、1 つのテーブルにデータ...
MACでMySQLの初期パスワードを忘れた問題を解決する方法を参考までに共有します。具体的な内容は次...