前⾔
最近⼀个需求,需要在 Vue 项⽬中加⼊ 含有iframe 的页⾯,同时在路由切换的过程中,要求iframe的内容 不会被刷新 。⼀开始使⽤了Vue⾃带的keep- alive发现没有⽤,于是⾃⼰研究了⼀下解决⽅案。。。。。。Vue的keep-alive原理
要实现对保持iframe页的状态。我们先搞清楚为什么Vue的keep-alive不能凑效。keep-alive原理是把组件⾥的节点信息保留在了 VNode (在内存⾥),在需要渲染时候从Vnode渲染到真实DOM上。iframe页⾥的内容并不属于节点的信息,所以使⽤keep-alive依然会重新渲染iframe内的内容。 另外 ,我也尝试有过想法:如果把整个iframe节点保存起来,然后需要切换时把它渲染到⽬标节点上,能否实现iframe页不被刷新呢?————也是不可⾏的,iframe每⼀次渲染就相当于打开⼀个新的⽹页窗⼝,即使把节点保存下来,在渲染时iframe页还是刷新的。实现的思路
既然保持iframe页⾥的状态很难实现,在这个时候我想到了⼀个别的⽅法。能否在Vue的route-view节点上动点⼿脚?使得在切换 ⾮iframe页 的时候使⽤Vue的路由,当切换 iframe页 时则使⽤ v-show 切换显⽰与隐藏,使得iframe节点 ⼀直不被删除,这样就能保持iframe的状态了。
我们简陋的实现⼀下以上的效果,上代码:⼊⼝main.js:
import Vue from 'vue/dist/vue.js'import App from './App.vue'
import VueRouter from 'vue-router';
const Index = { template: '
// 含有iframe的两个页⾯ {
path: '/f1', name: 'f1' },
// 含有iframe的两个页⾯ {
path: '/f2', name: 'f2' }, {
path: '/index',
component: Index }]
const router = new VueRouter({ routes});
Vue.use(VueRouter);new Vue({
render: h => h(App), router
}).$mount('#app')
根组件:
上⾯代码简单来说,关键的地⽅⾸先是main.js初始化路由时,对iframe页不填写属性component,这样页⾯就是空⽩的。然后在 router-view 节点旁边渲染iframe页组件,使⽤$route.path判断当前路由的指向,控制iframe页的 显⽰与隐藏 。上⾯代码简单的解决了问题,但还有⼀些地⽅可以优化:
1. iframe页在根节点App.vue⼀渲染时 已经渲染 了,对此iframe页可以做成 懒加载 ,只有在进⼊过相应页⾯了触发渲染,并且渲染过之后就⽤v-show切换显⽰与隐藏
2. 每当增加⼀个iframe页都要增加⼀段的组件引⼊注册和调⽤的代码。⽐较 繁琐 。我们⽬标应该做到每增加⼀个iframe页,只需要添加尽量少的代码。这⾥思路是:
1. 在路由配置中定义⼀个属性,⽤于 标识该页⾯是否含有iframe 的页⾯2. 根据标识,iframe页组件 ⾃动动态注册和渲染 ,⽆需再⼿写额外的代码
3. router-view和iframe切换的逻辑封装成 新组件 ,⽤它 替代原有的router-view我们先修改router的配置,增加⼀个属性名iframeComponent,⽤于标识是否包含iframe,该属性的值是组件⽂件引⽤main.js:
import F1 from './components/f1';import F2 from './components/f2';
const routes = [ {
path: '/f1', name: 'f1',
iframeComponent: F1 // ⽤于标识是否含有iframe页 }, {
path: '/f2', name: 'f2',
iframeComponent: F2 // ⽤于标识是否含有iframe页 }, {
path: '/index',
component: { template: '
const router = new VueRouter({
routes // (缩写)相当于 routes: routes});
new Vue({
render: h => h(App), router
}).$mount('#app')
接下来我们第⼆步和第三步结合在⼀起,封装新的组件iframe-router-view.vue:
v-show=\"$route.path === item.path\" >
1. 该组件主要做的是根据main.ja⾥的routes⽣成⼀个只含有iframe页的数组对象。
2. watch上监听$route,判断当前页⾯在iframe页列表⾥的话就设置hasOpen属性为true,渲染该组件
3. ⽤v-show=\"$route.path === item.path\"切换iframe页的显⽰与隐藏。逻辑并不复杂,这⾥就不多赘述。结语
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务