reactjs 将React组件下载为.html文件

oknwwptz  于 2023-05-06  发布在  React
关注(0)|答案(1)|浏览(162)

我有以下React组件:

export class SomePage extends Component {

  downloadAsDotHtmlFile() {
    // do stuff here?? or do this some other way??
  }

  render () {
    return (
      <>
        <div className="firstChildDiv">Stuff here</div>
        <div className="secondChildDiv" onClick={()=>this.downloadAsDotHtmlFile()}>Stuff here</div>
      </>
    )
  }

}

我希望用户能够:
1.下载secondChildDiv
1.将其保存为.html文件***,并保留所有样式***,隐藏除secondChildDiv以外的所有内容。
我知道当我打印时,我可以使用媒体查询来隐藏除secondChildDiv以外的所有内容:

@media print {
  .firstChildDiv {
     display: none;
  }
}

但我试图下载这个,而不是打印,并下载它作为一个.html文件在那。如何才能做到这一点?

bttbmeg0

bttbmeg01#

您可以在父组件上设置ref,并使用outerHTML将HTML作为字符串检索。
然后,您可以使用一些时髦的锚工作来下载结果字符串。

const MainComponent = () => {
    const ref = useRef(null);

    const generateHTML = () => {
        const { current: container } = ref;

        // Use outerHTML to retrieve the contents AND the container div.
        const html = container.outerHTML;

        downloadHTML(html);
    };

    const downloadHTML = html => {
        const anchor = document.createElement("a");   
        anchor.style.display = "none";     

        // Setup the download
        anchor.setAttribute(
            "href", 
            `data:text/html;charset=utf-8,${encodeURIComponent(html)}`
        );
        anchor.setAttribute("download", "index.html");

        document.body.appendChild(anchor);

        // Trigger the download
        element.click();
        // Remove the anchor from the page
        document.body.removeChild(anchor);
    };
    
    // Ensure that you use no deps otherwise it'll trigger an infinite loop of downloads.
    useEffect(() => {
        generateHTML();
    }, []);

    return (
        <div ref={ref}>
            {/* Child components go here */}
        </div>
    );
};

相关问题