完整业务场景:
    1、单页面,数据很多,有图有表,高度>8000px,且根据所选条件不同内容区高度会变。
    2、有底线,不是无限数据,不是无限滚动。
    3、数据是懒加载的,只有子模块滚动到可视区域才会发送子模块内的请求,加载新数据。
    现在要在上面的业务场景中导出内容区的PDF。

    那么需求就是:
    在一个高度很高,响应式加载数据的网页中导出PDF。

    由于这个导出PDF的需求在开始的时候就知道,所以在实现响应式加载上动了心思,方便后续的PDF导出实现。

    1、首先要实现数据响应式的加载。 用了IntersectionObserver。
    思路:
    类似于骨架屏,没有数据的情况下,也会有初始高度。用IntersectionObserver来实现当子模块区域进入IntersectionObserver的root区域,就发送请求,请求回来后加载数据。

    2、在导出执行前,让所有的请求发出,数据全部加载,内容区完整填充数据。
    思路:
    点击导出PDF时,改变样式,让root元素的高度为auto ,root元素的高度变为auto后,所有骨架区域都会进入root中(因为root也被骨架区域撑开) 这时所有的骨架区域都进入了IntersectionObserver的root区域,开始请求数据,之后加载数据。

    3、判断全部子模块的数据加载完成 (完成之后,才能执行导出PDF)
    思路:
    1.在各个子模块初始化的时候,(发送请求之前)在根模块下注册当前区域信息。
    (
    exportComponentsStatus: {
    componentId1: false,
    componentId2: false,
    }
    )

    2.在子模块中等到请求完成,在将自己的componentId对应的value置为true,当所有的exportComponentsStatus都变为true之后执行导出PDF。
    (
    exportComponentsStatus: {
    componentId1: true,
    componentId2: true,
    }
    )

    3、导出pdf的实现
    html2canvas(html 转 base64图片,需要分段) ;
    jsPDF,将图片放入PDF文件,导出。

    完结