所以我有一个map函数,可以加载很多文件较大的项目。我想一个一个地加载每个结果,但是我想使用“ isLoading”状态隐藏或阻止它,直到所有加载完成。
如何检查地图函数是否已完成所有内容的加载?
{this.state.pdfSrc!== null ? // IF USER HAS UPLOADED FILES
this.state.pdfSrc.map(item => ( // MAP THROUGH THOSE FILES
// AS LONG AS THE MAP FUNCTION KEEPS LOADING FILES, A POP UP MUST COME UP SAYING "please wait until everything is loaded"
<div key={item.fileResult} className='uploadResultList'>
{item.fileName}
<embed src={item.fileResult} />
<input type='text' placeholder='Add title*' required />
</div>
)) /
:
null
}
但这只会给我以下错误
警告:函数作为React子元素无效。如果发生这种情况 您返回一个Component而不是从render返回。或许 您打算调用此函数而不是返回它。
答案 0 :(得分:1)
您可以在组件的render()方法中实现地图,而不必在单个函数中执行此操作:
render() {
return(
<div>
{!!imgSrc ? (
<PlaceholderComponents/>
) : this.state.imgSrc.map(item => (
<div key={item.fileResult} className='uploadResultList'>
<embed src={item.fileResult} />
</div>
}
</div>
)
}
但是,在执行此操作之前,您需要使用componentDidMount或componentWillMount(现在已弃用,因此请避免使用它)“加载”文件数据。例如:
componentDidMount() {
getImageSrcData(); // Either a function
this.setState({ imgSrc: imgFile }) // Or from setState
}
如果要从componentDidMount设置状态的更多信息,请参见以下线程: Setting state on componentDidMount()
编辑:您可以使用React Suspense API确保在渲染之前加载文件...
// You PDF Component from a separate file where the mapping is done:
render() {
return (
<div>
{this.state.imgSrc.map(item => (
<div key={item.fileResult} className='uploadResultList'>
<embed src={item.fileResult} />
</div>}
</div>
)
}
const PleaseWaitComponent = React.lazy(() => import('./PleaseWaitComponent'));
render() {
return (
// Displays <PleaseWaitComponent> until PDFComponent loads
<React.Suspense fallback={<PleaseWaitComponent />}>
<div>
<PDFComponent />
</div>
</React.Suspense>
);
}
答案 1 :(得分:0)
更新:您可能需要研究创建可以使用另一个组件的更高级别的组件,并等到所有这些组件都装入后再更改状态。也许与react-loadable类似?
您不需要将回调传递到setState中。 .map不是异步的,一旦迭代完成,它将移至该块的下一行。
这里遇到的问题是,您只是调用map并在回调中返回JSX,但它没有任何作用。
您应该在render方法中调用.map。我不确定为什么要尝试更新isLoading状态。我认为这应该在其他地方处理。
render() {
cosnt { imgSrc } = this.state;
return (
{
imgSrc.map(item => (
<div key={item.fileResult} className="uploadResultList">
<embed src={item.fileResult} />
</div>
));
}
)
}