vue项目关于iframe嵌套的页面,在切换tab标签时会被重新刷新的问题处理方案

这篇具有很好参考价值的文章主要介绍了vue项目关于iframe嵌套的页面,在切换tab标签时会被重新刷新的问题处理方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.需求

这两天工作中遇到一个这样的需求,切换tab标签时,要求对应的tab页面不刷新,但是项目中加入了一部分含有iframe的页面,在切换路由的过程中,如果使用keep-alive是达不到缓存ifram嵌套的页面效果的。

2.使用keep-alive缓存不了iframe界面的原因

  • vue中的keep-alive

1>.原理:vue 的缓存机制并不是直接存储 DOM 结构,而是将 DOM 节点抽象成了一个个 VNode节点。因此,Vue 的 keep-alive 缓存也是基于 VNode节点 而不是直接存储 DOM 节点。在需要渲染的时候从Vnode渲染到真实DOM上。

2>.参数:Keep-alive 组件提供了 include 和 exclude 两个属性,允许组件有条件的进行缓存。
include: 字符串或正则表达式。只有匹配的组件会被缓存。
exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。

3>.iframe中keep-alive机制失效原因:iframe页里的内容并不属于节点的信息,所以使用keep-alive依然会重新渲染iframe内的内容。而且iframe每一次渲染就相当于打开一个新的网页窗口,即使把节点保存下来,在渲染时iframe页还是刷新的

3. vue中实现iframe内容缓存的思路

  • 保存iframe页里的节点信息我们很难去操作,这个时候我们就该想是否能在vue的route-view节点上动些手脚。
  • 我们可以在切换不含iframe的界面时使用vue路由,在切换含iframe页的界面时利用v-show来控制显示隐藏,使iframe的节点不被删除,以此来防止界面节点被重新更新,从而达到保存iframe节点数据的效果。

4. 解决步骤:

综上所述,主要思路就是利用v-show去控制对应tab的iframe显示隐藏,使iframe的节点不被删除,以此来防止界面节点被重新更新,从而达到iframe页面的缓存效果。

  • iframe页面对应的路由配置:如下:
  {
    path: '',
    component: Layout,
    redirect: 'indexNew1',
    hidden: true,
    children: [
      {
        path: 'indexNew1',
        component: (resolve) => require(['@/views/indexNew1'], resolve),
        meta: { title: ''}
      },
    ]
  },
  // 在这里需要找到Layout文件中对应的<router-view>

-根据上面的路由配置,找到了对应的layout组件中的router-view的引用,即appMain.vue页面文章来源地址https://www.toymoban.com/news/detail-442323.html

<template>
  <section class="app-main" :class="this.$route.path=='/tinyApp/tinyAppRate'?'app1':''">
    <transition name="fade-transform" mode="out-in">
      <keep-alive>
		// 这里加载的就是正常的vue页面
        <router-view v-if="this.$route.path!=='/indexNew1'" />
      </keep-alive>
    </transition>
    // 针对iframe嵌套的页面需要将封装的iframe组件引入,因为是多个嵌套的页面,所以这里需要循环生成
    <iframe-index 
      v-show="$route.query.id==item.id"
      v-for="item of tabSetList"
      :key="item.id"
      :newSrc="item.baseUrl"
    ></iframe-index>
    //这里的tabSetList数组就是你点击某菜单对应的此菜单信息的iframe相关属性
    //因为tab有删除功能,所以不能用下标做key值
  </section>
</template>
<script>
// 引入iframe组件
import iframeIndex from "@/views/indexNew1.vue";
export default {
  name: 'AppMain',
  components:{
    iframeIndex
  },
  data(){
    return{
      tabList:[],
      tabSetList:[],
    }
  },
  watch:{
    $route(){
      console.log('Rouer ------ ',this.$route)
    },
    //这里是根据我项目的需求写的具体逻辑,不用参考
  	'$store.state.tagsView.sceneViews'(newVal){
      this.tabList = [...newVal]
      this.tabSetList = this.tabList.filter((currentValue, currentIndex, selfArr) =>{
        return selfArr.findIndex(x =>x.name === currentValue.name) === currentIndex
      });
	}
  },
}
</script>
  • 封装一个对应的iframe显示的组件
// 这里只是放了部分代码 具体逻辑根据对应的需求添加即可
<template>
    <div class="dashboard-editor-container">
        <div style="width: 100%" class="itemflex-div">
          <iframe
            :src="newSrc"
            class="iframemain"
            allowfullscreen="true"
            id="iframeId"
          ></iframe>
        </div>
    </div>
</template>
<script>
export default {
  props:{
    newSrc:{
      type:String,
      default:''
    }
  },
};
</script>
  • 综上所述,就是实现多iframe嵌套页面在切换tab时可以缓存对应页面的信息
  • 注意:因为tab一版包括删除功能,所以在循环iframe组件时对应的key值不能用数组下标,取一个唯一值即可,这里我取的是id

到了这里,关于vue项目关于iframe嵌套的页面,在切换tab标签时会被重新刷新的问题处理方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iframe嵌套页面传值

    前言:         最近负责的项目大部分都是在别人的网站中通过iframe标签嵌套我方页面,而且项目没有使用近年来流行的框架,所以在本文中的代码只是基于js进行编写。 一、父向子传值         方法一:通过src拼接上需要传递的参数         父页面         子页面  

    2024年01月21日
    浏览(29)
  • vue实现弹出框内嵌页面展示,添加tab切换展示实时加载

    最近做业务的时候,发现产品的原型图上有一个弹出框,上面包含了两个窗口要进行切换。 每个窗口都有分页列表展示、搜索、添加和删除,感觉就是两个完整的页面,如果全写在一个页面会很麻烦,还可能会出现一系列的问题,后期改起来比较麻烦,所以我就准备分开来写

    2024年02月16日
    浏览(28)
  • 前端Vue自定义验证码密码登录切换tabs选项卡标签栏标题栏 验证码登录模版 密码登录模版

    前端Vue自定义验证码密码登录切换tabs选项卡标签栏标题栏 验证码登录模版 密码登录模版, 请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13221 效果图如下: 实现代码如下: 使用方法 HTML代码实现部分 组件实现代码

    2024年02月11日
    浏览(44)
  • iframe框架一个页面中嵌套到另外一个页面

    在一个页面中嵌套另外一个页面,就要使用到框架iframe 标签。iframe 标签规定一个内联框架。一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。 基本语法 : 举例 :  运行浏览器后得到的效果如图   以上例子展示了iframe的用法,在浏览器执行后,iframe有个默认的高宽,

    2024年02月09日
    浏览(47)
  • vue3项目利用iframe展示其他页面

    iframe是html内联框架元素,它能够将另一个 HTML 页面嵌入到当前页面中。 主要属性如下: src 被嵌套的页面的 URL 地址 name 框架名称 scrolling 否要在框架内显示滚动条。值; auto(仅当框架的内容超出框架的范围时显示滚动条)、yes、no width iframe的宽度 height iframe的高度 frameborde

    2024年02月12日
    浏览(36)
  • iframe嵌套其它网站页面及相关知识点详解

    在开发过程中会遇到需要 在一个页面中嵌套另外一个页面,就要使用到框架 标签,然后指定src就可以了。 基本语法: 用法举例: 运行后效果图: 但是我们需要更好看点的iframe. 我们来看看在iframe中还可以设置些什么属性 属性 值 frameborder 是否显示边框,1(yes),0(no) height 框架

    2024年02月02日
    浏览(28)
  • h5|web页面嵌套iframe传参给cocosCreator

    目录 一、快速浏览 二、详细实现与项目代码 三、安全性评估——iframe 实现效果: 一、快速浏览 在h5页面中,使用JavaScript获取需要传递的参数,如下: 使用iframe嵌入cocosCreator游戏页面,同时将参数作为url的query string传递,如下: 在cocosCreator游戏页面中,使用JavaScript获取ur

    2024年02月02日
    浏览(28)
  • element-ui tab标签禁止切换

    给el-tabs标签设置style=“pointer-events: none;” 注意:每个el-tab-pane标签也要加上style=\\\"pointer-events: auto;\\\"否则各个页面的所有鼠标事件都会失效 HTML JS

    2024年02月11日
    浏览(34)
  • uniapp 左右滑动切换页面并切换tab

    实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换,并且下方内容要实现纵向滚动 ,所以需要swiper,swiper-item,scroll-view组合使用 tab栏部分  tab栏点击切换,需要重新调取数据 下方内容部分 滑动切换,改变上方tab栏状态,并重新调取数据 以上即可实现页面左

    2024年02月13日
    浏览(31)
  • [vue] 嵌套iframe,$router.go(-1)后退bug

    问题 :更改iframe中src值后导致的路由跳转混乱,多次更改iframe的src属性后,调用router.go(-1),不能实现路由后退上一级 原因 :还是在于通过ifream.src赋值,因为域相同,还是会向window.history中插入一条历史记录 之前的代码 解决办法 去掉 :src=\\\"url\\\" ,增加 this.$refs.iframe.contentWin

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包