Vue利用History記錄上一頁面的數(shù)據(jù)方法實(shí)例
前言
本文主要介紹的是Vue利用History記錄上一頁面數(shù)據(jù)的相關(guān)內(nèi)容,vue使用history后,能夠使得url更加漂亮,也就是不再有‘#'的問題,下面話不多說了,來一起看看詳細(xì)的介紹吧
UI


需求
從列表頁的第二頁進(jìn)入詳情頁,返回時(shí)列表頁仍然顯示在第二頁;
從列表頁的第二頁進(jìn)入詳情頁,返回時(shí)列表頁的篩選條件仍然存在。
<!--more-->
技術(shù)選擇
- 使用vue-router組件,通過
this.$router.push({path: path, query: query});方式,將頁碼和選擇條件作為參數(shù)存儲(chǔ)在url中,這種方式在上面的UI設(shè)計(jì)中是可行的,但是當(dāng)列表頁中包含tab組件時(shí)(分頁組件是公用的),會(huì)因?yàn)閜ush的因素(因?yàn)閜ush會(huì)打開新頁面)導(dǎo)致一些問題(PS:也可能是本人技術(shù)能力的原因),未實(shí)現(xiàn)。 - 使用History API(HTML5開始支持),通過history.replaceState方式,將頁碼作為參數(shù)存儲(chǔ)在url中,將選擇條件存儲(chǔ)在history中(尚不清楚數(shù)據(jù)具體是存儲(chǔ)在哪里);通過
location.hash方式獲取頁碼;通過history.state方式獲取存儲(chǔ)的選擇條件。
具體實(shí)現(xiàn)--技術(shù)選擇2
開關(guān)
為分頁組件添加一個(gè)開關(guān)(openroute),因?yàn)樾枰叶壬暇€,萬一有問題,要調(diào)整的頁面也只有一個(gè)。代碼如下:
<script>
export default {
props: {
openroute: {
type: Boolean,
default: () => (true)
}
},
}
</script>
分頁組件中存儲(chǔ)頁碼和選擇條件&獲取頁碼
<script>
export default {
methods: {
fetchData(page) {
//請(qǐng)求參數(shù)
let params = this.params;
//請(qǐng)求頁碼
let newPage;
//openroute處理
if (this.openroute) {
//為url添上#page
if (page) {
history.replaceState(params.data, document.title, "#" + page);
} else {
if (history.state) {
if (!history.state.key && location.hash && location.hash.split("#") && location.hash.split("#")[1]) {
if (JSON.stringify(history.state) !== JSON.stringify(params.data)) { //選擇條件變更則請(qǐng)求第一頁
history.replaceState(params.data, document.title, "#1");
} else {
history.replaceState(params.data, document.title, "#" + location.hash.split("#")[1]);
}
} else {
history.replaceState(params.data, document.title, "#1");
}
} else {
if (location.hash && location.hash.split("#") && location.hash.split("#")[1]) {
history.replaceState(params.data, document.title, "#" + location.hash.split("#")[1]);
} else {
history.replaceState(params.data, document.title, "#1");
}
}
}
//獲取url后面的#page
if (location.hash && location.hash.split("#") && location.hash.split("#")[1]) {
newPage = Number(location.hash.split("#")[1]);
} else {
newPage = 1;
}
} else {
newPage = page;
}
//請(qǐng)求數(shù)據(jù),獲得結(jié)果,傳遞給列表頁面
}
}
}
</script>
列表頁面獲取選擇條件
目前可能是因?yàn)榭蚣茉O(shè)計(jì)的問題,沒法在請(qǐng)求數(shù)據(jù)之前通過Object.assign方式為替換初始變量,所以先這樣處理(笨方法,各位大佬有解決辦法麻煩指導(dǎo)下,謝謝):
<script>
export default {
data() {
return {
form: {
aaa: (history.state && history.state.aaa) ? history.state.aaa : null,
bbb: (history.state && history.state.bbb) ? history.state.bbb : null,
ccc: (history.state && history.state.ccc) ? history.state.ccc : null
},
};
}
};
</script>
已解決,初始變量不需要?jiǎng)?,可以通過以下方式實(shí)現(xiàn):
created(){
//獲取緩存的數(shù)據(jù)
if (history.state) {
Object.assign(this.form, history.state)
if (this.form.key) {
delete this.form.key
}
}
},
這里記錄下:之前以為created方法是在分頁組件的watch監(jiān)聽之后執(zhí)行的,后來發(fā)現(xiàn)被誤導(dǎo)了(因?yàn)橹笆峭ㄟ^Object.assign(true, this.form, history.state)方式實(shí)現(xiàn)數(shù)據(jù)賦值的,但是并沒有成功)。下面做個(gè)小總結(jié):
Object.assign(true, a, b);”和“Object.assign(a, b);”有什么區(qū)別?
結(jié)論:前者:改a不影響b;后者:改a影響b
分析(這篇文章有源碼分析( <font color='red'>求解答:WebStorm中如何關(guān)聯(lián)源碼?</font>),很棒):
m.fzitv.net/article/150037.htm...
FAQ
- 需要使用
history.replaceState方式是因?yàn)椋核粫?huì)將更改后的url壓到history棧中,所以不會(huì)增加回退和前進(jìn)的操作步數(shù); - 使用
history.replaceState方式,可存儲(chǔ)的state大小不能操作640k; - 可能存在瀏覽器兼容性問題,請(qǐng)從此處查閱:https://caniuse.com/#feat=his...。
Demo Or Source
因?yàn)槭枪卷?xiàng)目,所以目前沒有Demo或源碼
參考文章
Manipulating the browser history
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 解決vue router使用 history 模式刷新后404問題
- 在nginx上部署vue項(xiàng)目(history模式)的方法
- 詳解如何去除vue項(xiàng)目中的#——History模式
- 詳解Vue路由History mode模式中頁面無法渲染的原因及解決
- 詳解如何將 Vue-cli 改造成支持多頁面的 history 模式
- Vue下路由History模式打包后頁面空白的解決方法
- vue router嵌套路由在history模式下刷新無法渲染頁面問題的解決方法
- Vue-router 中hash模式和history模式的區(qū)別
- vue router下的html5 history在iis服務(wù)器上的設(shè)置方法
- vue下history模式刷新后404錯(cuò)誤解決方法
相關(guān)文章
基于el-table實(shí)現(xiàn)行內(nèi)增刪改功能
這篇文章主要介紹了基于el-table實(shí)現(xiàn)行內(nèi)增刪改功能,用過通過操作按鈕點(diǎn)擊刪除或者編輯功能即可實(shí)現(xiàn)相應(yīng)的效果,下面小編給大家分享實(shí)例代碼感興趣的朋友跟隨小編一起看看吧2024-04-04
el-table表格動(dòng)態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并)
工作時(shí)遇到的el-table合并單元格的需求,本文主要介紹了el-table表格動(dòng)態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Vue項(xiàng)目引入translate.js國際化自動(dòng)翻譯組件的方法
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目引入translate.js國際化自動(dòng)翻譯組件的相關(guān)資料,除了基本的文本翻譯功能之外,jstranslate還提供了一些高級(jí)功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Vue實(shí)現(xiàn)騰訊云點(diǎn)播視頻上傳功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue實(shí)現(xiàn)騰訊云點(diǎn)播視頻上傳功能的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
vue3+element-plus暗黑模式切換動(dòng)畫圓弧過渡效果
文章介紹了如何在Vue 3和Element Plus中實(shí)現(xiàn)暗黑模式的切換,并通過動(dòng)畫和圓弧過渡效果提升用戶體驗(yàn),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
Vue中this.$router和this.$route的區(qū)別及push()方法
這篇文章主要給大家介紹了關(guān)于Vue中this.$router和this.$route的區(qū)別及push()方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
一文讀懂vue動(dòng)態(tài)屬性數(shù)據(jù)綁定(v-bind指令)
這篇文章主要介紹了vue動(dòng)態(tài)屬性數(shù)據(jù)綁定(v-bind指令)的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Vue3除了keep-alive還有哪些實(shí)現(xiàn)頁面緩存詳解
Vue3中的keep-alive組件用于緩存頁面,以便在切換頁面時(shí)保留其狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Vue3除了keep-alive還有哪些實(shí)現(xiàn)頁面緩存的相關(guān)資料,需要的朋友可以參考下2024-04-04

