vue中iframe页面还能使用全局的一些变量吗

vue中iframe页面还能使用全局的一些变量吗,第1张

vue中iframe页面还能使用全局的一些变量吗:

vue中iframe页面还能使用全局的一些变量。

在iframe页面中有诸多跳转,当完成玩iframe页面中一些 *** 作时,此时点击浏览器的回退功能,那么恭喜你中奖了,你回退的是iframe页面,并无法回退和iframe无关联的vue页面,一直点击浏览器的回退,可能会一直重复iframe连接的几个页面,或直接404,或空白。

一个网站用iframe,嵌入另一个网站vue的url能嵌入的。建议使用微前端嵌套,或者将需要嵌套的页面打包好后再嵌套。因为是两个vue项目,现在菜单系统的vue项目使用iframe来嵌入另一内容vue项目。登录得到的token不能共享。解决思路:使用postMessage把菜单项目的token传递给内容vue项目。

因为上面的横向导航什么的都是homevue页面的内容,而iframe是另一个页面的内容,点击那个页面的表格列 *** 作中的录入会进入的iframe的及上图2,然后点击三级横向菜单,可进行iframe的内容切换每一个后台模块都是单独团队开发的。并且几个系统整体的风格、布局一样的,包括左侧边栏,上方的面包屑等

用户在使用的时候,可能要切换别的系统就要在浏览器里,新打开窗口,再输入网址,回车。

总结来说,低效,所以现在想将几个系统融合到一个里边,并且每次切换系统的时候保留用户的 *** 作。因为每个页面都需要这个切换功能,所以我们直接在appvue里开发。我是用vue+element开发的,所以切换的地方直接用了ele的tab切换组件。(写法有很多种,主要是思路)

读完这些话再看代码,方便理解:

1如果用v-if控制每个iframe的显示隐藏,那么切换后系统后,再切换回来,iframe的属性会使 页面会刷新,用户的 *** 作不能保留

2如果纯粹用elementUi的tab组件来做,页面一进来,就会把每个系统的资源加载进来,卡的要命,所以需要做到按需加载

3 实现:结合1、2问题,用v-if控制页面一进来,只加载一个默认的系统;tab切换的时候再利用v-if去加载该系统的资源;v-if只控制一次,不会随着tab的切换变化,这样就能保证切换系统时保留了用户的 *** 作。新建了iframevue文件,里面套iframe标签,通过地址的参数不同,跳转不同的iframe页面,但是在做切换时,会导致iframe页面重载,利用了keep-alive 只是对非iframe页面作用,iframe页面没有作用。

因为keep-alive不是简单地隐藏的,它只会保留组件实例对象,但Dom已经没有了。所以你要让iframe不刷新,就必须让iframe隐藏,所以要把iframe与其它页面分开对待。

经过咨询别人和查资料,在路由配置中通过参数来判断该路由是否由iframe来展示,meta: { iframe: true }

然后在页面显示这里,通过判断 metaiframe 来决定是显示 router-view 还是 iframe 页面。通过这种指向同一个iframe组件的方法测试之后iframe页面切换时依然会重载。在页面上查找元素时发现就是一个iframe在切换时会不断的销毁和重建,每次都是新的iframe导致会重载。这就找到了问题出现的原因。

方法

在点击侧边栏的时候去动态创建iframe标签,不用同一个组件,通过控制多个iframe的显示隐藏解决在页签之间切换的时候刷新重载的问题。这样就是每个都是独立的,互不影响。

在这里插入描述

点击左侧时,动态创建iframe标签

在这里插入描述

当然这样就会存在问题,点击多次左侧打开多个iframe,多个iframe就会堆到一起。这时需要根据判断地址栏路由和tagview中打开的选项visitedViews遍历子项比较判断即可。

大致方向是这样,踩了很多坑,下面可能还会有一些小问题,比如点击关闭tagview时需要去移除掉关闭项的iframe,不然也会出现一些问题。

自从用饿了么框架重构项目以来,遇到 很多问题,我都有一一记录下来,现在特喜欢这个框架,说实话,如果你是用了vue这个技术栈的话,一定要用饿了么的pc端框架哦,遇到问题的时候在网上百度一下,就能找到解决方案,还有很多社区可以讨论,社区文档都比较成熟,很容易上手~~

开发相关资料文档:

Element UI手册: >

前言:

提起vue的缓存,大家第一时间想到的一定是keep-alive,但是了解keep-alive缓存原理的都知道是将节点信息保留在VNode中的组件中(在内存中),并在需要渲染时从VNode渲染到真实DOM。iframe页面中的内容不属于该节点的信息,因此使用keep-alive仍会重新呈现iframe中的内容。但公司很多的项目涉及报表,报表都是以iframe的形式渲染的。

解决思路:

既然keep-alive只对节点信息有缓存,可以考虑在Vue的route-view节点上做点什么吗?切换非iframe页面时,它利用Vue路由;切换iframe页面时,它利用v-show切换显示和隐藏,这样就不会删除iframe节点,从而可以保持iframe状态。

做法:

router下的indexjs

引入iframe页面

路由配置

在router-view页面

  <div id = "index">

    <Header />

    <keep-alive>

      <router-view />

    </keep-alive>

    <!-- iframe page -->

        <component

            v-for="item in hasOpenComponentsArr"

            :key="itemname"

            :is="itemname"

            v-show="$routepath === itempath"

        ></component>

    <Footer />

  </div>

</template>

<script>

  import Header from '@/views/homePage/homePage_Header'

  import Footer from '@/views/homePage/homePage_Footer'

  import Vue from 'vue'

  export default {

    name: "index",

    components : {Header,Footer},

    created() {

      const routes = this$routeroptionsroutes;

        const componentsArr = thisgetComponentsArr(routes);

        componentsArrforEach((item) => {

            Vuecomponent(itemname, itemcomponent);

        });

        thiscomponentsArr = componentsArr;

        thisisOpenIframePage();

    },

    data() {

        return {

          iframeArr:[],

          componentsArr: []

        }

    },

    watch: {

        $route() {

            thisisOpenIframePage();

        }

    },

    computed: {

        hasOpenComponentsArr() {

            return thiscomponentsArrfilter(item => itemhasOpen);

        }

    },

    methods: {

        isOpenIframePage() {

            const target = thiscomponentsArrfind(item => {

                return itempath === this$routepath

            });

            if (target && !targethasOpen) {

                targethasOpen = true;

            }

        },

        getComponentsArr(routes) {      

             routesmap( it => {

               if(itiframeComponent){

                 const name = itname || itpathreplace('/', '');

                 thisiframeArrpush({

                  name: name,

                  path: itpath,

                  hasOpen: false,

                  component: itiframeComponent

                 })

               }

               if(itchildren&&itchildrenlength>0){

                 thisgetComponentsArr(itchildren)

               }

             })   

             return  thisiframeArr

        }

    }

  }

</script>

<style scoped>

</style>                                                   

结语:

文章参看至: >

Vue的iframe标签实际上就是HTML的iframe标签,使用HTMLiframe标签进行多次引用同一个Vue组件,使用Vue提供的属性prop和事件event等可实现子父组件间的双向数据绑定,实现逻辑复用。但需要注意每一个iframe标签都会新建一个独立的vue实例,因此需要注意数据隔离问题。此外,为了避免组件更新不及时的问题,我们需要监听内嵌iframe标签的load事件,等待组件加载完成后再进行 *** 作,确保数据更新及时。

<iframe  class="bottom" v-bind:src=thisrt></iframe>

data中定义contents

后续需要就给contents赋值就行

   thiscontents= thisfive_paramspendingURL+responseorderToken+'&id='+thisfive_paramsid

Vue中的iframe的src后面的参数可以通过拆解来实现多个请求。拆解参数的方式有很多,比如可以通过URL查询字符串,或者使用JavaScript中的URLSearchParams API来解析参数。此外,还可以使用Vue的vue-router库来解析参数,这样可以更加方便地实现多个请求。

以上就是关于vue中iframe页面还能使用全局的一些变量吗全部的内容,包括:vue中iframe页面还能使用全局的一些变量吗、一个网站用iframe,嵌入另一个网站vue的url能嵌入吗、iframe嵌套vue页面不能切换等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9580159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存