国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深度解析Vue Router原理:實戰(zhàn)指南與實用技巧

這篇具有很好參考價值的文章主要介紹了深度解析Vue Router原理:實戰(zhàn)指南與實用技巧。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大家好,歡迎來到程序視點!

今天跟大家簡單聊聊Router的實現(xiàn)原理,以及我們?nèi)绾稳崿F(xiàn)這樣一個插件。

Vue RouterVue.js官方的路由管理器。它和 Vue.js 的核心深度集成,讓構(gòu)建單頁面應(yīng)用變得易如反掌。關(guān)于Vue Router的使用就不做過多介紹了,大家可以前往Vue Router官網(wǎng)去學(xué)習(xí)哦~

vue-router插件的基本使用

import?Vue?from?'vue'  
import?Router?from?'vue-router'  
Vue.use(Router)  
const?router?=?new?Router({routes:[]})  
export?default?router  
  
import?router?from?'./route'  
new?Vue({  
????render:?h?=>?h(APP),  
????router  
})  

從上述代碼可以看出,router也是作為一個插件去使用的,所以在進行原理實踐時候,我們開發(fā)的就是一個插件。

插件開發(fā)思路

定義一個Router類,用來進行所有的router操作。定義一個install方法,將router掛載到Vue的實例上去。注冊全局組件router-linkrouter-viewrouter-link組件解析為一個a標(biāo)簽,router-view解析為一個div標(biāo)簽,內(nèi)容為當(dāng)前路由對應(yīng)的component。

監(jiān)聽hashchange事件來改變當(dāng)前路由對應(yīng)的component,監(jiān)聽load事件做同樣的事情。

對于嵌套路由而言,在渲染router-view時候,先去判斷當(dāng)前router-view的深度,即當(dāng)前router-view是處在哪個層級,然后在解析routes時候判斷當(dāng)前路由。

如果當(dāng)前路由和routes中某個路由都為'/'根路由,則直接放到路由渲染數(shù)組中,如果當(dāng)前路由不是根路由,并且routes中的某個路由包含當(dāng)前路由,則意味著routes數(shù)組中的這個路由要么是當(dāng)前路由的父路由,要么就是當(dāng)前路由。

然后把routes數(shù)組中的這個路由放到路由渲染數(shù)組中去,放完之后如果還有childrens,遞歸去做就行。

最后得到了一個路由匹配數(shù)組,這個數(shù)組里面包含當(dāng)前路由和當(dāng)前路由的父路由,并且數(shù)組中子路由的下標(biāo)與之前router-view的層級下標(biāo)相等,這樣就能正確的將子路由的component正確的渲染到對應(yīng)的router-view中去了。

譬如當(dāng)前路由表如下:

routes:[  
????{  
????????path:?'/',  
????????component:?()?=>?import?('../views/index.vue')  
????},  
????{  
????????path:?'/second',  
????????component:?()?=>?import?('../views/second.vue'),  
????????childrens:?[  
????????????{  
????????????????path:?'/seconde/article',  
????????????????component:?import?('../view/article.vue')  
????????????}  
????????]  
????}  
]  

此時second組件下有一個router-view,用來渲染子路由——article組件,在app下還有一個父router-view,用來渲染index、second組件,所以此時second組件下的router-view的層級是1(初始化為0)。

如果此時瀏覽器訪問路由 /second/article 時候,觸發(fā)我們的路由匹配方法,遍歷routes數(shù)組和當(dāng)前路由對比,當(dāng)前路由不是根路由,并且包含 /second 路由,所以path為 /second 的選項被push進入路由渲染數(shù)組中,然后此路由還有childrens,進行遞歸,好家伙,當(dāng)前路由和 /second/article 完全相等,所以也被push到了渲染數(shù)組中。

最后我們得到了一個數(shù)組,包含兩個路由選項,父路由下標(biāo)0,子路由下標(biāo)1,之前我們也將router-view做了層級標(biāo)記,這樣就能得到子router-view對應(yīng)渲染的component了。~nice

插件開發(fā)

先來一個cRouter文件夾,下面搞一個index.js,里面就是我們傳統(tǒng)的router使用,上面有,然后再搞一個crouter.js:

import?Link?from?'./cLink'  
import?View?from?'./cView'  
var?Vue  
  
class?cRouter?{  
??constructor(options)?{  
????????this.$options?=?options  
????this.courrentRoute?=?window.location.hash.slice(1)?||?'/'  
????//定義一個響應(yīng)式的路由渲染數(shù)組  
????????Vue.util.defineReactive(this,'routeMap',[])  
????????//?遍歷匹配路由  
????this.initRouterMap()  
????//?初始化route改變事件  
????this.initRouteChange()  
??}  
?  
??initRouterMap(route)?{  
????????let?routes?=?route?||?this.$options.routes  
????????for?(const?routeItem?of?routes)?{  
????????????if?(this.courrentRoute?===?'/'?&&?routeItem.path?===?'/')?{  
????????????????this.routeMap.push(routeItem)  
????????????????return  
????????????}  
  
????????????if?(  
????????????routeItem.path?!==?'/'  
????????????&&?  
????????????this.courrentRoute.indexOf(routeItem.path)?!==?-1)?{  
????????????????this.routeMap.push(routeItem)  
????????????????if?(routeItem.childrens?&&?routeItem.childrens.length?>?0)?{  
????????????????????this.initRouterMap(routeItem.childrens)  
????????????????}  
????????????????return  
????????????}  
????????}  
??}  
  
??initRouteChange()?{  
????window.addEventListener('hashchange',?this.routeChange.bind(this))  
????window.addEventListener('load',?this.routeChange.bind(this))  
??}  
  
??routeChange()?{  
????????this.courrentRoute?=?window.location.hash.slice(1)  
????????this.routeMap?=?[]  
????this.initRouterMap()  
??}  
}  
  
function?install(_Vue)?{  
??Vue?=?_Vue  
  
??Vue.mixin({  
????beforeCreate()?{  
??????if?(this.$options.crouter)?{  
????????Vue.prototype.$crouter?=?this.$options.crouter  
??????}  
????},  
??})  
  
??Vue.component('router-link',?Link)  
  
??Vue.component('router-view',?View)  
}  
  
export?default?{  
??cRouter,  
??install,  
}  

cview.js用來渲染router-view

export?default?{  
????render(h)?{  
????????//?將自身標(biāo)記為一個router-view,避免和其他元素搞混  
????????this.$vnode.data.routerView?=?true  
????????let?parent?=?this.$parent  
????????//默認(rèn)自己層級為0  
????????let?routeDeep?=?0  
  
????????while(parent)?{  
????????????//?判斷是否存在父元素并且父元素有值  
????????????const?vodeData?=?parent.$vnode?&&?parent.$vnode.data  
????????????if?(vodeData)?{  
????????????????//?如果父router-view是true,則自身層級增加  
????????????????if?(vodeData.routerView)?{  
????????????????????routeDeep++  
????????????????}  
????????????}  
????????????//繼續(xù)尋找父元素,進行遞歸  
????????????parent?=?parent.$parent  
????????}  
  
????????let?component?=?null  
????????const?route?=?this.$crouter.routeMap[routeDeep]  
????????if?(route)?{  
????????????component?=?route.component  
????????}  
????????return?h(component)  
????}  
}  

cLink.js用來渲染router-link

export?default?{  
????props:?{  
????????to:?{  
????????????type:?String,  
????????????default:?'/',  
????????},  
????},  
????render(h)?{  
????????return?h(  
????????????'a',  
????????????{?attrs:?{?href:?`#${this.to}`?}?},  
????????????this.$slots.default  
????????)  
????}  
}  

文章到這里,我們簡單實現(xiàn)了類似vue aouter路由的功能~

我想說的是:如今開源框架大大方便了我們的開發(fā)效率,但是單純的使用三方框架并不能讓我們學(xué)到更多知識我們應(yīng)該是研究去探索他的實現(xiàn)原理以及設(shè)計理念,去思考如果讓我們設(shè)計一個框架,我們需要掌握哪些知識,該如何設(shè)計? 我想,這樣的學(xué)習(xí)才能學(xué)到更多的知識~文章來源地址http://www.zghlxwxcb.cn/news/detail-617998.html

到了這里,關(guān)于深度解析Vue Router原理:實戰(zhàn)指南與實用技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vscode中如何快速生成vue3模板-非常實用的小技巧

    vscode中如何快速生成vue3模板-非常實用的小技巧

    在vue項目開發(fā)過程中,我們會發(fā)現(xiàn)我們每次新建一個vue組件文件的時候,都需要寫一些重復(fù)的代碼,比如下面代碼: 在vscode編輯器中,那有沒有什么辦法能夠讓我們快速生成這樣的模板呢,答案是有的! 如果覺得對你有幫助的話還望點個贊 + 收藏一下,希望能夠幫助到更多

    2024年02月15日
    瀏覽(95)
  • 【實用技巧】用Vue.js實現(xiàn)智能家居控制系統(tǒng)的前端交互,提高系統(tǒng)的穩(wěn)定性

    作者:禪與計算機程序設(shè)計藝術(shù) 【實用技巧】用Vue.js實現(xiàn)智能家居控制系統(tǒng)的前端交互,提高系統(tǒng)的穩(wěn)定性 1.1. 背景介紹 隨著科技的快速發(fā)展,智能家居系統(tǒng)越來越受到人們的青睞。智能家居系統(tǒng)不僅能夠提高人們的生活質(zhì)量,還能節(jié)約能源、降低家庭開支。然而,智能家

    2024年02月15日
    瀏覽(98)
  • Elasticsearch權(quán)威指南:深度解析搜索技術(shù)核心概念、原理及實踐

    作者:禪與計算機程序設(shè)計藝術(shù) 2010年,當(dāng)時僅僅30歲的Elasticsearch創(chuàng)始人黃文堅就率先發(fā)布了開源分布式搜索引擎Elasticsearch。從此, Elasticsearch 名揚天下,成為了當(dāng)前搜索領(lǐng)域的翹楚。隨著 Elasticsearch 的快速崛起,越來越多的人開始關(guān)注并應(yīng)用 Elasticsearch 來進行搜索服務(wù)。

    2024年02月10日
    瀏覽(25)
  • 安全之劍:深度解析 Apache Shiro 框架原理與使用指南

    安全之劍:深度解析 Apache Shiro 框架原理與使用指南

    在現(xiàn)代軟件開發(fā)中,安全性一直是至關(guān)重要的一個方面。隨著網(wǎng)絡(luò)攻擊和數(shù)據(jù)泄露的不斷增加,我們迫切需要一種強大而靈活的安全框架來保護我們的應(yīng)用。Shiro框架就是這樣一把利劍,它能夠輕松地集成到你的項目中,為你的應(yīng)用提供可靠的安全性保護。 Apache Shiro是一個強

    2024年04月09日
    瀏覽(23)
  • 大模型落地實戰(zhàn)指南:從選擇到訓(xùn)練,深度解析顯卡選型、模型訓(xùn)練技、模型選擇巧及AI未來展望---打造AI應(yīng)用新篇章

    大模型落地實戰(zhàn)指南:從選擇到訓(xùn)練,深度解析顯卡選型、模型訓(xùn)練技、模型選擇巧及AI未來展望---打造AI應(yīng)用新篇章

    早期階段(1950s~1980s) 在1950年代初期,人們開始嘗試使用計算機處理自然語言文本。然而,由于當(dāng)時的計算機處理能力非常有限,很難處理自然語言中的復(fù)雜語法和語義。隨著技術(shù)的發(fā)展,自然語言處理領(lǐng)域在20世紀(jì)60年代和70年代取得了一些重要的進展。例如,1970年,美國

    2024年04月09日
    瀏覽(21)
  • Vue 路由指南:暢游單頁應(yīng)用的地圖(Vue Router 和 <router-view>)

    Vue 路由指南:暢游單頁應(yīng)用的地圖(Vue Router 和 <router-view>)

    ?? 前端開發(fā)工程師(主業(yè))、技術(shù)博主(副業(yè))、已過CET6 ?? 阿珊和她的貓_CSDN個人主頁 ?? 牛客高級專題作者、在??痛蛟旄哔|(zhì)量專欄《前端面試必備》 ?? 藍橋云課簽約作者、已在藍橋云課上架的前后端實戰(zhàn)課程《Vue.js 和 Egg.js 開發(fā)企業(yè)級健康管理項目》、《帶你從入

    2024年02月08日
    瀏覽(18)
  • chrome-實用技巧

    chrome-實用技巧

    重發(fā)請求,這有一種簡單到發(fā)指的方式 選中 Network 點擊 Fetch/XHR 選擇要重新發(fā)送的請求 右鍵選擇 Replay XHR ?但是經(jīng)過實際使用調(diào)研,發(fā)現(xiàn)它只適用于axios或類似方式使用xhr api,則XHR仍在重放,但是,如果使用新的api fetch,則需要使用其他方法,如下: ?此方式還可以直接修改

    2024年02月05日
    瀏覽(89)
  • Greenplum實用技巧

    gp_segment_id是表中的隱藏列,用來標(biāo)記該行屬于哪個segment節(jié)點。因此可以基于該隱藏列進行分組查詢,獲取每個segment的記錄數(shù),從而判斷表數(shù)據(jù)的分布是否均勻或有傾斜。 gp_segment_configuration是一張系統(tǒng)表,它維護包括master、standby在內(nèi)的所有節(jié)點信息。是DBA了解集群最直觀的

    2024年02月11日
    瀏覽(98)
  • Pandas實用技巧

    Pandas實用技巧

    首先我們需要先提前下載好 示例數(shù)據(jù)集 : drinksbycountry.csv : http://bit.ly/drinksbycountry imdbratings.csv : http://bit.ly/imdbratings chiporders.csv : http://bit.ly/chiporders smallstockers.csv : http://bit.ly/smallstocks kaggletrain.csv : http://bit.ly/kaggletrain uforeports.csv : http://bit.ly/uforeports 有時你需要知道正在使用的

    2024年02月10日
    瀏覽(101)
  • AI繪畫高效實用技巧

    AI繪畫高效實用技巧

    如何調(diào)整整體占畫面比例的問題 首先看看主要鏡頭類型: 廣角鏡頭 (10mm至35mm) 拍全身 標(biāo)準(zhǔn)鏡頭 (35mm至85mm) 半身照 特寫鏡頭 (85mm至300mm) 抓細節(jié) 以全畫幅135為例: 20mm以下的稱之為超廣角鏡頭 21mm~40mm焦距稱之為廣角鏡頭 41mm~60mm焦距稱之為標(biāo)準(zhǔn)鏡頭 61mm~100mm焦距稱之為中焦鏡頭

    2024年02月11日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包