我有一个反应代码,如下所示,它基本上创建了一个树图:
class ChartModal extends Component{
constructor(props){
super(props)
}
callApi(){
fetch(someurl)
.then((result) => {
return result.json();
}).then((jsonResult) => {
console.log(jsonResult);
})
}
render(){
return(
<Modal
onOk={() => this.props.toggleVisibility()}
onCancel={() => this.props.toggleVisibility()}
visible={this.props.isVisible}
okText={'ok'}
cancelText={'cancel'}
confirmLoading={false}
title="Intent distribution chart"
>
<h1>HOWDY</h1>
<TreeMap
data = {this.callApi()}//this is where i want the data returned by apicall
width={400}
valueUnit={'count'}
/>
</Modal>
)
}
}
现在,我希望api调用返回的数据在tree map
组件中使用,但我现在这样做似乎不起作用。当我运行这个时,tree map
中的数据显示为null,尽管我希望api call
返回的json
在那里。
您需要在componentWillMount
或任何其他生命周期挂钩中调用API,并且在API回调中使用setState
来确保将结果设置为组件状态变量。这样,在setState
之后,您的组件就可以访问由API调用解析的值。
注意:在第一次渲染期间,this.state.result
将为null。在访问this.props.data
之前,请确保在TreeMap
组件中进行空检查。
IMP注释
@aram90关于在未安装的组件上调用setState
的好建议。为了避免这种this.canSetState
,实例变量由我定义并添加,以防止在未安装的组件上调用任何可能的setState
。
我使用这种方法只是为了尽可能早地调用API,即使这意味着一纳秒。然而,另一种方法是在componentDidMount
中调用API,然后相应地检查this._ismounted
实例变量。关于这个检查的更多信息,答案在这里。有没有办法检查react组件是否已卸载?。React文档建议不要使用isMounted()
。
有很多方法可以实现这一点,但这更像是React类型的方法。
class ChartModal extends Component{
constructor(props){
super(props)
this.state = {
result: null
}
this.canSetState = false;
}
componentWillMount() {
this.canSetState = true;
this.callApi();
}
componentWillUnmount() {
this.canSetState = false;
}
callApi(){
fetch(someurl)
.then((result) => {
return result.json();
}).then((jsonResult) => {
this.canSetState && this.setState({result: jsonResult})
})
}
render(){
return (
<Modal
onOk={() => this.props.toggleVisibility()}
onCancel={() => this.props.toggleVisibility()}
visible={this.props.isVisible}
okText={'ok'}
cancelText={'cancel'}
confirmLoading={false}
title="Intent distribution chart"
>
<h1>HOWDY</h1>
<TreeMap
data={this.state.result}
width={400}
valueUnit={'count'}
/>
</Modal>
)
}
}
问题是callApi
没有返回任何东西。如果它应该将数据分配到某个地方,那么它不是。如果真的返回了一些东西,那将是一个承诺,因为它是异步的。
您可以使用状态变量并将其映射到TreeMap
的data
道具。然后使用componentDidMount
生命周期函数在组件渲染后获取数据。一旦它做出响应,就用结果更新映射的状态变量。理论上,它应该自动重新渲染TreeMap
。