亚洲国产爱久久全部精品_日韩有码在线播放_国产欧美在线观看_中文字幕不卡在线观看

自己動手實現一個前端路由,自己動手實現路由

前前言

最近工作比較忙,寫的比較慢,當我寫完這一篇準備發布的時候,發現掘金剛好也有一篇關于前端路由的,而且寫的比我詳細,不過辛辛苦苦寫的總不能刪掉吧,再說我的路由風格是純個人思路實現的,所以還是硬著頭皮發了哈。愛掏網 - it200.com

前言

用過現代前端框架的同學,對前端路由一定不陌生, vue, react, angular 都有自己的 router, 那么你對 router 的工作原理了解嗎? 如果還不了解, 那么請跟我一起來手寫一個簡單的前端路由, 順便了解一下.

實現路由的2種方式

  1. hash模式
  2. history模式

缺點:

hash:丑(地址欄要多一個#), 某些特殊場景有坑 ,如微信支付回調

history: 兼容性較差, 直接訪問會400 ,除非后端或者服務器有做處理

基本原理

hash是基于 監聽 hashchange 事件實現的,history 是基于 pushState 和 popState,

實現

由于history兼容性較差,而且實現方式基本沒多大區別,本文就以hash模式來實現,history的實現方式只實現不同的部分。愛掏網 - it200.com

html>
head>
    meta charset="UTF-8">
    title>Documenttitle>
head>
body>
input type="button" onclick="hashPush('index')" value="goto index">
body>
script>
    // 頁面跳轉
    function hashPush(url) {
        location.hash = "#" + url
    }

    // 監聽hash的變動
    window.addEventListener('hashchange', function (e) {
        console.log('當前的hash地址', location.hash.slice(1) || "/")
    })
script>
html>

以上就是hash模式的最簡單實現,查看控制臺,可以看到不管是點擊跳轉按鈕,還是點擊瀏覽器的前進/后退按鈕,控制臺都會輸出當前頁面對應的 'url',有了 'url',我們就可以對內容做條件渲染了

我們在上面的代碼的基礎上,稍作修改一下,增加2個div,一個是login,一個是index

html>
head>
    meta charset="UTF-8">
    title>Documenttitle>
    style>
        body{
            margin: 0;
            padding: 0;
        }
        #login, #index{
            width: 100%;
            height: 100%;
            display: none;
        }

        #login{
            background: #f5f5f5;
            display: block;
        }

        #index{
            background: #aaddff;
        }
    style>
head>
body>


div id="login" class="component">
    input type="button" onclick="hashPush('index')" value="登陸">
div>


div id="index" class="component">
    input type="button" onclick="hashPush('login')" value="退出登陸">
div>

body>
script>

    // 頁面跳轉
    function hashPush(url) {
        location.hash = "#" + url
    }

    // 監聽hash的變動
    window.addEventListener('hashchange', function (e) {
        let url = location.hash.slice(1) || "/"
        console.log('當前的hash地址', url)
        setVisible(url)
    })

    // 顯示跟路由地址對應的內容,隱藏其他內容
    function setVisible(url) {
        let components = Array.from(document.body.querySelectorAll(".component"))
        components.map(item => {
            if(item.id===url) {
                console.log('顯示',item.id)
                item.style.display = 'block'
            } else {
                console.log('隱藏',item.id)
                item.style.display = 'none'
            }

        })
    }
script>
html>

這樣,我們就能根據不同的hash地址,顯示不同的內容,是不是已經有點路由的味道了呢?但是目前還無法傳參,傳參的方式有很多種,最常見最通俗的,應該是query string 了吧? query string 其實很簡單,解析url即可。愛掏網 - it200.com

    // 監聽hash的變動
    window.addEventListener('hashchange', function (e) {
        let url = location.hash.slice(1) || "index"
        // 解析url
        let questionIndex = url.indexOf("?")
        let path, query
        if(questionIndex >= 0){
            path = url.substr(0,questionIndex)
            let queryString = url.substr(questionIndex+1)
            let queryArray = queryString.split("&")
            let queryObject = {}
            queryArray.map(str => {
                let equalIndex = str.indexOf("=")
                if(equalIndex > 0) {
                    let key = str.substr(0,equalIndex)
                    let value = str.substr(equalIndex+1)
                    queryObject[key] = value
                }
            })
            query = queryObject
        } else {
            path = url
            query = {}
        }
        
        console.log('接收到的參數', query)
        setVisible(path)
    })

這樣,我們就能獲取到URL上傳遞的query string , 還順便解決了傳參會導致路由解析不正確的bug.

傳參其實還有個更簡單的方法,就是 設置一個全局變量 param,然后在需要傳值的時候,直接對param 賦值即可

    // 設置一個全局變量
    var param = {}
    // 頁面跳轉
    // 這個多了個參數 args
    function hashPush(url, args) {
        location.hash = "#" + url
        param = args
    }

由于是全局變量,所以可以在任意位置使用 param,不過這樣直接使用全局變量的方式,也有它的弱點,就是點擊返回按鈕的時候無法保存變量,而query string 因為是在 url 里面的,所以返回的時候,可以拿到上個頁面的 query string, 那我們有沒有辦法讓全局變量的方式也能保存上一個頁面的參數呢? 我們來稍微修改一下代碼

    // 設置一個全局變量
    var param = {}
    // 頁面跳轉
    // 這個多了個參數 args
    function hashPush(url, args) {
        location.hash = "#" + url
        // 如果有傳args參數,就在 param 對象下建一個名字跟當前url一樣的對象,并把args賦值給它
        if(args) {
            param[url] = args
        }
    }

那我們在 hashchange 的時候,可以根據url來定位該頁面的參數。愛掏網 - it200.com

    // 監聽hash的變動
    window.addEventListener('hashchange', function (e) {
        // 省略其他代碼
        args = param[path] || {}
        // 省略其他代碼
    })

這樣,我們就初步實現了一個hash路由,那么接下來,我們來看看history路由怎么實現。愛掏網 - it200.com

history 模式

history 模式主要依靠 調用 history.pushState() 方法 和 監聽 popstate 事件。愛掏網 - it200.com

history.pushState() 方法接收3個參數:

  1. 要傳遞的數據(參數)
  2. 給頁面設置的標題(兼容性差,幾乎沒用)
  3. url

我們看看調用實例

    history.pushState({id:1}, '我是頁面標題', url)

需要注意的是 pushState 的時候,并不會觸發 popstate 事件,只有在前進后退的時候,才會觸發,所以 pushState 之后,需要手動去設置頁面的相關狀態。愛掏網 - it200.com如上面的例子,我們需要這樣做

    history.pushState({id:1}, '我是頁面標題', url)
    setVisible(url)

然后監聽 popstate 事件,捕獲 前進/后退

 window.addEventListener('popstate',function (e) {
     // e.state 就是你 pushState 的時候,傳的第一個參數
     let state = e.state || {}  
     let url = state.target.location.pathName
     //  根據參數 做一些其他操作
  })

最后

本文最終實現代碼已經放在 github上,想要直接看效果的同學,可以上去直接copy,運行。愛掏網 - it200.com

如果覺得本文對您有用,請給本文的github加個star,萬分感謝

另外,github上還有其他一些關于前端的教程和組件,有興趣的童鞋可以看看,你們的支持就是我最大的動力。愛掏網 - it200.com


其他鏈接

  1. 用proxy實現一個更優雅的vue
  2. 3行代碼實現一個簡易版promise
  3. vuex其實超簡單,只需3步
  4. vuex其實超簡單,喝完這3步,還有3步
  5. 從零開始徒手擼一個vue的toast彈窗組件
  6. JS中的繼承(上)
  7. JS中的繼承(下)
  8. JS中的原型對象
  9. JS中創建對象的方法
  10. moment太重? 那就試試miment--一個超輕量級的js時間庫
  11. 美團小程序框架mpvue入門教程
  12. 美團小程序框架mpvue(花名:沒朋友)蹲坑指南
  13. 一個基于mpvue的toast彈窗組件mptoast



原文發布時間為:2024年06月29日

本文作者:noahlam

本文來源:掘金?如需轉載請聯系原作者
聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

亚洲国产爱久久全部精品_日韩有码在线播放_国产欧美在线观看_中文字幕不卡在线观看

    
    

    9000px;">

      
      

      国产高清视频一区| 色偷偷久久一区二区三区| 波多野结衣中文字幕一区二区三区 | 日韩三区在线观看| 国产精品综合二区| 国产精品色婷婷久久58| 欧美午夜精品电影| 国产一区二区91| 亚洲你懂的在线视频| 欧美高清视频www夜色资源网| 国产制服丝袜一区| 亚洲精品欧美在线| 欧美一级欧美三级| 成人一区二区在线观看| 亚洲成人免费影院| 国产清纯白嫩初高生在线观看91| 色婷婷综合久久久久中文一区二区| 亚洲一二三级电影| 久久久久久久久97黄色工厂| 欧美又粗又大又爽| 国产精品一区不卡| 亚洲成人黄色影院| 国产亚洲婷婷免费| 欧美高清精品3d| 99久久综合色| 精品一区二区在线观看| 亚洲国产一区二区三区| 亚洲国产精品v| 精品国产乱码久久久久久1区2区 | 成人夜色视频网站在线观看| 亚洲一级二级三级| 国产精品成人一区二区艾草| 91精品国产入口| 在线亚洲精品福利网址导航| 国产成人午夜精品5599 | 成人av一区二区三区| 亚洲成av人片在线观看无码| 最近中文字幕一区二区三区| www国产亚洲精品久久麻豆| 在线播放中文字幕一区| 欧美怡红院视频| 日本二三区不卡| 色哟哟一区二区三区| 91麻豆精品在线观看| 91丨porny丨户外露出| 成人免费毛片片v| av成人动漫在线观看| 91亚洲精品久久久蜜桃网站| 97精品电影院| 在线视频你懂得一区| 欧美在线一区二区三区| 欧美日韩日日骚| 欧美一区二区三区啪啪| 欧美一区午夜精品| 日韩欧美区一区二| 久久―日本道色综合久久| 久久精品日产第一区二区三区高清版 | 中文字幕不卡三区| 精品999在线播放| 久久亚洲精精品中文字幕早川悠里 | 这里只有精品免费| 欧美日韩综合色| 91成人在线精品| 欧美一区二区三区性视频| 欧美在线观看禁18| 色菇凉天天综合网| 91麻豆免费看| 欧洲精品在线观看| 欧美色窝79yyyycom| 91原创在线视频| 一本大道av伊人久久综合| 91在线观看美女| 色婷婷综合久久久久中文一区二区 | 亚洲欧洲精品一区二区三区不卡| 久久久三级国产网站| 久久精品网站免费观看| 国产精品第一页第二页第三页| 欧美国产激情一区二区三区蜜月| 一区二区三区高清在线| 亚洲成人资源在线| 日韩精品91亚洲二区在线观看 | www.成人网.com| 播五月开心婷婷综合| 一本大道久久a久久精品综合| 久久不见久久见免费视频7| 久久99国产精品免费网站| 美女国产一区二区| 狠狠色丁香久久婷婷综合丁香| 国内精品视频一区二区三区八戒| 国产精品白丝jk黑袜喷水| 白白色 亚洲乱淫| 色中色一区二区| 欧美三级日本三级少妇99| 日韩写真欧美这视频| 欧美成人video| 久久久久久久综合日本| 亚洲欧美电影院| 日本91福利区| 秋霞午夜av一区二区三区| 91小视频免费观看| 4438成人网| 亚洲国产精品精华液ab| 一区二区高清在线| 国产在线国偷精品产拍免费yy| 国产电影精品久久禁18| 色婷婷综合激情| 精品国产乱子伦一区| 亚洲黄色片在线观看| 亚洲综合色噜噜狠狠| 91免费小视频| 久久综合精品国产一区二区三区| 亚洲三级在线看| 免费人成精品欧美精品| aaa国产一区| 精品国内片67194| 亚洲免费三区一区二区| 国产一区二区三区在线观看免费 | 久久久久久久久久久久久久久99| 亚洲精品少妇30p| 国模套图日韩精品一区二区| 欧美专区日韩专区| 国产精品的网站| 国产一区激情在线| 欧美一区二区三区免费大片 | 亚洲三级久久久| 国精产品一区一区三区mba视频| 91国偷自产一区二区开放时间| 久久精品在线观看| 六月丁香婷婷色狠狠久久| 欧美日韩专区在线| 亚洲精品你懂的| 成人av在线播放网址| 久久久欧美精品sm网站| 免费视频最近日韩| 欧美日韩的一区二区| 亚洲视频在线一区观看| 粉嫩一区二区三区在线看| 欧美一区二区成人| 丝袜美腿亚洲色图| 777亚洲妇女| 午夜精品福利一区二区蜜股av| 91在线免费看| 亚洲少妇屁股交4| 激情文学综合网| 亚洲欧洲精品成人久久奇米网| 国产成人精品1024| 国产精品每日更新| 不卡高清视频专区| 亚洲欧洲综合另类在线| 99国产精品国产精品毛片| 中文字幕一区二区三区av| 91在线播放网址| 亚洲精品高清视频在线观看| av爱爱亚洲一区| 一级女性全黄久久生活片免费| 91福利国产精品| 午夜欧美大尺度福利影院在线看| 欧美日韩色综合| 六月婷婷色综合| 国产女主播视频一区二区| 9i看片成人免费高清| 亚洲国产成人va在线观看天堂| 成人免费视频app| 国产精品久久777777| 91麻豆国产福利在线观看| 亚洲成av人片在线| 26uuu色噜噜精品一区| 波多野结衣中文字幕一区二区三区 | 日韩午夜电影在线观看| 国产成人8x视频一区二区| 一区二区视频在线| 欧美一卡2卡3卡4卡| 国产精品综合在线视频| 亚洲色图第一区| 99re视频精品| 亚洲成人免费在线| 欧美激情一区二区三区在线| 在线国产电影不卡| 精品一区二区三区日韩| 亚洲欧美日韩一区二区| 欧美成人官网二区| 91天堂素人约啪| 裸体健美xxxx欧美裸体表演| 久久久91精品国产一区二区精品| 色综合久久久网| 国产一区不卡视频| 亚洲成av人片在线观看无码| 国产色一区二区| 正在播放亚洲一区| 91麻豆国产在线观看| 青青草91视频| 亚洲一区二区三区美女| 久久精品亚洲一区二区三区浴池 | 久久久久国产精品厨房| 欧美亚洲高清一区| 国产成人精品三级| 久久av老司机精品网站导航| 亚洲日韩欧美一区二区在线| 久久综合九色综合97_久久久| 色88888久久久久久影院按摩 |