react-to-print插件封装及打印注意事项

简单封装一下这个插件:

import React, { useState } from 'react';
import ReactToPrint from 'react-to-print';
import { CustomButton } from '../CustomButton/CustomButton';
import { useEffect } from 'react';
import { isEmpty } from 'lodash';

export const withoutTabStyle = { paddingTop: '10px', paddingBottom: '40px' };
interface ICustomReactToPrint {
    printShow: boolean;
    myRef: any;
    onBeforePrintGetContent?: () => void;
    onAfterPrintFinish?: () => void;
    containerStyle?: React.CSSProperties;
    containerStyle2?: React.CSSProperties;
    triggerPrintFlag?: number;
    privatePrintBtnClick?: () => void;
    buttonName?: string;
    buttonType?:string;
}
export const CustomReactToPrint = (props: ICustomReactToPrint) => {
    const {
        onBeforePrintGetContent,
        onAfterPrintFinish,
        privatePrintBtnClick,
        myRef,
        buttonName='打印',
        printShow = true,
        containerStyle,
        containerStyle2,
        triggerPrintFlag = 0, // 是否手动触发点击事件(打印按钮不使用CustomReactToPrint插件时使用)
        buttonType='link'
    } = props;
    const [isShow, setIsShow] = useState<boolean>(true);
    const [CustomReactToPrintRef, setCustomReactToPrintRef] = useState<any>(null);
    // 手动触发CustomReactToPrint插件的打印
    const onPrintClick = () => {
        CustomReactToPrintRef.handleClick();
    }
    useEffect(() => {
        setTimeout(() => {  triggerPrintFlag && !isEmpty(CustomReactToPrintRef) && onPrintClick(); }, 20);
    }, [triggerPrintFlag, CustomReactToPrintRef])
    useEffect(() => {  setIsShow(printShow); }, [printShow])
    return (
        <>
            <div style={{ visibility: privatePrintBtnClick ? undefined : 'hidden', ...containerStyle }}>
                {isShow && <CustomButton type={buttonType} onClick={privatePrintBtnClick}>{isShow&&buttonName}</CustomButton>}
            </div>
            <div style={{ 
                visibility: (isShow && !privatePrintBtnClick)  ? undefined: 'hidden', ...containerStyle2}}>
                <ReactToPrint
                    ref={ref => setCustomReactToPrintRef(ref)}
                    trigger={() => {
                        return <CustomButton type={buttonType} onClick={() => { }}>{isShow?buttonName:''}</CustomButton>
                    }}
                    content={() => myRef}
                    onBeforeGetContent={() => {
                        setIsShow(false);
                        // 打印前隐藏打印按钮
                        onBeforePrintGetContent && onBeforePrintGetContent();
                    }}
                    onAfterPrint={() => {
                        setIsShow(true);
                        onAfterPrintFinish && onAfterPrintFinish();
                    }}
                    removeAfterPrint={true}
                />
            </div>
        </>
    );
};

打印功能弹窗=>

const renderBtn = () => {
 return [
    <CustomReactToPrint
          containerStyle2={printBtnStyle}
          buttonName="打印正本"
          buttonType="primary"
          privatePrintBtnClick={() => {
            let num: number = triggerFlag + 1;
            if (num > 2) {
              num = 1;
            }
            setTriggerFlag(num);
          }}
          onBeforePrintGetContent={() => {
            setType('printOriginal');
          }}
          onAfterPrintFinish={() => {
            setType('onlyPrint');
          }}
          printShow={true}
          myRef={myRef}
          triggerPrintFlag={triggerFlag}
        />,
        <CustomReactToPrint
          containerStyle2={printBtnStyle}
          buttonName="打印副本"
          buttonType="primary"
          privatePrintBtnClick={() => {
            let num: number = triggerFlag2 + 1;
            if (num > 2) {
              num = 1;
            }
            setTriggerFlag2(num);
          }}
          onBeforePrintGetContent={() => {
            setType('printCopy');
          }}
          onAfterPrintFinish={() => {
            setType('onlyPrint');
          }}
          printShow={true}
          myRef={myRef}
          triggerPrintFlag={triggerFlag2}
        />
    ];
}
<Modal
      title="打印功能"
      visible={visible}
      mask={true}
      onCancel={hideModal}
      maskClosable={false}
      footer={renderBtn()}
      centered={true}
      width={1000}
    >
        <div className={styles.content} ref={ref => setMyRef(ref)}>
          <Module  />
        </div>
    </Modal>

1.打印文件Module.tsx对应的样式文件Module.module.css
.moduleContent{
  width: 825px;
  min-height: 1160px;
  margin: 0px auto 50px auto;
  border-radius: 5px;
  /* border: solid 1px #ccc; */
  padding: 50px 25px 25px 25px; 
  background-color: #fff;
  white-space: pre-wrap;
  word-wrap: break-word;
  word-break: break-all;
  box-sizing: content-box;
}
其他略。。。

注意box-sizing: content-box;不能是border-box, 可以将boder取消注释查看差异

2.Module.tsx的标签内容
<div>
        <div className={styles.moduleContent}>1111。。。内容写多点才能测试出效果</div>
      {/**pageBreakAfter: 'always'=>为了第一个xx打印内容在打印弹窗出现后改变边距, 第二个xx打印内容别受影响 */}
      <p style={{ pageBreakAfter: 'always' }}></p >
      <div className={styles.moduleContent}>2222。。。内容写多点才能测试出效果</div>
    </div>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值