我正在学习 react ,这很棒,但是我遇到了一个问题,我不确定解决该问题的最佳实践。
我从我的componentDidMount()中的API获取数据,然后使用SetState()设置了一些状态。
现在的问题是,因为第一个渲染发生在设置我的状态之前,所以我将初始状态值发送到了我的组件中。现在,我将它们设置为空数组或空对象({类型:对象,默认值:()=>({})})。
然后,我正在使用三元运算符来检查.length或该属性是否具有值。
这是最佳做法,还是我不知道其他方式?
我很乐意为此提供帮助,以便我从一开始就正确地进行基础操作。
谢谢!
最佳答案
我认为最佳做法是告诉用户您的数据仍在加载中,然后用实际数据填充字段。在各种博客文章中都倡导了这种方法。 Robin Wieruch在如何获取数据方面写了大量文章,并在specific example上介绍了如何处理加载数据和错误的方法,在此我将通过他的示例进行研究。此方法通常分为两部分。
isLoading
变量。这是一个bolean
。我们最初将其设置为false
,因为未加载任何内容,然后在尝试获取数据时将其设置为true
,然后在加载数据后又将其设置为false
。 isLoading
两个状态下呈现什么内容。 1.设置isLoading变量
由于您未提供任何代码,因此我将按照Wieruch的示例进行操作。
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props);
this.state = {
dataFromApi: null,
};
}
componentDidMount() {
fetch('https://api.mydomain.com')
.then(response => response.json())
.then(data => this.setState({ dataFromApi: data.dataFromApi }));
}
...
}
export default App;
在这里,我们使用浏览器的native
fetch()
api通过使用componentDidMount()
来安装组件时获取数据。这应该与您现在正在执行的操作非常相似。鉴于fetch()
方法是异步的,因此一旦接收到数据,页面的其余部分将呈现,并且状态将是最新的。为了告诉用户我们正在等待数据加载,我们只需将
isLoading
添加到我们的状态即可。因此状态变为:this.state = {
dataFromApi: null,
isLoading: false,
};
isLoading
的状态最初是false
,因为我们尚未调用fetch()
。就在我们在fetch()
中调用componentDidMount()
之前,我们将isLoading
的状态设置为true,如下所示:this.setState({ isLoading: true });
然后,我们需要在
fetch()
Promise中添加then()方法,以在数据加载完成后将isLoading
的状态设置为false
。.then(data => this.setState({ dataFromAPi: data.dataFromApi, isLoading: false }));
最终代码如下所示:
class App extends Component {
constructor(props) {
super(props);
this.state = {
dataFromApi: [],
isLoading: false,
};
}
componentDidMount() {
this.setState({ isLoading: true });
fetch('https://api.mydomain.com')
.then(response => response.json())
.then(data => this.setState({ dataFromApi: data.dataFromApi, isLoading: false }));
}
...
}
export default App;
2.有条件的渲染
React允许conditional rendering。我们可以在
if
方法中使用一个简单的render()
语句,根据isLoading
的状态来呈现组件。class App extends Component {
...
render() {
const { hits, isLoading } = this.state;
if (isLoading) {
return <p>Loading ...</p>;
}
return (
<ul>
{dataFromApi.map(data =>
<li key={data.objectID}>
<a href={data.url}>{data.title}</a>
</li>
)}
</ul>
);
}
}
希望这可以帮助。