好程序員web前端分享History API技能詳解,相信學員在寫項目時都會遇到下面這樣的問題:用vant 的tab去換不同的組件,加載不同的數據。點擊的時候,可以跳到對應的頁面。然后返回的時候,轉跳到之前的狀態。可是遇到多頁面的應用,里面的按鈕則需要轉跳其他頁面。
遇到上述情況,相信很多學員想到添加參數作為區分,然后依據參數做判斷。但是一旦添加參數,牽扯的修改內容也會隨之增加很多。因為其他的部分轉跳這個頁面也都需要添加參數。
這個時候,最好的辦法是歷史替換,默認打開不作處理,只有tab切換的時候,做pushstate。下面就介紹在HTML5大前端中: history API 的具體用法。
(一)js/history
可以在不刷新頁面的情況下動態的修改地址欄中的URL地址,動態的修改頁面上所顯示的資源。
window.history 的方法和屬性
方法: back() forward() go()
屬性: length
//返回
window.history.back()
window.history.go(-1)
//向前跳轉
window.history.foward()
window.history.go(1)
//歷史記錄中頁面總數
history.length
(二)HTML5 新方法
添加和替換歷史記錄的條目
pushState
history.pushState(state,title,url): 添加一條歷史記錄,不刷新頁面
state: 一個于指定網址相關的狀態對象,popstate事件觸發時,該對象會傳入回調函數中,如果不需要這個對象,填null
title: 新頁面的標題,但是大多數瀏覽器都會忽略這個值,因此,這里可以填入 null
url: 新網址,必須是同一個域名
history.pushState(null, null,'./demo.html')
缺點: 就是瀏覽器在轉跳的時候,不會檢查 demo.html 是否存在
(三)應用--添加 hash 值,頁面只局部加載
history.pushState(null, null,'#one')
replaceState替換當前的歷史記錄,不刷新頁面
history.replaceState(state,title,url) 替換當前歷史記錄,不刷新頁面
history.replaceState(null, null,'?one')
(四)事件
popstate事件:歷史記錄發生改變時觸發,調用 history.pushState() 或者 history.replaceState(),不會觸發popstate()事件
hashchange事件: 當頁面hash值改變的時候,常用于構建單頁面的應用
按照上面的操作,跳轉頁面問題就可以完美解決。建議你把上面的解決代碼方案自己從頭到尾敲上幾遍,以此確保真正掌握以及遇到相關衍生問題能夠觸類旁通。要知道想要成為一名合格優秀的程序員,需要積累大量實戰經驗,只理解了代碼戰術是遠遠不夠的。
UE是當下最火爆的前端框架之一,vue-router是vue項目中幾乎都會用到的組件,然而體驗一時爽,其實坑不少。本篇經驗將詳細介紹vue-router的兩種mode效果和開發測試環境下的問題,并給出解決方案。
vue-router的HTML5 History 模式,這種模式充分利用 history.pushState API 來完成 URL 跳轉而無須重新加載頁面。
const router=new VueRouter({ mode: 'history', routes: [...] })
當你使用 history 模式時,URL 就像正常的 url,例如 http://yoursite.com/user/id, 就是長這樣的!
不過這種模式要玩好,還需要后臺配置支持。因為我們的應用是個單頁客戶端應用,如果后臺沒有正確的配置,當用戶在瀏覽器直接訪問 http://oursite.com/user/id 就會返回 404,這就尷尬了。
所以,你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。
目前后端服務器有Apache、nginx、原生 Node.js、基于 Node.js 的 Express、Internet Information Services (IIS)、Caddy、Firebase 主機等。
先給一個官方標準版配置的傳送門,請戳這里→ https://router.vuejs.org/zh/guide/essentials/history-mode.html
既然是官方給出的配置,那肯定就會說的很官方咯~
按照官方給出的示例,將道理是成功的,但是官方給出的只局限于這個項目在服務器的根目錄下!
如果你的項目沒有放在根目錄下,那么就是這么的不講道理。
下面是在實際開發中碰到的問題。
我們的后端服務器是nginx,所以按照官方的給出的配置,找到nginx.conf,照抄代碼,修改完后重啟服務器,講道理是成功的。
server { listen 80; server_name oursite.com; location /test/ { alias /usr/local/test/; index index.htm index.html; #上面的就是一些常規配置,下面這個才是重點 try_files $uri $uri/ /index.html; #這里沒有采用官方給出處理404錯誤頁面的方案 #方案一(把所有沒有后綴名的請求如果404都跳轉到index.html,我們沒有采用) #error_page 404 /test/index.html; #方案二(404的方式,不是特別完美。會有瀏覽器留下404的狀態(容易被第三方劫持),以下方式可以避免被第三方劫持!) if (!-e $request_filename) { rewrite ^/(.*) /test/index.html last; break; }//前端全棧學習交流圈:866109386 }//幫助1-3年前端人員 }//突破技術瓶頸,提升思維能力
但是,事實就是這么的不講道理,我們并沒有成功!這就令人很是郁悶了,心中一萬只神獸羊駝,奔騰而過~ 為什么沒有成功呢,都是按部就班做的呀,完全不講道理!
而真相只有一個,那就是~~~
路由文件中的路徑有問題
const router=new VueRouter({ mode: 'history', routes: [ { path: '/test/', component: YourComponent }, { path: '/test/a', component: YourComponent }, { path: '/test/b:x', component: YourComponent } ] })
在路由文件中所有的路徑前面加上服務器下項目所在的文件名即可,當然也包括<router-link>和this.$router.push()中的路徑,不然又是不講道理的。
這只是在nginx服務器下的一種解決方案,至于別的服務器應該也是同理的。
對前端的技術,架構技術感興趣的同學關注我的頭條號,并在后臺私信發送關鍵字:“前端”即可獲取免費的架構師學習資料
知識體系已整理好,歡迎免費領取。還有面試視頻分享可以免費獲取。關注我,可以獲得沒有的架構經驗哦!!
前端開發中,路由管理是一個不可或缺的部分。它決定了頁面如何響應URL的變化,以及如何在不同的頁面組件之間進行切換。在現代前端框架如React、Vue中,路由功能通常由官方提供的庫(如react-router、vue-router)來處理。然而,了解如何實現一個簡單的前端路由可以幫助我們更深入地理解其工作機制,并為實際開發中的路由問題提供更靈活的解決方案。
本文將探討兩種常見的前端路由實現方式:基于Hash模式和基于History模式,并分別提供簡單的代碼示例。
Hash模式利用URL中的hash部分(即#之后的部分)進行路由管理。它的主要優點是兼容性好,即使在沒有JavaScript支持或JavaScript被禁用的情況下,仍然可以通過服務器端的配置實現基本的頁面跳轉。
以下是一個簡單的基于Hash模式的前端路由實現:
class HashRouter {
constructor(app) {
this.app=app;
this.routes={};
this.currentUrl=window.location.hash.slice(1) || '/';
this.bindEvents();
}
bindEvents() {
window.addEventListener('hashchange', this.onHashChange.bind(this));
}
onHashChange() {
this.currentUrl=window.location.hash.slice(1);
this.route();
}
route() {
const routeHandler=this.routes[this.currentUrl] || this.routes['/'];
if (routeHandler) {
routeHandler();
} else {
console.error(`No route handler found for ${this.currentUrl}`);
}
}
register(path, callback) {
this.routes[path]=callback;
}
}
// 使用示例
const app=document.getElementById('app');
const router=new HashRouter(app);
router.register('/', ()=> {
app.innerHTML='<h1>Home Page</h1>';
});
router.register('/about', ()=> {
app.innerHTML='<h1>About Page</h1>';
});
// 初始路由設置
router.route();
History模式使用HTML5的History API來實現路由管理。它允許我們在不刷新頁面的情況下修改URL,從而提供更好的用戶體驗。然而,它需要服務器端的支持,以便在訪問不存在的頁面時返回正確的index.html文件。
以下是一個簡單的基于History模式的前端路由實現:
class HistoryRouter {
constructor(app) {
this.app=app;
this.routes={};
this.bindEvents();
}
bindEvents() {
window.addEventListener('popstate', this.onPopState.bind(this));
}
onPopState(event) {
this.route(event.state);
}
route(state) {
const path=state ? state.path : window.location.pathname;
const routeHandler=this.routes[path] || this.routes['/'];
if (routeHandler) {
routeHandler();
} else {
console.error(`No route handler found for ${path}`);
}
}
navigate(path) {
history.pushState({ path }, null, path);
this.route();
}
register(path, callback) {
this.routes[path]=callback;
}
}
// 使用示例
const app=document.getElementById('app');
const router=new HistoryRouter(app);
router.register('/', ()=> {
app.innerHTML='<h1>Home Page</h1>';
});
router.register('/about', ()=> {
app.innerHTML='<h1>About Page</h1>';
});
// 初始路由設置
router.route();
// 導航到About頁面
router.navigate('/about');
以上兩個示例分別展示了基于Hash模式和History模式的前端路由實現。雖然現代前端框架提供了更為強大和易用的路由解決方案,但理解這些基礎概念仍然對我們構建高效、靈活的前端應用具有重要意義。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。