长页面多模块调接口优化

背景:

查询近3年数据之类的,接口就会有大量数据需要查询做聚合,因此接口响应较慢。同时前端页面有大量不同维度展示的图表,渲染阻塞时间过长,用户体验较差,长时间loading,导致无法交互。因此前端做了一个懒加载功能。

实现:

1. 首先控制图表宽高固定,多次查询只触发重绘,修改数据即可,减少重排

具体实现:

表格宽高固定,内容做文字超出隐藏,显示省略号。

2. 页面接口当滚动到可视区域时再进行调用,且来回滚动不会重复调用。

利用 IntersectionObserver监听指定元素需要出现在可视区域

具体实现:

// elementArray:是需要监听的页面dom元素组,建议使用一个div包裹住需要监听的dom元素
// callback: 是回调函数
const monitorVisualArea = (elementArray, callback) => {
    // 创建JS交叉观察函数
    var observer = new IntersectionObserver((mutaions) => {
        // 创建IntersectionObserver对象
        if (mutaions[0].isIntersecting) {
            // 传入参数并调用回调函数,这个参数根据自己的需要定义
            callback(mutaions[0].target.id)
        }
    });
    for (let i = 0; i < elementArray.length; i++) {
        // 需要监听的元素
        observer.observe(elementArray[i]);
    }
}

// 放到vue的原型链上,就可以使用 this.$monitorVisualArea 调取该方法
Vue.prototype.$monitorVisualArea = monitorVisualArea

获取需要监测的dom集合,传入 callback 方法,实行自己需要的动作:

// 尽量将需要监测的元素起一个相同的class或者用一个特殊class 的div包裹 document.querySelector(".xxx").children
const elementArray = document.querySelector(".table-part");
this.$monitorVisualArea(elementArray, this.loadHandler)


methods: {
    loadHandler(id) {
      // 如果不包含该id,就push进去 并调取对应初始化的接口
      if(!this.list.includes(id)) {
        this.list.push(id)
        this[`load${id}`]()
      }
    },
}

用了一个懒方法,将loadData方法拼接了容器对应的id,这样判断到没有加载过就push进去记录,再调用对应方法,若重复滚动判断到push过该id,也就不会重复调用了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值