• 难点
    1. 众所周知,react是单向数据流,倡导f(data)⇒ UI的哲学, 并不建议过多直接操作dom,但是生成图片的base64格式时使用的ant design charts 要求必须获取ref才可以

    2. 逻辑流转如下图, 兄弟组件b发出按钮click事件后告知a组件去收集自身组件内图标的ref,由于是兄弟组件通信,此处借助了react-redux

      记一次react-hooks项目获取图表图片集合并生成pdf的需求-LMLPHP

    3. a组件获取所有图标ref

      const myRef = useRef()
      
      //每个组件类似于此:
      <BoxPlot ref={handleRefCallback}/>
      
      const handleRefCallback = React.useCallback((dom) => {
            handleRefs(dom)
      }, [])   //此处通过回调来获取ref
      				// 之前,每个charts子组件通过memo浅比较,但是使用了ref之后,memo不再生效,所有此处要通过useCallback来缓存回调函数来实现memo的效果
      // charts子组件:
      const child = React.forwardRef((props,ref) =>{
      		<Box {...config} chartRef={ref} />
      })
      
    4. a通过react-redux获得b组件点击指令后,开始按照3步骤收集dom到ref的current中,存在storage中,由于生成base64的过程是异步的,所以在PageB中无法获取实时的storage. 所以需要在PageB中通过状态锁让页面在跳转的过程中只刷新一次

      兄弟组件b点击时同时生成一个同步的sessionStorage的标记作为在PageB中执行状态锁的依据
      
    5. 生成pdf的代码: html2canvas 和 jspdf

07-16 20:51