React:在 setstate 不起作用后调用 window.print
React: Calling window.print after setstate doesn't work
我想点击打印页面,但是我不想打印页面上的页眉和按钮:
<DetailedSummaryContainer id="detailedSummaryContainer">
{!this.state.printMode ?
<Header className="container">
<HeaderText>Header Text</HeaderText>
<ButtonContainer>
<StyledButton onClick={this.print}>Print</StyledButton>
</ButtonContainer>
</Header>
: null
}
<PrintableArea>
...
</PrintableArea>
</DetailedSummaryContainer>
因此,当单击“打印”时,我想将打印模式更改为 true,因此它会重新呈现 dom,然后打印新的 dom,然后在显示打印预览时,以及然后我再次将 printMode 设置为 false。
print = () => {
this.setState({ printMode: true }, () =>
{
console.log(this.state.printMode);
window.print();
});
}
目前我还没有将 printMode 设置为 false。
此代码发生的情况是状态更改为 true,重新呈现页面并且未显示页眉和按钮,但没有打开打印预览,而是打开了 about:blank
新选项卡。
我想保留 DetailedSummaryContainer
标签的原因是我想应用样式。否则我会在 PrintableArea
添加一个 ref 并执行此操作:
print = () => {
var printContents = this.printComponent.innerHTML;
var originalContents = document.body.innerHTML;
document.body.innerHTML = printContents;
window.print();
document.body.innerHTML = originalContents;
}
用这种方法打印效果很好,但样式仅来自 PrintableArea
,我还需要应用 DetailedSummaryContainer
的样式。
如果有更好的方法,我可以采用其他方法。
我想在 window.print
之后将 printMode
设置回 false
正是您想要的。请注意 window.print
阻止整个 javascript 过程 运行
click = () => {
this.setState({ printMode: true }, () => {
window.print();
this.setState({ printMode: false })
});
}
尝试:https://stackblitz.com/edit/react-ywbl1g?embed=1&file=index.js
根据我的评论:
您可以将 ref 放在 DetailedSummaryContainer
而不是 PrintableArea
因为你的 Header 在打印模式下是 null
而不是 innerHTML 的一部分,所以它不会与你想要的冲突并且你可以保持样式
我想点击打印页面,但是我不想打印页面上的页眉和按钮:
<DetailedSummaryContainer id="detailedSummaryContainer">
{!this.state.printMode ?
<Header className="container">
<HeaderText>Header Text</HeaderText>
<ButtonContainer>
<StyledButton onClick={this.print}>Print</StyledButton>
</ButtonContainer>
</Header>
: null
}
<PrintableArea>
...
</PrintableArea>
</DetailedSummaryContainer>
因此,当单击“打印”时,我想将打印模式更改为 true,因此它会重新呈现 dom,然后打印新的 dom,然后在显示打印预览时,以及然后我再次将 printMode 设置为 false。
print = () => {
this.setState({ printMode: true }, () =>
{
console.log(this.state.printMode);
window.print();
});
}
目前我还没有将 printMode 设置为 false。
此代码发生的情况是状态更改为 true,重新呈现页面并且未显示页眉和按钮,但没有打开打印预览,而是打开了 about:blank
新选项卡。
我想保留 DetailedSummaryContainer
标签的原因是我想应用样式。否则我会在 PrintableArea
添加一个 ref 并执行此操作:
print = () => {
var printContents = this.printComponent.innerHTML;
var originalContents = document.body.innerHTML;
document.body.innerHTML = printContents;
window.print();
document.body.innerHTML = originalContents;
}
用这种方法打印效果很好,但样式仅来自 PrintableArea
,我还需要应用 DetailedSummaryContainer
的样式。
如果有更好的方法,我可以采用其他方法。
我想在 window.print
之后将 printMode
设置回 false
正是您想要的。请注意 window.print
阻止整个 javascript 过程 运行
click = () => {
this.setState({ printMode: true }, () => {
window.print();
this.setState({ printMode: false })
});
}
尝试:https://stackblitz.com/edit/react-ywbl1g?embed=1&file=index.js
根据我的评论:
您可以将 ref 放在 DetailedSummaryContainer
而不是 PrintableArea
因为你的 Header 在打印模式下是 null
而不是 innerHTML 的一部分,所以它不会与你想要的冲突并且你可以保持样式