ルーティングのジャンプを徹底的に理解する:locationとhistoryインタフェース
3195 ワード
単一ページアプリケーションでは、通常、フロントエンドによってルーティングが構成され、urlによって異なるコンテンツが表示されます.これがどのように行われているかを知るには、まずブラウザが提供する2つのAPIを理解する必要があります.
window.location
まずlocationオブジェクトについて説明します.locationには多くの属性があります.プロパティ値を変更することで、ページのurlを変更できます.単一ページアプリケーションで必要なのはurlを変更してページをリフレッシュしないことです.locationインタフェースでは、次の2つの方法があります. のみ変更直接付与 上記の残りの2つの属性
window.history
historyインタフェースはHTML 5に追加され、ページをリフレッシュせずにurlを変更する5つの方法があります.
urlの変化を監視する方法
ページをリフレッシュせずにページのurlを変更する方法を知っています.ページはリフレッシュされていませんが、ページに表示される内容を変更します.これはjsがurlの変化を監視して私たちの目的を達成する必要があります.
urlの変更を傍受できる2つのイベントがあります.
hashchange
まず、イベントリスニングのコードを追加します.
そしてページのconsoleで楽しい実験ができます.
上図から,locationインタフェースによってhashを直接変更してもhistoryインタフェースによって前進後退しても(hashが変更された場合だけ)url hashの変更を傍受できることが分かる.しかし、この事件もurl hashの変化を傍受するしかない.より強力なイベントが必要です.
popstate
popstateイベントは、
イベントリスニングのコードを追加します.
そしてまたページのconsoleで楽しい実験ができます.
実は
hashモードとhistoryモード
単一ページアプリケーションのルーティングにはhashとhistoryの2つのモードがあることを知っています.hashモードで
だからhashモードでは私たちの仕事は実はもっと簡単ですが、どうして今historyモードをお勧めしますか?いつもhashモードのurlが醜いのではありませんて、結局これは顔を見る世界ですか?
しかし
window.location
location.href
location.hash
location.search
location.pathname
window.history
history.pushState()
history.replaceState()
history.go()
history.back()
history.forward()
window.location
まずlocationオブジェクトについて説明します.locationには多くの属性があります.プロパティ値を変更することで、ページのurlを変更できます.単一ページアプリケーションで必要なのはurlを変更してページをリフレッシュしないことです.locationインタフェースでは、次の2つの方法があります.
location.href
賦値時urlのhashlocation.hash
location.search
は、ページを直接リフレッシュします.これは説明しません.ただしlocation.pathname
hashのみを変更することは可能であるはずですが、実際にはブラウザがこの属性値を符号化するので、#番号の値を直接付与することはできません.window.history
historyインタフェースはHTML 5に追加され、ページをリフレッシュせずにurlを変更する5つの方法があります.
history.pushState()
history.replaceState()
history.go()
history.back()
はhistory.go(-1)
に等価であり、history.forward()
はhistory.go(1)
に等価であり、この3つのインタフェースはブラウザインタフェースの前進後退に等しいため、上記の3つの方法のみを実証した.urlの変化を監視する方法
ページをリフレッシュせずにページのurlを変更する方法を知っています.ページはリフレッシュされていませんが、ページに表示される内容を変更します.これはjsがurlの変化を監視して私たちの目的を達成する必要があります.
urlの変更を傍受できる2つのイベントがあります.
hashchange
hashchange
イベントはurl hashの変更を傍受することができる.まず、イベントリスニングのコードを追加します.
window.addEventListener('hashchange', function(e) {
console.log(e)
})
そしてページのconsoleで楽しい実験ができます.
上図から,locationインタフェースによってhashを直接変更してもhistoryインタフェースによって前進後退しても(hashが変更された場合だけ)url hashの変更を傍受できることが分かる.しかし、この事件もurl hashの変化を傍受するしかない.より強力なイベントが必要です.
popstate
です.popstate
popstateイベントは、
history.pushState()
およびhistory.replaceState()
を除くurlの変化を傍受することができる.イベントリスニングのコードを追加します.
window.addEventListener('popstate', function(e) {
console.log(e)
})
そしてまたページのconsoleで楽しい実験ができます.
実は
history.pushState()
とhistory.replaceState()
のurlに対する変更はpopstate
イベントをトリガーしないだけでなく、この2つの方法がurl hashだけを変更する場合もhashchange
イベントをトリガーしない.hashモードとhistoryモード
単一ページアプリケーションのルーティングにはhashとhistoryの2つのモードがあることを知っています.hashモードで
history.pushState()
およびhistory.replaceState()
メソッドを使用しない場合は、hashchange
イベントコールバックでurl変更時の論理を記述するだけでよい.一方、historyモードでは、popstate
イベントコールバックでurlの変化を処理するだけでなく、history.pushState()
メソッドとhistory.replaceState()
メソッドでurlの変化を処理する必要があります.またhistoryモードではバックエンドの協力が必要です.そうしないと、ユーザーがページをリフレッシュするのは404しか見られませんか?だからhashモードでは私たちの仕事は実はもっと簡単ですが、どうして今historyモードをお勧めしますか?いつもhashモードのurlが醜いのではありませんて、結局これは顔を見る世界ですか?
しかし
vue-router
ブラウザがpushState()
をサポートしている場合、hashモードでもhistory.pushState()
でurlを変更していますが、何か意味がありますか?まだ研究が必要だ...