vue對IFrame內(nèi)嵌web頁面的緩存實(shí)現(xiàn)過程
1、需求
現(xiàn)有一個(gè)內(nèi)嵌web的頁面,需要解決每次切換時(shí),該頁面展現(xiàn)的還是之前的操作節(jié)點(diǎn),而不是重新刷新。
2、思路
使用keepAlive
查了下資料,在路由的配置頁面使用keepAlive是可以做到緩存的結(jié)果,但是不符合我的需求,既然提到了,就說一下怎么使用吧。
import { RouteRecordRaw } from 'vue-router';
import { Layout } from '@/router/constant';
import { HomeOutlined } from '@vicons/antd';
import { renderIcon } from '@/utils/index';
/**
* @param name 路由名稱, 必須設(shè)置,且不能重名
* @param meta 路由元信息(路由附帶擴(kuò)展信息)
* @param redirect 重定向地址, 訪問這個(gè)路由時(shí),自定進(jìn)行重定向
* @param meta.disabled 禁用整個(gè)菜單
* @param meta.title 菜單名稱
* @param meta.icon 菜單圖標(biāo)
* @param meta.keepAlive 緩存該路由
* @param meta.sort 排序越小越排前
* */
const routes: Array<RouteRecordRaw> = [
{
path: '/home',
name: 'home',
redirect: '/home/index',
component: Layout,
meta: {
sort: 0,
isRoot: true,
activeMenu: 'home_index',
icon: renderIcon(HomeOutlined),
},
children: [
{
path: 'index',
name: `home_index`,
meta: {
title: '首頁',
activeMenu: 'home_index',
keepAlive: true
},
component: () => import('@/views/home/index.vue'),
},
],
},
];
export default routes;在特定位置使用keepAlive,結(jié)合路由地址的配置,例如:
<RouterView v-slot="{ Component, route }" >
<keep-alive v-if="keepAliveComponents.length" :include="keepAliveComponents">
<component :is="Component" :key="route.fullPath" />
</keep-alive>
<component v-else :is="Component" />
</RouterView>keep-alive標(biāo)簽就是把組件緩存起來,它的原理是把需要緩存的頁面的DOM節(jié)點(diǎn)變成VNode存到內(nèi)存中,下次使用時(shí)再將VNode讀取到DOM節(jié)點(diǎn)中實(shí)現(xiàn)了緩存,之所以我的web頁面沒辦法使用是因?yàn)閮?nèi)嵌web頁面使用了IFrame標(biāo)簽,它沒辦法做到這一步。
這里的 keepAliveComponents就是需要緩存頁面的name,這里有個(gè)坑需要踩一下,這里的name不是路由配置中的name,而是.vue的name,vue2中有個(gè)給組件命名的地方:
export default {
name: 'HelloWorldComponent',
data() {
return {
message: 'Hello, World!'
};
}
};這里的HelloWorldComponent就是name值,而我使用的是vue3往往會(huì)忽略這一個(gè)內(nèi)容,所以在測試的時(shí)候出現(xiàn)了錯(cuò)誤,vue3命名方法:
defineOptions({
name: 'HelloWorldComponent'
})緩存的vue頁面只有在第一次加載時(shí)有onMounted會(huì)執(zhí)行,后續(xù)執(zhí)行的是onActivated和onDeactivated方法,keep-alive除了 :include 還有 :exclude 和 :max ,這里的用法不多做敘述。
使用v-show
其實(shí)實(shí)現(xiàn)方法很簡單,只需要把內(nèi)嵌的web頁面,單獨(dú)拿出來,然后使用隱藏就好了,它的原理是我第一次點(diǎn)擊時(shí),加載該頁面,切換其它路由時(shí),我只需要判斷name是否是當(dāng)前路由,將其隱藏起來就行了,它的本質(zhì)是還在,但是沒有達(dá)到條件不可見而已:
<template>
<RouterView v-slot="{ Component, route }" >
<template v-if="!iframeRoute.some(item => item.name === route.name)">
<keep-alive v-if="keepAliveComponents.length" :include="keepAliveComponents">
<component :is="Component" :key="route.fullPath" />
</keep-alive>
<component v-else :is="Component" />
</template>
</RouterView>
<template v-for="item in iframeRoute" :key="item.name">
<IFrame v-show="item.name === currentRoute.name" :frameSrc="item.meta.frameSrc" />
</template>
</template>這里需要注意,要把IFrame相關(guān)的組件從RouterView中剔除出去,多個(gè)IFrame的話就通過 v-for 生成多個(gè)就可以了,是不是很簡單呀!
注意:
這里的IFrame 是封裝的組件,不然直接使用可能會(huì)出現(xiàn)src沖突,導(dǎo)致多個(gè)url共用一個(gè)框架,這樣肯定是不行的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue2?自定義?el-radio-button?的樣式并設(shè)置默認(rèn)值的方法
這篇文章主要介紹了vue2?自定義?el-radio-button?的樣式并設(shè)置默認(rèn)值的操作方法,代碼分為html部分和css修改樣式代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Vue.js中class與style的增強(qiáng)綁定實(shí)現(xiàn)方法
由于Class和Style綁定使用頻繁,字符串拼接麻煩且易錯(cuò),因此,Vue.js 做了專門的增強(qiáng),表達(dá)式結(jié)果的類型除了字符串之外,還可以是對象或數(shù)組,本文給大家講解Vue.js中class與style的增強(qiáng)綁定知識,感興趣的朋友一起看看吧2023-04-04
Vue動(dòng)態(tài)添加屬性到data的實(shí)現(xiàn)
在vue中請求接口中,一個(gè)請求方法可能對應(yīng)后臺兩個(gè)請求接口,所以請求參數(shù)就會(huì)有所不同。需要我們先設(shè)置共同的參數(shù),然后根據(jù)條件動(dòng)態(tài)添加參數(shù)屬性2022-08-08
使用vue實(shí)現(xiàn)簡單鍵盤的示例(支持移動(dòng)端和pc端)
這篇文章主要介紹了使用vue實(shí)現(xiàn)簡單鍵盤的示例(支持移動(dòng)端和pc端),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
vue中使用vue-seamless-scroll插件實(shí)現(xiàn)列表無縫滾動(dòng)效果
這篇文章主要介紹了vue中使用vue-seamless-scroll插件無縫滾動(dòng),支持上下左右無縫滾動(dòng),單步滾動(dòng)停留時(shí)間,以及水平方向的手動(dòng)切換,需要的朋友可以參考下2022-06-06
Vue用Export2Excel導(dǎo)出excel,多級表頭數(shù)據(jù)方式
這篇文章主要介紹了Vue用Export2Excel導(dǎo)出excel,多級表頭數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue如何導(dǎo)出json數(shù)據(jù)為excel表格并保存到本地
這篇文章主要介紹了vue如何導(dǎo)出json數(shù)據(jù)為excel表格并保存到本地問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
創(chuàng)建vue項(xiàng)目沒有router、view的解決辦法
在學(xué)習(xí)vue的時(shí)候遇到很多問題,這里做一些總結(jié),下面這篇文章主要給大家介紹了關(guān)于創(chuàng)建vue項(xiàng)目沒有router、view文件夾的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
vue3+ts+vant移動(dòng)端H5項(xiàng)目搭建的實(shí)現(xiàn)步驟
本文主要介紹了vue3+ts+vant移動(dòng)端H5項(xiàng)目搭建,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

