Vue中iframe保持活动状态(不刷新)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue中iframe保持活动状态(不刷新)相关的知识,希望对你有一定的参考价值。

参考技术A 前言:

提起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下的index.js

引入iframe页面

路由配置

在router-view页面

  <div id = "index">

    <Header />

    <keep-alive>

      <router-view />

    </keep-alive>

    <!-- iframe page -->

        <component

            v-for="item in hasOpenComponentsArr"

            :key="item.name"

            :is="item.name"

            v-show="$route.path === item.path"

        ></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.$router.options.routes;

        const componentsArr = this.getComponentsArr(routes);

        componentsArr.forEach((item) => 

            Vue.component(item.name, item.component);

        );

        this.componentsArr = componentsArr;

        this.isOpenIframePage();

    ,

    data() 

        return 

          iframeArr:[],

          componentsArr: []

        

    ,

    watch: 

        $route() 

            this.isOpenIframePage();

        

    ,

    computed: 

        hasOpenComponentsArr() 

            return this.componentsArr.filter(item => item.hasOpen);

        

    ,

    methods: 

        isOpenIframePage() 

            const target = this.componentsArr.find(item => 

                return item.path === this.$route.path

            );

            if (target && !target.hasOpen) 

                target.hasOpen = true;

            

        ,

        getComponentsArr(routes)       

             routes.map( it => 

               if(it.iframeComponent)

                 const name = it.name || it.path.replace('/', '');

                 this.iframeArr.push(

                  name: name,

                  path: it.path,

                  hasOpen: false,

                  component: it.iframeComponent

                 )

               

               if(it.children&&it.children.length>0)

                 this.getComponentsArr(it.children)

               

             )   

             return  this.iframeArr

        

    

  

</script>

<style scoped>

</style>                                                   

结语:

文章参看至: https://programmer.help/blogs/keep-alive-no-refresh-for-iframe-in-vue.html

如果大家有好的思路,欢迎交流讨论

vue登录刷新回到首页的问题

参考技术A F5刷新vue重新载入页面,跟路由跳转不同,路由跳转的时候vuex的数据是保留的,页面重载后数据销毁,这时我们想保持登录状态就需要将登录信息如用户信息role、token值保存在cookie或localStorage中,在brforeRouter时根据用户信息来保持登录状态。同时保存在vuex中的动态路由也将因为刷新而失效,为了安全我们不讲路由保存在cookie中,而是通过cookie中的role对路由重新进行挂载。不过这也不安全,暂时搁置

此外在App.vue上,每次重载会构建,刷新回到首页的操作

以上是关于Vue中iframe保持活动状态(不刷新)的主要内容,如果未能解决你的问题,请参考以下文章

Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

vue列表页跳转到列表详情页再返回到列表页, 页面不刷新保持原来的状态

vue tab嵌入iframe切换不刷新,相对完整的方案

Vuex:在不编写 itvuex 的情况下在页面刷新时保持状态?

使用本地存储在引导程序 4 中保持页面刷新的活动选项卡?

vue登录刷新回到首页的问题