亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS原生一步步實(shí)現(xiàn)前端路由和單頁面應(yīng)用

idealcn / 3149人閱讀

摘要:這里借鑒了一下的處理方式,我們把多帶帶模塊的包裝成一個函數(shù),提供一個全局的回調(diào)方法,加載完成時候再調(diào)用回調(diào)函數(shù)。

前端路由實(shí)現(xiàn)之 #hash

先上github項(xiàng)目地址: spa-routers
運(yùn)行效果圖

背景介紹

用了許多前端框架來做spa應(yīng)用,比如說backbone,angular,vue他們都有各自的路由系統(tǒng),管理著前端的每一個頁面切換,想要理解其中路由的實(shí)現(xiàn),最好的方法就是手動實(shí)現(xiàn)一個。
前端路由有2種實(shí)現(xiàn)方式,一種是html5推出的historyapi,我們這里說的是另一種hash路由,就是常見的 # 號,這種方式兼容性更好。

需求分析

我們這里只是簡單的實(shí)現(xiàn)一個路由輪子,基本的功能包含以下:

切換頁面

異步加載js

異步傳參

實(shí)現(xiàn)步驟

切換頁面:路由的最大作用就是切換頁面,以往后臺的路由是直接改變了頁面的url方式促使頁面刷新。但是前端路由通過 # 號不能刷新頁面,只能通過 window 的監(jiān)聽事件 hashchange 來監(jiān)聽hash的變化,然后捕獲到具體的hash值進(jìn)行操作

//路由切換
window.addEventListener("hashchange",function(){
    //do something 
    this.hashChange()
})

注冊路由:我們需要把路由規(guī)則注冊到頁面,這樣頁面在切換的時候才會有不同的效果。

//注冊函數(shù)
 map:function(path,callback){
   path = path.replace(/s*/g,"");//過濾空格
   //在有回調(diào),且回調(diào)是一個正確的函數(shù)的情況下進(jìn)行存儲 以 /name 為key的對象 {callback:xx}
   if(callback && Object.prototype.toString.call(callback) === "[object Function]" ){
       this.routers[path] ={
            callback:callback,//回調(diào)
            fn:null //存儲異步文件狀態(tài),用來記錄異步的js文件是否下載,下文有提及
        } 
    }else{
    //打印出錯的堆棧信息
        console.trace("注冊"+path+"地址需要提供正確的的注冊回調(diào)")
    }
 }
 
 //調(diào)用方式
 map("/detail",function(transition){
  ...
  })

異步加載js:一般單頁面應(yīng)用為了性能優(yōu)化,都會把各個頁面的文件拆分開,按需加載,所以路由里面要加入異步加載js文件的功能。異步加載我們就采用最簡單的原生方法,創(chuàng)建script標(biāo)簽,動態(tài)引入js。

var _body= document.getElementsByTagName("body")[0],
    scriptEle= document.createElement("script"); 
scriptEle.type= "text/javascript"; 
scriptEle.src= xxx.js; 
scriptEle.async = true;
scriptEle.onload= function(callback){ 
    //為了避免重復(fù)引入js,我們需要在這里記錄一下已經(jīng)加載過的文件,對應(yīng)的 fn需要賦值處理
    callback()
} 
_body.appendChild(scriptEle);     

參數(shù)傳遞:在我們動態(tài)引入多帶帶模塊的js之后,我們可能需要給這個模塊傳遞一些多帶帶的參數(shù)。這里借鑒了一下jsonp的處理方式,我們把多帶帶模塊的js包裝成一個函數(shù),提供一個全局的回調(diào)方法,加載完成時候再調(diào)用回調(diào)函數(shù)。

SPA_RESOLVE_INIT = function(transition) { 
    document.getElementById("content").innerHTML = "

當(dāng)前異步渲染列表頁"+ JSON.stringify(transition) +"

" console.log("首頁回調(diào)" + JSON.stringify(transition)) }

擴(kuò)展:以上我們已經(jīng)完成了基本功能,我們再對齊進(jìn)行擴(kuò)展,在頁面切換之前beforeEach和切換完成afterEach的時候增加2個方法進(jìn)行處理。思路是,注冊了這2個方法之后,在切換之前就調(diào)用beforeEach,切換之后,需要等待下載js完成,在onload里面進(jìn)行調(diào)用 afterEach

        //切換之前一些處理
        beforeEach:function(callback){
            if(Object.prototype.toString.call(callback) === "[object Function]"){
                this.beforeFun = callback;
            }else{
                console.trace("路由切換前鉤子函數(shù)不正確")
            }
        },
        //切換成功之后
        afterEach:function(callback){
            if(Object.prototype.toString.call(callback) === "[object Function]"){
                this.afterFun = callback;
            }else{
                console.trace("路由切換后回調(diào)函數(shù)不正確")
            }
        },

通過以上的思路分析,再加以整合,我們就完成了一個簡單的前端路由,并且可以加到頁面進(jìn)行實(shí)際的SPA開發(fā),不過還是非常簡陋。

完整代碼
/*
*author:https://github.com/kliuj
**使用方法
*        1:注冊路由 : spaRouters.map("/name",function(transition){
                        //異步加載js 
                        spaRouters.asyncFun("name.js",transition)
                        //或者同步執(zhí)行回調(diào)
                        spaRouters.syncFun(function(transition){},transition)
                    })
        2:初始化      spaRouters.init()
        3:跳轉(zhuǎn)  href = "#/name"            
*/
(function() {
    var util = {
        //獲取路由的路徑和詳細(xì)參數(shù)
        getParamsUrl:function(){
            var hashDeatail = location.hash.split("?"),
                hashName = hashDeatail[0].split("#")[1],//路由地址
                params = hashDeatail[1] ? hashDeatail[1].split("&") : [],//參數(shù)內(nèi)容
                query = {};
            for(var i = 0;i

簡單的單頁面在github上有完整的demo
spa-routers

以上僅是我個人的一些看法,如有疑問,感謝指導(dǎo)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/80805.html

相關(guān)文章

  • 基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)

    摘要:原作者原鏈接基于多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)法律聲明警告本作品遵循署名非商業(yè)性使用禁止演繹未本地化版本協(xié)議發(fā)布。這是什么背景現(xiàn)代化的前端項(xiàng)目中很多都使用了客戶端渲染的單頁面應(yīng)用。 原作者:@LinuxerPHL原鏈接:基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn) 法律聲明 警告:本作品遵循 署名-非商業(yè)性使用-禁止演繹3.0 未本地化版本(CC BY-...

    big_cat 評論0 收藏0
  • 基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)

    摘要:原作者原博文地址基于多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)法律聲明警告本作品遵循署名非商業(yè)性使用禁止演繹未本地化版本協(xié)議發(fā)布。這是什么背景現(xiàn)代化的前端項(xiàng)目中很多都使用了客戶端渲染的單頁面應(yīng)用。 原作者:@LinuxerPHL原博文地址: 基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn) 法律聲明 警告:本作品遵循 署名-非商業(yè)性使用-禁止演繹3.0 未本地化版本(...

    Lavender 評論0 收藏0
  • 張腦圖看懂BUI Webapp移動快速開發(fā)框架【上】--框架與工具、資源

    摘要:后續(xù)我們還會增加一些實(shí)戰(zhàn)類的移動開發(fā)案例,歡迎關(guān)注專欄。進(jìn)入官網(wǎng)新版預(yù)覽在線預(yù)覽需要使用開啟設(shè)備模擬,效果更佳。 前言 之前寫過一篇 2018開發(fā)最快的Webapp框架--BUI交互框架 ,如果你還沒看過,可以簡單看一下,主要介紹了BUI的基本功能,有多少控件,以及實(shí)現(xiàn)的思路,BUI 1.5版本以后變化很大,統(tǒng)一新的風(fēng)格,新的規(guī)范750,新增基于Dom的數(shù)據(jù)驅(qū)動,完善了頁面的生命周期等...

    wuyumin 評論0 收藏0
  • SPA那點(diǎn)事

    摘要:單頁面應(yīng)用的出現(xiàn)依然存在著爭議性,我們該如何看待他的兩面性呢接下來小生給大家總結(jié)一下他的優(yōu)缺點(diǎn)。單頁面應(yīng)用的優(yōu)勢無刷新體驗(yàn)沒有了令人詬病的頁面頻繁刷新,同時節(jié)約瀏覽器資源,路由響應(yīng)比較及時,提升了用戶的體驗(yàn)。 前端猿一天不學(xué)習(xí)就沒飯吃了,后端猿三天不學(xué)習(xí)仍舊有白米飯擺于桌前。IT行業(yè)的快速發(fā)展一直在推動著前端技術(shù)棧在不斷地更新?lián)Q代,前端的發(fā)展成了互聯(lián)網(wǎng)時代的一個縮影。而單頁面應(yīng)用的發(fā)展...

    PumpkinDylan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<