在状态更新之前,组件以初始状态渲染。
初始状态为null,单击按钮时onHandlePrint方法将更新状态。
class App extends React.Component {
state = {
pdf: null,
};
updatePDF = (data) => {
}
onHandlePrint = (pdf) => {
this.setState({pdf}, () => {
this.updatePDF(this.state.pdf)
})
}
render() {
return (
<div className="container">
<Router>
<ActivityDetail results={this.state.results} clickPrint={this.onHandlePrint} />
<Switch>
<Route
path="/pdf"
render={() => (
<PDFDocument data={this.state.pdf} />
)}
/>
</Switch>
</Router>
</div>
);
}
}
该按钮是一个链接,用于打开一个新选项卡,该选项卡将呈现PDF文档,并将传入事件的数据作为“ obj”
const ActivityDetail = ({ results, clickPrint }) => {
const renderedList = results.map((obj, index) => {
return (
<li key={index}>
<div className="service-container">
<Link to="/pdf" target="_blank" className="print-button-container">
<button
className="print-button"
onClick={() => clickPrint(obj)}
>Print</button>
</Link>
</div>
</li>
);
});
return (
<div>
<ul>
{renderedList}
</ul>
</div>
);
};
export default ActivityDetail;
这是PDF文档,当单击“打印”按钮但道具未定义时,应该获取数据。
const styles = StyleSheet.create({
page: {
flexDirection: 'row',
},
section: {
margin: 10,
padding: 10,
flexGrow: 1
}
})
const PDFDocument = (props) => {
const { NameOfService } = props
console.log('props:', props)
return(
<PDFViewer className="pdf-viewer">
<Document>
<Page size="A4" style={styles.page}>
<View style={styles.section}>
<Text>
{NameOfService}
</Text>
</View>
</Page>
</Document>
</PDFViewer>
)
}
export default PDFDocument
编辑
所以我所知道的是处理新设置状态的方法的回调。
onHandlePrint = (pdf) => {
this.setState({pdf}, () => {
this.updatePDF(this.state.pdf)
})
}
我的新问题是如何将数据从updatePDF方法发送到组件?
答案 0 :(得分:0)
您不应该在setState
回调函数中setState
。相反,它应该返回新状态。这个:
onHandlePrint = (pdf) => {
this.setState({pdf}, () => {
this.setState({pdfStatus: true})
});
};
应为:
onHandlePrint = (pdf) => {
this.setState(() => {pdf, pdfStatus: true});
};
但是实际上,如果您不需要使用以前的状态,则不需要使用回调。只要做:
onHandlePrint = (pdf) => {
this.setState({pdf, pdfStatus: true});
};
答案 1 :(得分:-1)
使用async
和await
onHandlePrint = async (pdf) => {
await this.setState({pdf}, () => {
this.setState({pdfStatus: true})
});
};