vue打開新窗口并實(shí)現(xiàn)傳參的圖文實(shí)例
我要實(shí)現(xiàn)的功能是打開一個(gè)新窗口用來展示新頁面,而且需要傳參數(shù),并且參數(shù)不能顯示在地址欄里面,而且當(dāng)我刷新頁面的時(shí)候,傳過來的參數(shù)不能丟失,要一直存在,除非我手動關(guān)閉這個(gè)新窗口,即瀏覽器的標(biāo)簽頁。
通過面向百度編程,發(fā)現(xiàn)網(wǎng)上的根本達(dá)不到這個(gè)效果,而且還都是坑,明明實(shí)現(xiàn)不了,還若有其事的寫出來,于是我在標(biāo)題特意加上有圖有真相,誠我不欺,實(shí)現(xiàn)不了功能,就不要出來糊弄人。
先把我做好的代碼寫出來,后面再介紹別人實(shí)現(xiàn)不了的坑,以及這方面相關(guān)要注意的。
打開新窗口并傳參代碼
//打開新窗口并傳參,參數(shù)不能顯示在地址欄里面,不關(guān)閉窗口一直刷新,參數(shù)一直有效 handleWindow() { //主要實(shí)現(xiàn)打開新窗口的功能 var route = this.$router.resolve({ name: 'Xterm', }) //主要實(shí)現(xiàn)存儲參數(shù)的功能 sessionStorage.setItem("ip", "1.1.1.1"); window.open(route.href, '_blank') }
我的路由配置,也貼出來好了
{ path: '/xterm', hidden: true, component: () => import('@/views/monitor/xterm/index'), name: 'Xterm', },
現(xiàn)在是頁面接收參數(shù)
//vue的初始化方法,頁面一初始化,就去拿參數(shù) created() { alert(sessionStorage.getItem("ip")); this.ip = sessionStorage.getItem("ip") },
貼個(gè)真相圖
這是通過vue的 打開新窗口,通過sessionStorage傳參拿參數(shù)。為什么只能這么做,才能實(shí)現(xiàn)這個(gè)功能,下面我講一下我的踩坑歷程。群眾里有壞人,拿個(gè)假代碼來網(wǎng)絡(luò)上騙人,哪個(gè)碼農(nóng)經(jīng)不起這樣的考驗(yàn)?
首先這個(gè)功能需要打開新窗口,那么方式有如下3種;
第一種:通過<router-link>
標(biāo)簽,這種標(biāo)簽的寫法我個(gè)人很不中意,對于簡單的業(yè)務(wù)場景還勉強(qiáng)可以,但是我要處理一堆業(yè)務(wù),很多個(gè)參數(shù)的,這種標(biāo)簽的寫法很不利于業(yè)務(wù)拓展。直接排除,OUT!
第二種:通過router.replace
方法,這種方法的打開窗口,是把當(dāng)前A頁面替換成要跳轉(zhuǎn)過去的B頁面,我打開新窗口是想看新東西,這倒好,直接讓我之前的頁面沒了,這不操蛋嘛?在我實(shí)驗(yàn)過后,OUT!
第三種:通過router.resolve
方法,這就是打開新窗口,不影響當(dāng)前A頁面,直接打開一個(gè)瀏覽器標(biāo)簽頁,我可以通過來回切換標(biāo)簽頁,來看兩個(gè)頁面的信息數(shù)據(jù)。這很nice,我中意,就是這個(gè)了。
順帶介紹一下,vue2.0以后,為了和日漸流行的HTML5保持一致,router.go和router.push就不支持新窗口打開的屬性,router.go被用來當(dāng)做前進(jìn)后退了; router.push被用來當(dāng)做導(dǎo)向特殊頁面, 這個(gè)跳轉(zhuǎn),不會打開新窗口,有history功能,如果你一個(gè)窗口有多標(biāo)簽頁的話,可以用這個(gè)來開多個(gè),如圖所示;
好了,使用router.resolve,我們可以跳轉(zhuǎn)到新窗口里,那么現(xiàn)在就開始傳參了,這就到了坑爹的地方了。按照網(wǎng)上的搬運(yùn)來看,主要是如下兩種傳參;
//測試第一種傳參 testA (aaa) { const route = this.$router.resolve({ name: 'Xterm', params: { ip: aaa } }) window.open(route.href,'_blank') } //測試第二種傳參 testA (bbb) { const route = this.$router.resolve({ path: '/xterm', query: { ip: bbb } }) window.open(route.href,'_blank') }
對應(yīng)的接收參數(shù),如下所示;
created() { //測試第一種接參 this.ip = this.$route.params.ip //測試第二種接參 this.ip = this.$route.query.ip },
測試的結(jié)果是,第一種永遠(yuǎn)拿不到值,第二種地址欄里暴露了傳遞的各項(xiàng)參數(shù)值。即使第一種經(jīng)過種種特殊處理,最好的結(jié)果也只是第一次拿到值,再刷新一下頁面,值就丟失了,這怎么行?誰能保證用戶不會覺得有點(diǎn)卡,然后順手去點(diǎn)了刷新按鈕。這種在router.push
里面?zhèn)鲄⑹且稽c(diǎn)問題都沒有,都能接收到,區(qū)別就是name+params組合,參數(shù)不會在地址欄里面,刷新后數(shù)據(jù)會消失;path+query組合傳參,參數(shù)會在地址欄里面,無論怎么刷新頁面,值會一直在。估計(jì)是用push試了以后,理所當(dāng)然的覺得resolve也一樣,我看好多博客里寫的不通過地址欄傳參,使用第一種傳參,然后壓根成功不了,還點(diǎn)擊量賊高,欲哭無淚啊。
沒辦法,只能自己動手了,找了找緩存啥的,發(fā)現(xiàn)localStorage 和 sessionStorage 屬性,sessionStorage 用于臨時(shí)保存數(shù)據(jù),在關(guān)閉窗口或標(biāo)簽頁之后將會刪除這些數(shù)據(jù);localStorage 用于長久保存整個(gè)網(wǎng)站的數(shù)據(jù),保存的數(shù)據(jù)沒有過期時(shí)間,直到手動去刪除。顯而易見,sessionStorage 就可以了。
支持這倆屬性的瀏覽器版本如下所示;
至此,其實(shí)問題就得到解決了,其實(shí),也不復(fù)雜,就是網(wǎng)上答案良莠不齊,記錄一下,以供他人使用。
總結(jié)
到此這篇關(guān)于vue打開新窗口并實(shí)現(xiàn)傳參的文章就介紹到這了,更多相關(guān)vue打開新窗口傳參內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue登錄頁實(shí)現(xiàn)使用cookie記住7天密碼功能的方法
這篇文章主要介紹了vue登錄頁實(shí)現(xiàn)使用cookie記住7天密碼功能的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02vue中解決拖拽改變存在iframe的div大小時(shí)卡頓問題
這篇文章主要介紹了vue中解決拖拽改變存在iframe的div大小時(shí)卡頓問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07vue2和vue3部署到服務(wù)器子目錄為空白頁問題及解決
這篇文章主要介紹了vue2和vue3部署到服務(wù)器子目錄為空白頁問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07表格Table實(shí)現(xiàn)前端全選所有功能方案示例(包含非當(dāng)前頁)
這篇文章主要為大家介紹了表格Table實(shí)現(xiàn)前端全選所有功能,包括非當(dāng)前頁的方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02