redux 正确使用ReactToPrint?

jaxagkaj  于 2022-11-12  发布在  React
关注(0)|答案(3)|浏览(175)

问题是,应该给予打印选项的按钮不再工作了。
控制台中的错误显示:

To print a functional component ensure it is wrapped with `React.forwardRef`, and ensure the forwarded ref is used. See the README for an example: https://github.com/gregnb/react-to-print#examples

我已经看到一些解决方案专门谈论同样的问题,但我一直未能使它的工作。
有什么建议吗?
这是我正在使用的库:ReactToPrint npm

对打印做出React

import { useRef } from "react";
import { useReactToPrint } from "react-to-print";
import Resume from "./Pdf/Pdf";

const  Example = () => {
  const componentRef = useRef();
  const handlePrint = useReactToPrint({
    content: () => componentRef.current
  });

  return (
    <div >
    <button onClick={handlePrint}>   ------> NOT WORKING!
      Descargar Pdf
    </button>
    <Resume ref={componentRef} />   ------> COMPONENT TO PRINT
  </div>
  );
};

export default Example;

要打印的组件

import React from "react";
import styled from 'styled-components';
import PdfSection from './PdfSection';
import AlienLevel from './AlienLevel';
import {connect } from 'react-redux';

class Resume  extends React.Component {
  renderList = () => {
    return this.props.posts.diagnose.map((post) => {
      return (
        <PdfSection
          key={post.id}
          id={post.id}
          divider={"/images/pdf/divider.png"}
          img={"/images/alienRandom.png"}
          title={post.title}
          // data={post.data}
          text={post.text0}
          subtext={post.subtext0}
        />
      );
    });
  };

  render(){

  return (
    <div>
      <Container>
        <Page>
          <Portada>
            <img id="portada" src="/images/pdf/PortadaPdf.png" />
          </Portada>
        </Page>

        <Page>
          <AlienLevel
            result= "{props.diagn}{"
            character={"/images/pdf/alienMedio.png"}
            fileName={"responseBody[4].data"}
            level={"/images/pdf/level6.png"}
            correct={"/images/pdf/correct.png"}
            medium={"/images/pdf/medium.png"}
            incorrect={"/images/pdf/incorrect.png"}
            text='"Necesitas mejorar tus prácticas intergalácticas de CV, pero ya eres nivel medio!"'
          />
          <div>{this.renderList()}</div>
        </Page>
      </Container>
    </div>
  );
};
}
const mapStateToProps = (state) => {
  return { posts: state.posts };
};

export default connect(mapStateToProps)( Resume);

先谢谢你!

dz6r00yl

dz6r00yl1#

问题出在react-reduxconnect()函数上。您将组件 Package 在connect中,而connect默认情况下不转发引用。这意味着,您在这里传递的引用<Resume ref={componentRef} />没有到达您的组件。
您需要在连接函数connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)的第四个参数中传递选项{ forwardRef: true }
只需将Resume组件中的代码export default connect(mapStateToProps)(Resume);更改为
export default connect(mapStateToProps, null, null, { forwardRef: true })(Resume);

wbrvyc0a

wbrvyc0a2#

对于任何人是挣扎与同样的错误,似乎他们找到了正确的方法来解决这个问题,我实际上解决了它,通过以下代码框,我发现在Github的问题在这里si的链接。希望是有用的!--〉
LINK TO GITHUB SPECIFIC ISSUE (SOLVED!!)

olhwl3o2

olhwl3o23#

我也遇到了同样的问题,我很高兴能尽快分享我的发现。组件必须使用ref在某个地方呈现。
我使用React Material UI's Backdrop将其添加到我的页面中作为隐藏。或者你可以使用钩子将其隐藏,如下面的示例。
使用背景,并且只在需要预览打印时调用它。👇👇

<Backdrop sx={{ color: "#fff", zIndex: (theme) => theme.zIndex.drawer + 1 }}
 open={openBD}>
   <ComponentToPrint ref={componentRef} />
</Backdrop>

使用挂钩和显示样式设置仅在需要时显示。👇👇

const [isReady, setIsReady] = useState("none");

<Paper style={{ display: isReady }} >
 <ComponentToPrint ref={componentRef} />
</Paper>

<Button
 variant="contained"
 endIcon={<BackupTableRoundedIcon />}
 onClick={() => setIsReady("")}
>
  Start Printing
 </Button>

注意:我使用了MUI组件,如果你决定复制粘贴,那么将按钮改为html〈按钮,将纸张改为〈div。希望这对你有帮助。

相关问题