新聞中心
這篇文章主要為大家展示了“Vue如何集成Iframe頁面”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Vue如何集成Iframe頁面”這篇文章吧。
創(chuàng)新互聯(lián)長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為萬年企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都做網(wǎng)站,萬年網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
1. 項目需求
我們切換為vue框架是后面的事情,之前還有一些功能頁面是用jsp頁面寫的,而我們的管理系統(tǒng)需要既支持Vue的url,又要支持這些發(fā)布之后的jsp頁面
還有一個就是切換tab回來的時候之前輸入的東西還要存在
系統(tǒng)頁面截圖
2. 實現(xiàn)思路
針對這個問題,我們最開始的實現(xiàn)思路是寫了一個iframe的通用組件,然后把不同的http的頁面的url傳遞進來進行切換,但是這樣不滿足第二條,我們發(fā)現(xiàn)只要切換了vue的路由,然后再切回http的頁面,iframe中的src屬性的頁面就會從新刷新,沒有辦法保留住東西,于是就有了下面的實現(xiàn)思路
我們在vue的router-view同級別添加了一個iframeTemp組件,其實就是一個elementUI的tab組件,然后把tab組件的頭的樣式隱藏在我們菜單欄的下面
/* * IframeTemplate.vue組件的內(nèi)部 **/
之后的ifram組件的顯示隱藏和tab切換,都是通用vuex和bus事件廣播實現(xiàn)的
/* * mainConst.js **/ /*****************************getter常量****************************************/ export const G_GET_NAVTABDATA = 'G_GET_NAVTABDATA' /*****************************mutations常量*************************************/ // 一級tab處理 export const M_PUSH_NAVTABDATA = 'M_PUSH_NAVTABDATA' export const M_DELETE_NAVTABDATA = 'M_DELETE_NAVTABDATA' export const M_UPDATE_NAVTABDATA = 'M_UPDATE_NAVTABDATA' // iframe切換處理 export const M_SHOW_IFRAME = 'M_SHOW_IFRAME' export const M_HIDE_IFRAME = 'M_HIDE_IFRAME' // iframe添加,刪除,選擇處理 export const M_IFRAME_PUSH_TAB='M_IFRAME_PUSH_TAB' export const M_IFRAME_DELETE_TAB='M_IFRAME_DELETE_TAB' export const M_IFRAME_CHANGE_SELECTCODE='M_IFRAME_CHANGE_SELECTCODE' // 設(shè)置全局系統(tǒng)變量 export const M_SET_SYSTEMNAME = 'M_SET_SYSTEMNAME' /*****************************actions常量***************************************/ // export const A_REQUEST_DATA = 'A_REQUEST_DATA'
/* * mainModule.js **/ import * as mainConst from './mainConst.js' export default { state: { // 一級Tab導(dǎo)航數(shù)據(jù)集合 navTabData: [], // 進入的主系統(tǒng)前綴 systemName:'', // 控制路由同級的Iframe的顯示隱藏 showIframe: false, // iframe頁面中的選中頁簽的code值 iframeSelectTab:'', // iframe頁面的tab數(shù)據(jù)集合 iframeTabData:[] }, getters: { [mainConst.G_GET_NAVTABDATA](state, getters){ return state.navTabData } }, mutations: { // 一級tab處理 [mainConst.M_UPDATE_NAVTABDATA](state, payload){ const index = payload.navIndex state.navTabData.forEach((item)=> { item.active = false }) // 當(dāng)你利用索引直接設(shè)置一個項時是不能觸發(fā)視圖的從新渲染的,下面是老方法和解決辦法 // state.navTabData[index].active=true let newItem = Object.assign({}, state.navTabData[index], {active: true}) // console.log(newItem, 'store newItem') state.navTabData.splice(index, 1, newItem) }, [mainConst.M_PUSH_NAVTABDATA] (state, payload) { state.navTabData.push(payload) }, [mainConst.M_DELETE_NAVTABDATA] (state, payload) { state.navTabData.splice(payload.navIndex, 1) }, // Iframe顯示隱藏切換處理 [mainConst.M_SHOW_IFRAME] (state, payload) { state.showIframe = true }, [mainConst.M_HIDE_IFRAME] (state, payload) { state.showIframe = false }, // Iframe添加,刪除,選中處理 [mainConst.M_IFRAME_PUSH_TAB] (state, payload) { state.iframeTabData.push(payload) }, [mainConst.M_IFRAME_DELETE_TAB] (state, payload) { state.iframeTabData = state.iframeTabData.filter(tab => tab.tag !== payload.tag) }, [mainConst.M_IFRAME_CHANGE_SELECTCODE] (state, payload) { state.iframeSelectTab=payload }, // 設(shè)置全局system變量 [mainConst.M_SET_SYSTEMNAME] (state, payload) { state.systemName=payload } }, actions: { // actions的最終功能是修改state,但是它不直接修改state,而是調(diào)用mutations // async [aboutConst.A_REQUEST_DATA]({dispatch,commit}) { // commit(aboutMutations.REQUEST_LOADING) // await service.getMovieListData('{"movieType":"in_theaters","pageIndex":2,"start":0,"count":10}') // console.log(333333) // await function(){setTimeout(function () { // commit(aboutMutations.REQUEST_FAILD) // },6000)}() // console.log(66666) // } // actions的最終功能是修改state,但是它不直接修改state,而是調(diào)用mutations // async [aboutConst.A_REQUEST_DATA]({dispatch,commit}) { // commit(aboutMutations.REQUEST_LOADING) // await service.getMovieListData('{"movieType":"in_theaters","pageIndex":2,"start":0,"count":10}') // console.log(333333) // await function(){setTimeout(function () { // commit(aboutMutations.REQUEST_FAILD) // },6000)}() // console.log(66666) // } } }
/* * 三級菜單的點擊處理 **/
還要添加一個沒用的路由,因為我們的錨記還要發(fā)生變化
/* * iframe/router/index.js */ const systemNamePrefix = "iframe_" import MainContainer from '@/containers/MainContainer.vue' import IframeComponent from '@Iframe/containers/IframeComponent.vue' export default [ { path: '/iframe', component: MainContainer, children: [ {path: ':tag', component: IframeComponent, meta: {requiresAuth: true, keepAlive: true}}, ], meta: {requiresAuth: true} } ]
/* * iframeComponent.vue,一個沒用的vue文件,只是為了讓瀏覽器中的錨記發(fā)生變化 */{{src}}
3. 思考點
雖然這樣和iframe結(jié)合有點惡心,但是可以實現(xiàn)我們的思路
在這個功能的實現(xiàn)中我們用到了bus事件總線的廣播和監(jiān)聽
其實這點我們是可以仔細思考的,因為大量的使用廣播不可控,我們可以完全用vuex去實現(xiàn),這點用了廣播,確實偷懶了
廣播并不是不推薦,而是要使用對場景,這點其實用廣播確實不太好,不利于擴展,誰能猜出來會有哪些擴展?
以上是“Vue如何集成Iframe頁面”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前題目:Vue如何集成Iframe頁面
分享地址:http://fisionsoft.com.cn/article/jgooco.html