天天看點

vue-router的原理和實作

我之前寫了一半了,居然又沒見了就離譜,從頭開始。

vue-router的原理和實作

vue-router是實作了前端路由,也就是url和ui之間的映射關系,當url改變時會引起ui更新,但無需重新整理頁面。那麼如何實作前端路由呢,也就是如何解決這兩個問題:

如何改變url但是頁面不進行重新整理

如何知道url變化了

然後就引出hash和history兩種實作方式解決上面兩個問題。

hash是url中#後面那一部分,改變url中的hash部分不會引起頁面重新整理,通過監聽hashchange可以知道url的變化,改變hashurl的方式有如下幾種:

通過浏覽器前進後退改變url

vue-router的原理和實作

通過a标簽改變url

通過window.location改變url

然後監聽hash的變化是hashchange

那麼我們來簡單的實作一下hash去改變url并且直接更新ui。

vue-router的原理和實作

然後我們可以發現,當url改變的時候,ui界面确實發生了更新,但是整個界面并沒有重新渲染。冰狗,完美完成任務。

history改變url的方法有如下兩種:

pushstate,改變url後可以記錄之前到過的url

replacestate,不會記錄之前到過的url

history監聽url改變的方法popstate事件,它的特點如下:

通過浏覽器前進後退改變url時會觸發popstate事件

通過pushstate/replacestate或a标簽改變url不會觸發popstate事件

可以通過攔截pushstate和replacestate的調用和a标簽的點選事件來監聽url的改變

通過js調用history的back,go,forward方法可以觸發該事件

既然懂了,那就讓我們來完美的實驗一下如何用history完成前端路由:

vue-router的原理和實作

(ps:id選擇器可以直接擷取,然後是拿到了window上面

自己做一個vue的插件,還是很特别的,首先我們知道使用vue-router的話我們是如下這樣簡單使用的:

因為使用到new去new一個vuerouter,是以可以把它當作一個類,其次用到了vue.use(),是以必須要有install方法,那我們來寫一個簡單的:

歐克,寫完了,鳴金收兵。hhh,開玩笑的。

然後我們知道vue-router有許多的内置方法,如push,go,replace等等。這些等之後整理好了再來看。