如何使用 react-to-print 正确打印嵌套组件

How to print a nested component correctly with react-to-print

提问人:Frank HAWK 提问时间:11/17/2023 最后编辑:Drew ReeseFrank HAWK 更新时间:11/19/2023 访问量:36

问:

这是我要打印的主要表单组件:

import { Fragment, useRef } from "react";
import FormDataPrint from "../Printer/FormDataPrint";
import ReactToPrint from "react-to-print";
import { Card, Button } from "reactstrap";
import { Printer } from "react-feather";

const FormData = ({ data }) => {
  const formDataPrintRef = useRef();

  const handlePrint = () => {
    const formDataPrint = formDataPrintRef.current;
    if (formDataPrint) {
      formDataPrint.handlePrint();
    }
  };

  return (
    <Fragment>
      {/* This is Form Area (Input etc.) */}
      <Card>
        <div className="d-flex justify-content-end mt-1">
          <ReactToPrint
            trigger={() => (
              <Button
                className="ms-1 text-center"
                outline
                color="primary"
                onClick={handlePrint}
              >
                <Printer style={{ marginRight: "5px" }} size={20} />
                <span>Print</span>
              </Button>
            )}
            content={() => formDataPrintRef.current}
          />
          <div style={{ display: "none" }}>
            <FormDataPrint ref={formDataPrintRef} data={data} />
          </div>
        </div>
      </Card>
    </Fragment>
  );
};

export default FormData;

这是子组件 FormDataPrint:

import React, { forwardRef } from "react";

const FormDataPrint = forwardRef((props, ref) => {
  const { data } = props;

  return <div ref={ref}>Print just this</div>;
});

export default FormDataPrint;

在这里,我只想为子组件的内容创建一个特殊的结构,并打印传入的数据(例如:name、surname)。但是当打开打印页面时,虽然div内容是空的,但它是两页,我只能在样式进入div时更改颜色。我只能在子组件的 div 中提供填充、带有内联样式的边距。我尝试使用css,我无法理解只有颜色发生了变化。

我发现的大部分信息都是打印出它所在的整个页面。

HTML CSS JS 反应 打印

评论


答:

-2赞 Muto Cartoon Kids 11/18/2023 #1

FormDataPrint.jsx:

import React, { forwardRef } from "react";
import { Card } from "reactstrap";

const FormDataPrint = forwardRef((props, ref) => {
  const { data } = props;

  const divStyle = {
    color: "blue", // Example color change
    padding: "10px", // Example padding
    margin: "5px", // Example margin
  };

  return (
    <Card style={divStyle} ref={ref}>
      <p>Name: {data.name}</p>
      <p>Surname: {data.surname}</p>
    </Card>
  );
});

export default FormDataPrint;

FormData.jsx:

import { Fragment, useRef } from "react";
import FormDataPrint from "../Printer/FormDataPrint";
import ReactToPrint from "react-to-print";
import { Card, Button } from "reactstrap";
import { Printer } from "react-feather";

const FormData = ({ data }) => {
  const formDataPrintRef = useRef();

  const handlePrint = () => {
    const formDataPrint = formDataPrintRef.current;
    if (formDataPrint) {
      formDataPrint.handlePrint();
    }
  };

  return (
    <Fragment>
      {/* This is Form Area (Input etc.) */}
      <Card>
        <div className="d-flex justify-content-end mt-1">
          <ReactToPrint
            trigger={() => (
              <Button
                className="ms-1 text-center"
                outline
                color="primary"
                onClick={handlePrint}
              >
                <Printer style={{ marginRight: "5px" }} size={20} />
                <span>Print</span>
              </Button>
            )}
            content={() => formDataPrintRef.current}
          />
          <div style={{ display: "none" }}>
            <FormDataPrint ref={formDataPrintRef} data={data} />
          </div>
        </div>
      </Card>
    </Fragment>
  );
};

export default FormData;

现在,在这个修改后的组件中,我已使用对象将样式直接应用于组件。您可以根据需要自定义这些样式。FormDataPrintCarddivStyle

评论

1赞 Drew Reese 11/19/2023
这是怎麽?答案通常带有对问题/问题的某种解释以及如何解决它。这只是代码。任何人都应该从中理解什么?