蜘蛛上网 2021-10-29 10:59 采纳率: 100%
浏览 49
已结题

vue 单页应用 使用keep-alive 和 router-view 实现缓存路由后 进行路由切换时 出现卡顿

使用keep-alive进行页面缓存,router切换页面的时候,卡顿:当前页面停留了一下,才切换到新页面,请问这是问么回事呢?

并且页面打开一段时间后,路由切换会变得越来越卡,最后甚至卡死

  • 写回答

2条回答 默认 最新

  • 蜘蛛上网 2022-12-06 10:12
    关注

    已解决,针对前端的问题做了优化解决方案

    1、一个页面组件内表格太多,没有拆分为多个组件,这样状态条件切换时,会造成卡顿;

    2、多表格绑定的同一个数据集,数据变化时,会造成多个表格同时渲染,会造成卡顿,影响性能;

    ①②解决方案

    状态tab的切换控制,与表格显示的控制,不要使用同一个变量;

    表格显示的控制使用 v-if

    在状态tab变量watch方法里:

    selectTab:{
        handler(newVal){
            ......
            
            this.表格绑定的数据集变量 = [];  // 先将数据清空
            this.Tab = '-1';  // 然后将控制表格显示的变量变为 -1,也就是所有表格都不会显示
            this.$nextTick(()=>{
                // 待上面的改变渲染完成后,再将控制表格的变量设置为状态切换变量值,然后再执行后端请求查询
                this.Tab = newVal;
                this.query();
            })
        }
    }
    

    3、表格有很多固定列、合计脚会导致降低页面渲染速度;

    解决方法:

    尽量减少固定列和合计脚;配置vxe-table虚拟滚动属性,实现虚拟滚动渲染,会大大提供渲染性能。

    并且,还可以设置表格内容显示不自动换行的属性,来提高渲染性能。

    4、弹出层编辑页面组件,在管理页面里默认被渲染了只是没显示,影响页面渲染显示效率;

    解决方法:

    将v-show改为v-if控制;

    编辑页面组件中,在 beforeDestroy 方法里调用执行 vxe-modal 的 close 方法

    beforeDestroy(){
        this.$refs['vxe-modal ref名称'].close();
    }
    

    5、部门、职员、交易方、港口、国家等下拉选择框,下拉项太多,没有改为输入后再查询显示下拉,影响页面渲染显示效率;

    解决方法:

    下拉选项超过50个的,都应该使用输入后再模糊搜索显示下拉项;

    6、组件内data里定义的数组或对象变量,如果变量内部结构及内部属性值不会变化的,在给该变量赋值时,可使用冻结对象,如下代码,是给组件中职员数组变量 allPer 赋值冻结对象

    原因:一般是数组记录比较多的,属性字段比较多的,不做冻结处理,vue会做处理导致占用大量内存空间

    ⑤⑥ 解决方法:

    管理页面:

    • 条件项中的下拉选项对应数组或对象变量,做冻结处理后再赋值 ;
    • 表格绑定的数据集,做冻结处理后再赋值;

    编辑页面:

    • 表单中下拉选项对应数组或对象变量,做冻结处理后再赋值 ;

    详情页面:

    • 页面所有表格对应的数组,以及一些需要用到的辅助数据,做冻结处理后再赋值 ;

    分析页面:

    • 条件项中的下拉选项对应数组或对象变量,做冻结处理后再赋值 ;
    • 表格绑定的数据集,做冻结处理后再赋值;
    getPer() {
        return this.$dmBaseSet.personData().then((data)=>{
    
            this.allPer = Object.freeze(data.list || []);
    
        })
    },
    

    7、部门、职员、交易方、字典、港口、国家等接口查询数据缓存到前端时,要做优化,接口只返回需要的字段

    不要把所有字段都返回过来;
    优化后,可以减少JS占用内存;
    职员接口:40多个字段
    部门:20多个字段

    8、前端工程使用echarts时,不要在main全局加载到vue对象,要改为在对应页面组件中加载echarts插件去使用,这样可以减少echart占用的内存;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月6日
  • 已采纳回答 12月6日
  • 创建了问题 10月29日

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题