我正在尝试在react-native
中获取一些数据,其中将所述数据存储在state
变量中,以便我可以在组件中的任何地方访问它们。这是代码:
export default class Result extends Component {
state = {
data: {}
};
async componentDidMount() {
const that = this;
const url = 'https://world.openfoodfacts.org/api/v0/product/8002270014901.json';
let response = await fetch(url);
if (response.status == 200) {
let data = await response.json();
this.setState({ data });
}
}
... some code ...
render() {
console.log(this.state.data.product);
...some more code ...
}
}
我从另一台SOF文章中获得了componentDidMount
的代码,以确保我可以使用一些data
。当我尝试测试结果时,它可以与您在代码中看到的console.log
完美效果。但是,如果我尝试在对象内更深入一层(例如console.log(this.state.data.product.brands);
,我会收到主题中提到的错误消息。为什么?我如何确保在继续操作之前"加载"整个对象?>
在这种情况下,我想到的是,您正在执行render
方法后收到响应。
您可以问,但是当我仅记录this.state.data.product
时它是如何工作的?
好吧,当您初始化状态时,您将定义它具有data
对象,因此在这种情况下,代码不会断开,因为this.state.data.product
是undefined
,但是当您尝试更深入地将一层更深入,您正在尝试访问属性undefined
值,这会导致您遇到的错误(无法读取未定义的属性 x )。
那么,我该怎么办才能解决?
您必须在州内存储一个布尔值变量,让我们称其为 fetchingData
,并给它默认值为 true
,所以现在您有
state = {
data: {},
fetchingData: true
};
然后,在您的render
方法上,您验证它是否获取数据,或者如果您已经从服务器中有TE响应,则将其修改为这样:
render() {
if(this.state.fetchingData) return <View><Text>Fetching data...</Text></View>
console.log(this.state.data.product.brands);
return(
Whatever you want to do with the data...
)
}
它的作用是在您仍在等待数据时,将显示一条Fetching data...
消息,现在收到数据时,您还必须将fetchingData
更改为false。
if (response.status == 200) {
let data = await response.json();
this.setState({
data: data,
fetchingData: false
});
}