当前位置: 首页 > 面试题库 >

反应:图像加载时显示加载微调器

洪照
2023-03-14
问题内容

我有一个React应用,可以调用useEffect我的API,该API返回URL列表以用作imy图像src。

react-loader-spinner用来显示图像加载时的加载微调组件。

我有一个loading变量useState来确定图像是否正在加载。

我无法弄清楚如何停止显示正在加载的微调器,并在它们全部加载后显示图像。

这是我的代码:

Photos.jsx

import React, { useState, useEffect, Fragment } from 'react'
import Loader from 'react-loader-spinner';
import { getAllImages } from '../../services/media.service';
import Photo from '../common/Photo';

const Photos = () => {
  const [photos, setPhotos] = useState([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
      setLoading(true);
      getAllImages()
        .then(results => {
          setPhotos(results.data)
          console.log(results.data)
        })
        .catch(err =>{
          console.log(err)
        })
  }, [])

  const handleLoading = () => {
    setLoading(false)
  }

  return ( 
    <Fragment>
      <div className="photos">
          { loading ? 
            <Fragment>
              <Loader
                height="100"    
                width="100"
              />
              <div>Loading Joe's life...</div>
            </Fragment>
            :
            photos.map((photo, index) => (
                index !== photos.length - 1 ? 
                <Photo src={photo.src} key={photo.id} /> :
                <Photo src={photo.src} key={photo.id} handleLoad={handleLoading}/>
            ))
          }
      </div>
    </Fragment>
   );
}

export default Photos;

Photo.jsx

import React from 'react'

import './Photo.css';

const Photo = (props) => {
  return ( 
    <div className="photo">
      <img src={props.src} alt={props.alt} onLoad={props.handleLoad}/>
      <div className="caption">
        Photo caption
      </div>
    </div>
   );
}

export default Photo;

我尝试将onLoad我的最后一项用于,但是它永远不会被调用,因为loading由于仍然显示了微调框,所以它从未设置为false。

在此方面的一些帮助将不胜感激。谢谢


问题答案:

永不调用onLoad的原因是,因为您在DOM中从未拥有图像,所以有条件地将display属性设置为none&block,而不是有条件地呈现。

下面是一个简单的示例,说明如何等待所有图像加载。

可以安全地假定文件大小最大的图像很可能是最后加载的图像

最肯定不是!,图像加载所需的时间并不总是局限于大小,缓存或服务器加载会影响这些。

const {useState, useEffect, useRef} = React;



const urls = [

  "https://placeimg.com/100/100/any&rnd=" + Math.random(),

  "https://placeimg.com/100/100/any&rnd=" + Math.random(),

  "https://placeimg.com/100/100/any&rnd=" + Math.random()

];



function Test() {

  const [loading, setLoading] = useState(true);

  const counter = useRef(0);

  const imageLoaded = () => {

    counter.current += 1;

    if (counter.current >= urls.length) {

      setLoading(false);

    }

  }

  return <React.Fragment>

    <div style={{display: loading ? "block" : "none"}}>

       Loading images,

    </div>

    <div style={{display: loading ? "none" : "block"}}>

      {urls.map(url =>

        <img

          key={url}

          src={url}

          onLoad={imageLoaded}/>)}

    </div>

  </React.Fragment>;

}



ReactDOM.render(<React.Fragment>

  <Test/>

</React.Fragment>, document.querySelector('#mount'));


<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="mount"></div>


 类似资料:
  • 问题内容: 我目前正在使用一个Web应用程序,该应用程序的页面显示一个图表(.png图像)。在页面的另一部分上,有一组链接,单击这些链接后,整个页面将重新加载,并且外观与之前完全相同,除了页面中间的图表。 我要做的是单击页面上的链接后,页面上的图表才更改。由于页面大约100kb大,这将极大地加快处理速度,并且真的不想为了显示此页面而重新加载整个页面。 我一直在通过JavaScript执行此操作,到

  • 问题内容: 我只是想知道如何显示指示异步请求正在运行的图像。我使用以下代码执行异步请求: 有任何想法吗? 问题答案: 当然,您可以在发出请求之前显示它,并在请求完成后隐藏它: 我通常更喜欢将其绑定到全局ajaxStart和ajaxStop事件的更通用的解决方案,这样它就可以显示在所有ajax事件中:

  • 问题内容: 我知道互联网上有成千上万个示例,但是对于脚本,我已经必须在检索数据时显示加载的gif图像。我的Java知识很差,因此我想问如何更改以下内容: 我的div在这里: 谢谢。约翰 问题答案: 假设您在页面上某处有一个标签,其中包含您的加载消息: 您可以在ajax调用中添加两行:

  • 我尝试从数组中随机加载gif。我尝试了几种方法,但都没有奏效。我要么收到错误消息,要么图像就不会出现。 版本 1(结果:图像未显示): 版本2(结果:“无效调用”) 版本3(结果:无法加载图像): 有什么想法吗?

  • 问题内容: 我有一个网页,该网页使用命令shell_exec运行python脚本。我想要一个加载微调器,在Python脚本运行时显示“请稍等此页面加载”消息,然后在执行完之后显示其余的回显HTML。 我找到了看似不错的解决方案,但是我对ajax还是陌生的,所以我不知道如何使用该解决方案。我试着做 但这没有用。我需要调用ajax来执行ajaxStart吗?我怎么称呼它?我应该用ajax代码包装she

  • 我正在使用毕加索图书馆。我知道,如果我将图片从URL加载到图像视图中,有一种回调方法。但我不想加载到imageview中。相反,我想将其另存为位图。所以我用了下面的代码 我怎样才能得到一个回调方法,知道我的图像是成功下载使用毕加索? 不要说位图对象的空检查。这会导致错误。