我有一个上级组件,其中使用了上级highchart组件。像这样
class MobHome extends Component {
render() {
return(
<Link to="/graphdetails">
<AreaSplineChart
id="1keyTotalVisitor"
key="keyTotalVisitor"
className="graph-visitor"
title="<strong>Total Visitors</strong>"
subtitle={`This is all the users that have visited your <br/> site.
<br/><span style='font-size:60px; color: #5BC0BE; font-weight:600'>
${ analyticsData.totalVisitors }</span>`}
data={_.get(analyticsData, 'totalVisitorsGraphData', []).map(t => t.count)}
categories={_.get(analyticsData, 'totalVisitorsGraphData', []).map(t => t._id)}
filterType={this.state.filterType}
graphData={_.get(analyticsData, 'totalVisitorsGraphData', [])}
/>
</Link>
)
}
}
我的highchart(child)组件看起来像这样
componentWillReceiveProps (np) {
if (this.props.data !== np.data) {
this.highChartFunction(np)
}
}
class AreaSplineChart extends Component {
highChartFunction () {
const { title, subtitle, id, data, categories, graphData } = this.props
console.log(id)
Highcharts.chart(String(id), {
//... options
})
}
render () {
const { id } = this.props
console.log(id)
return (
<div key={id} id={id}/>
)
}
}
export default AreaSplineChart
现在该问题在我的开发模式下可以正常工作,但在生产模式下会出现错误。
Error: Highcharts error #13: www.highcharts.com/errors/13
我到处都有控制台日志,我确信ids
首先渲染,然后调用我的函数。但是我仍然遇到了问题。 gatsby生产版本是否存在任何问题,或者我在这里做错了什么?
谢谢!
答案 0 :(得分:1)
Highchart
库给出的错误意味着它找不到您提供的id
的div。似乎componentWillReceiveProps
在渲染之前被调用。
我建议您在highChartFunction
生命周期方法内调用componentDidMount
并将Chart
实例保存到类属性中,以便以后使用。在第一次调用componentDidMount
之后立即调用render
,因此应在此时创建该元素。
componentDidMount() {
this.highChartFunction();
}
highChartFunction () {
const { title, subtitle, id, data, categories, graphData } = this.props;
this.chart = Highcharts.chart(String(id), {
//... options
});
}
如果您想处理道具的更新,我建议您使用componentDidUpdate
,因为componentWillReceiveProps
已标记为已弃用,并计划在React 17中删除。它。 componentDidUpdate
获取前一个props
作为参数,以便您可以检查是否需要更新:
componentDidUpdate(prevProps) {
if ("somehow prevProps and this.props is different") { // Replace with check
this.chart.update({
// new options
}, /* Here is an argument to set if the chart should be rerendered, you can set it if necessary */);
}
}
也不要忘记设置componentWillUnmount
生命周期方法来销毁图表:
componentWillUnmount() {
this.chart.destroy();
}
个人推荐:我不会使用id
来设置图表,而是使用Refs。这些是对该组件的引用,在我看来,它比id
查找要好得多。
constructor() {
this.chartContainer = React.createRef();
}
highChartFunction() {
/* ... */
Highcharts.chart(this.chartContainer.current, { ... });
}
render() {
const { id } = this.props;
return (<div key={id} id={id} ref={this.chartContainer} />)
}
Here is a minimal example和我在这里提到的所有内容。