电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何制作自己的原生JavaScript路由

瀏覽:3日期:2023-06-04 18:13:02
前言

當你想到路由時,通常會想到類似react之類的庫。但實際上,這些庫和框架仍然使用vanillaJavaScript。那么該怎么實現呢?

我希望這個“JavaScript路由教程”能夠幫你了解如何用原生js寫出自己的路由。

簡介

我遇到了很多出于各種原因想要自己創建路由的人。既然你看到本文,那意味著你可能也是其中的一個!

最重要的是,使用vanillajsrouter可以減少你對框架的依賴。

只要你了解實現它所涉及的所有部分,就可以相對容易的在原生 JavaScript 中創建自己的路由。

以下是制作自己的JS router時要了解的關鍵事項:

1.原生 JS 路由的關鍵是location.pathname屬性。

2.偵聽 “popstate”事件以響應.pathname的更改。每當在瀏覽器的地址欄中輸入新的 URL,但我們不想刷新頁面時,就會發生這種情況,我們只是想通過加載新內容來刷新視圖。

3.你可以選擇將路由存儲在routes[]數組中。

4.必須用JavaScript 正則表達式(RegEx)才能解析 URL。

5.如果希望將路由集成到本機瀏覽器體系結構中,那么對history和history.pushState(JavaScript 的 History API)的基本了解至關重要。

首先,我們將處理 History API。

JavaScript 的 History API

我看過很多沒有提到 JavaScript History API 的vanilla JS router教程。太糟糕了,因為單擊瀏覽器的“后退”和“前進”按鈕與瀏覽歷史記錄中的 URL 導航有關。如果沒有 History API,就無法談論路由。

1.history.back()與history.go(-1)相同,或者當用戶在瀏覽器中單擊Back按鈕時。你可以用任何一種方法達到相同的效果。

2.當用戶按下瀏覽器的Forward按鈕時,將執行history.forward(),它等效于history.go(1)”。

3.go()與.back()和forward()方法相似,不同之處在于你可以指定瀏覽器歷史記錄棧中要前進或后退的步數。 。

4.pushState()會將新狀態推送到 History API。

5..length屬性是會話歷史記錄中的元素數。

6..state屬性用于查找狀態,而無需偵聽“ popstate”事件。

實現自己的原生JS路由基于 History API 的 Vanilla JS 路由設置

先讓我們仔細研究構建 URL 切換器所需的最少代碼(而無需刷新頁面),然后我會向你展示其的工作方式的 GIF 動圖。

<html> <head><title>Hello</title><script type = 'module'> function select_tab(id) {// remove selected class from all buttonsdocument.querySelectorAll('.route').forEach(item => item.classList.remove(’selected’));// select clicked element (visually)document.querySelectorAll('#' + id).forEach(item => item.classList.add(’selected’)); } function load_content(id) {// Update text 'Content loading for {id}...'// Of course, here you would do you content loading magic// Perhaps run Fetch API to update resourcesdocument.querySelector('#content').innerHTML = ’Content loading for /’ + id + ’...’; } function push(event) {// Get id attribute of the box or button or link clickedlet id = event.target.id;// Visually select the clicked button/tab/boxselect_tab(id);// Update Title in Window’s Tabdocument.title = id;// Load content for this tab/pageloadContent(id);// Finally push state change to the address barwindow.history.pushState({id}, `${id}`, `/page/${id}`); } window.onload = event => {// Add history push() event when boxes are clickedwindow['home'].addEventListener('click', event => push(event))window['about'].addEventListener('click', event => push(event))window['gallery'].addEventListener('click', event => push(event))window['contact'].addEventListener('click', event => push(event))window['help'].addEventListener('click', event => push(event)) } // Listen for PopStateEvent (Back or Forward buttons are clicked) window.addEventListener('popstate', event => {// Grab the history state idlet stateId = event.state.id;// Show clicked id in console (just for fun)console.log('stateId = ', stateId);// Visually select the clicked button/tab/boxselect_tab(stateId);// Load content for this tab/pageloadContent(id); });</script><style> * { /* global font */font-family: Verdana;font-size: 18px; } #root { display: flex; flex-direction: row; } #content { display: flex;display: block;width: 800px;height: 250px;/* vertically centered text */line-height: 250px;border: 2px solid #555;margin: 32px;text-align: center; } .route {cursor: pointer;justify-content: center;width: 150px;height: 50px;/* vertically centered text */line-height: 50px;position: relative;border: 2px solid #555;background: white;text-align: center;margin: 16px; } .route.selected { background: yellow; }</style> </head> <body><section id = 'root'> <section id = 'home'>/home</section> <section id = 'about'>/about</section> <section id = 'gallery'>/gallery</section> <section id = 'contact'>/contact</section> <section id = 'help'>/help</section></section><main id = 'content'>Content loading...</main></body></html>

核心是對的window.history.pushState({id}, ${id}, /page/${id});調用;

第一個參數是狀態的唯一 ID,第二個是“標簽標題”文本,第三個參數是你希望地址欄中要現實的路徑。這就是使瀏覽器無需重新加載頁面即可更改 URL 的原因。

結果。現在,每次我們單擊按鈕時,URL實際上都會在瀏覽器的地址欄中更改。內容框也會更新。

我們的原生 JS 路由開始運行了。請注意,每次單擊按鈕時,history.pushState 被觸發。我們只需將存儲在元素的 id 屬性中的 clicked 元素的 id 傳遞給它即可:home,about,gallery等。它們應與你要導航到的實際頁面一致。當然這不是存儲頁面名稱的唯一方法,例如可以用 array [] 或其他任何方式。這就是本例中的操作方式。

當然我們還需要從服務器加載有關該位置的布局和資源的內容。這取決于你的程序。可以是任何東西。

使“后退”和“前進”按鈕起作用

通過使用history.pushState,你將自動使Back和Forward按鈕導航到上一個或下一個狀態。這樣做會產生popstate事件。這是你必須再次更新視圖的部分。 (第一次是我們單擊按鈕時。)

但是由于該事件帶有單擊的id,因此單擊Back或Forward時很容易刷新視圖并重新加載內容。

我們在這里沒有使用react或vue,因此在我的源代碼中load_content將負責直接在 DOM 中更新視圖。此區域可能填充了你的 API 加載的某些內容。由于這只是“前端”示例,因此我無法向你展示太多內容。但這就是它在客戶端上的工作方式。

初始化服務器端的路由負載

將它們放在一起還需要再執行一個步驟。在我的例子中,只用了router.html。當你第一次在 PWA 中加載此路由時,必須確保如果直接在地址欄中輸入/page/home時,它可以工作。

到目前為止,我們僅從前端更改了路由器地址。假定每次你導航到出現在路由按鈕上的 URL 時,實際上都會從服務器單獨加載該 URL。

因此你有責任確保/page/about將路由器和頁面的加載到應用程序的根視圖中。它還應突出顯示“current”按鈕。

實施完畢后,你的路由就完成了。你如何選擇重新加載#content元素中的內容完全取決于你自己和你的后端設計。

以上就是如何制作自己的原生JavaScript路由的詳細內容,更多關于制作原生JavaScript路由的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 上海盐水喷雾试验机_两厢式冷热冲击试验箱-巨怡环试 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 无水硫酸铝,硫酸铝厂家-淄博双赢新材料科技有限公司 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 同步带轮_同步带_同步轮_iHF合发齿轮厂家-深圳市合发齿轮机械有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 上海办公室装修_上海店铺装修公司_厂房装潢设计_办公室装修 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 宜兴紫砂壶知识分享 - 宜兴壶人| 宏源科技-房地产售楼系统|线上开盘系统|售楼管理系统|线上开盘软件 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 期货软件-专业期货分析软件下载-云智赢| 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 周口风机|周风风机|河南省周口通用风机厂 | 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 |