最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 滚动懒加载

    正文概述 掘金(Doggy)   2021-06-27   485

    项目背景

    长报表页面,页面内有多个ECahrts图表和表格

    项目技术栈:Vue2 + TypeScript

    需求目标

    当组件进入浏览器视窗时才发送HTTP请求从后端获取数据,以减轻服务器并发压力

    技术实现

    基本原理

    利用IntersectionObserver监听DOM元素是否进入浏览器viewport

    IntersectionObserver文档

    给每个组件实例设置监听器,当组件实例进入视窗时,执行回调发送HTTP请求

    核心代码

    //监听器类
    class LazyOprationInToView {
      //观察者实例
      private observer: null | IntersectionObserver = null
      //是否已处于观察状态
      private isObservered = false
      //重新观察
      public reobserve() {
        //处于未观察状态时才执行
        if (!this.isObservered && this.observer) {
          this.observer.observe(this.element)
          this.isObservered = true
        }
      }
      //销毁观察者实例
      public dispose() {
        if (this.observer) {
          this.observer.disconnect()
          this.observer = null
          this.isObservered = false
        }
      }
    
      /**
       * @param callback 执行的回调函数
       * @param element 监测的DOM元素
       */
      constructor(private callback: (...args: any) => void, private element: HTMLElement) {
        //创建观察者实例
        this.observer = new IntersectionObserver((changes) => {
          //元素处于可见区域才执行
          if (changes[0].intersectionRatio > 0) {
            this.callback()
            if (this.observer) {
              //取消对DOM元素的观察
              this.observer.unobserve(this.element)
              //已处于未观察状态
              this.isObservered = false
            }
          }
        }, {
          //当DOM元素与视窗产生重叠时立即触发
          threshold: 0
        })
        //检测DOM元素
        this.observer.observe(this.element)
        //已处于观察状态
        this.isObservered = true
      }
    }
    
    export {
      LazyOprationInToView
    }
    
    

    LazyOprationInToView类的使用

    为了在组件各个option中访问LazyOprationInToView类的实例,在.vue组件顶层作用域内声明lazyOprationInToViewInstances作为指针

    <script lang="ts">
    const lazyOprationInToViewInstances: Record<string, LazyOprationInToView> = {}
    </script>
    

    组件的mounted生命周期钩子内(此时组件实例已挂载,可通过this.$el获得组件DOM)创建监听器实例

    mounted() {
      lazyOprationInToViewInstances[this.timeStamp.toString()] = new LazyOprationInToView(this.refreshChartInstances, this.$el as HTMLElement)
    }
    

    相对应的,在beforeDestroy生命周期钩子内销毁实例

    beforeDestroy() {
      lazyOprationInToViewInstances[this.timeStamp.toString()].dispose()
    }
    

    当某些状态值变更时,组件旧有的数据失效,需要重新发HTTP请求

    watch: {
      select() {
        lazyOprationInToViewInstances[this.timeStamp.toString()].reobserve()
      }
    }
    

    演示地址

    滚动懒加载


    起源地下载网 » 滚动懒加载

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元