仅在父组件完成重新渲染后才调用子组件中的方法
Call a method in child component only after parent completes re-render
我有一个父组件显示的图形质量较低<HeatMap />
。 HeatMap
有一个子组件 <MyButton {...data}>
。 MyButton
基本上是一个按钮,用于下载图形图像。我的要求是:单击按钮后,父项 (HeatMap
) 应该重新呈现为高质量的 svg 图像。只有在那之后,才会开始下载。
我取得的成就:
第一次单击该按钮时,图像质量变为 svg,但会下载 png 图像。我认为下载在父级完全呈现之前开始。
代码:
class HeatMap extends Component {
constructor (props) {
super(props);
this.state = {
getSVG: false,
loadedData: [],
}
}
render () {
const { getSVG, loadedData } = this.state;
return (
<Fragment>
{getSVG
? <HeatmapSeries colorType="literal" data={loadedData} /> // svg graph
: <HeatmapSeriesCanvas colorType="literal" data={loadedData} />} // png(low-qlty)
<MyButton
{...this.props}
svgFunction={(required) => this.setState({ getSVG: true})}
getSVG={getSVG}
/>
</Fragment>
)
}
}
class MyButton extends Component {
render() {
return (
<Button size="small" icon="download" onClick={this._downloadSVG} >SVG</Button>
)
}
/**
* Generate the image and the download action
* @return {void}
**/
async _downloadSVG() {
const { svgFunction } = this.props;
if (typeof svgFunction === 'function') {
svgFunction(); // re-render the graph as a vector (try to re-render parent first)
}
methodToDownloadGraph({...this.props}); // graph svg is passed as argument
}
}
问题是:methodToDownloadGraph
完成之前,父项的重新渲染完成。
这是我想要实现的目标的图片:
React 的setState
是一个异步函数,也就是说调用后不会立即更新状态。如果你想在状态更新后做一些操作,那么你需要将回调作为第二个参数传递给 setState
函数。
要解决此问题,您需要在 HeatMap
组件而不是 Button
组件中调用 methodToDownloadGraph
函数。
你可以这样做:
svgFunction={(required) => this.setState({ getSVG: true}, () => methodToDownloadGraph())}
试试这个
async _downloadSVG() {
const { svgFunction } = this.props;
if (typeof svgFunction === 'function') {
await svgFunction(); // Add this line as it is
}
methodToDownloadGraph({...this.props}); // graph svg is passed as argument
}
我有一个父组件显示的图形质量较低<HeatMap />
。 HeatMap
有一个子组件 <MyButton {...data}>
。 MyButton
基本上是一个按钮,用于下载图形图像。我的要求是:单击按钮后,父项 (HeatMap
) 应该重新呈现为高质量的 svg 图像。只有在那之后,才会开始下载。
我取得的成就: 第一次单击该按钮时,图像质量变为 svg,但会下载 png 图像。我认为下载在父级完全呈现之前开始。
代码:
class HeatMap extends Component {
constructor (props) {
super(props);
this.state = {
getSVG: false,
loadedData: [],
}
}
render () {
const { getSVG, loadedData } = this.state;
return (
<Fragment>
{getSVG
? <HeatmapSeries colorType="literal" data={loadedData} /> // svg graph
: <HeatmapSeriesCanvas colorType="literal" data={loadedData} />} // png(low-qlty)
<MyButton
{...this.props}
svgFunction={(required) => this.setState({ getSVG: true})}
getSVG={getSVG}
/>
</Fragment>
)
}
}
class MyButton extends Component {
render() {
return (
<Button size="small" icon="download" onClick={this._downloadSVG} >SVG</Button>
)
}
/**
* Generate the image and the download action
* @return {void}
**/
async _downloadSVG() {
const { svgFunction } = this.props;
if (typeof svgFunction === 'function') {
svgFunction(); // re-render the graph as a vector (try to re-render parent first)
}
methodToDownloadGraph({...this.props}); // graph svg is passed as argument
}
}
问题是:methodToDownloadGraph
完成之前,父项的重新渲染完成。
这是我想要实现的目标的图片:
React 的setState
是一个异步函数,也就是说调用后不会立即更新状态。如果你想在状态更新后做一些操作,那么你需要将回调作为第二个参数传递给 setState
函数。
要解决此问题,您需要在 HeatMap
组件而不是 Button
组件中调用 methodToDownloadGraph
函数。
你可以这样做:
svgFunction={(required) => this.setState({ getSVG: true}, () => methodToDownloadGraph())}
试试这个
async _downloadSVG() {
const { svgFunction } = this.props;
if (typeof svgFunction === 'function') {
await svgFunction(); // Add this line as it is
}
methodToDownloadGraph({...this.props}); // graph svg is passed as argument
}