当前位置: 首页 > 知识库问答 >
问题:

如何在加载DOM后延迟加载图像

宋臻
2023-03-14

我想做一个reactjs页面懒惰加载图像。因此,我调用lazyLoadImages()内部的组件didMount()。我发现位于浏览器选项卡的浏览器加载指示器仍然一路旋转,直到加载所有图像。这让我认为我所做的并没有提供真正的懒惰加载图像体验。

有趣的是,如果我在setTimeout中用一个不太短的timeout参数包装lazyLoadImages(),例如100ms(不是0或甚至50ms),那么页面加载指示器将很快停止旋转并消失,这让我感觉页面DOM已经完成,而这些图像是在后台进程中开始加载的。

我认为组件didmount和windowonload是相似的,但它们不是。我可以通过使用windowonload事件获得与使用setTimeout相同的体验。但由于我的应用程序是SPA,因此onload事件不适合。因为onload事件只有在我显式刷新此页面时才起作用,但不能使用react路由器在页面之间导航。

任何人都有这种现象的想法,我如何在不使用setTimeout函数的情况下实现同样的效果?

componentDidMount() {
    setTimeout(this.lazyLoadCarouselImage, 100);
    // or invoke directly -> this.lazyLoadCarouselImage();
}
    
lazyLoadCarouselImage() {
   let images = [];
   let loadedCounter = 0;
   let lazyLoadImageList = ['https://wallpaperaccess.com/full/637960.jpg','https://wallpaperaccess.com/full/637960.jpg']

   for (let i=0; i<lazyLoadImageList.length; i++ ) {
      images[i] = new Image();
      images[i].onload = ()=> {
                    loadedCounter++;
                    if (loadedCounter == lazyLoadImageList.length) {
                        // update state here saying all images are loaded
                    }
                }
      images[i].src = lazyLoadImageList[i];
   }
}

共有2个答案

叶文博
2023-03-14

看来对我有用

const [isLoaded, setIsLoaded] = useState(false);
const [isPageLoaded, setIsPageLoaded] = useState(false); //this helps with lazy loading

useEffect(() => {
    setIsLoaded(true);
}, []);

useEffect(() => {
    if (isLoaded) {
        setIsPageLoaded(true);
    }
}, [isLoaded]);
邴俊达
2023-03-14

有些库可以使用scroll和resize事件处理程序处理延迟加载,而其他库则使用Intersection Observer API。查看延迟加载图像以了解详细信息。

现在,只需将属性load=“lazy”添加到每个

下面是一个快速示例,其中我创建了100个“延迟加载”的图像:

class App extends React.Component {



  render() {

    let results = [];

    for (let i = 0; i < 100; i++) {

        results.push(
          <img
            key={`image${i}`}
            src={`https://placehold.it/4${i < 10 ? `0${i}` : i }x4${i < 10 ? `0${i}` : i }`}
            alt="placeholder"
            width={`4${i < 10 ? `0${i}` : i }`}
            height={`4${i < 10 ? `0${i}` : i }`}
            loading="lazy"
          />
        )

    }

      return (
        <div style={{ width: '400px' }}>
          {results}
        </div>
      )

    }

  }



  ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

 类似资料:
  • 我正在使用Mika Tuupola的jQuery延迟加载。 是否可以在每次延迟加载图像后调用函数。 我打算做的是跟踪图像的浏览次数。因此,如果图像是延迟加载的,这意味着用户已经看到了图像,我将通过在后台执行HTTP GET,将数据库中的计数器增加1。

  • Flask 通常配合装饰器使用,装饰器使用非常简单,而且使您可以将 URL 和处理它的函数 放在一起。然而这种方法也有一种不足: 这就意味着您使用装饰器的代码必须在前面导入, 否则 Flask 将无法找到您的函数。 这对于需要很快导入的应用程序来说是一个问题,这种情况可能出现在类似谷歌的 App Engine 这样的系统上。所以如果您突然发现您的引用超出了这种方法可以处理 的能力,您可以降级到中央

  • 我正在使用这个插件jQuery延迟内容、图像和背景延迟加载程序 我尝试在延迟加载后向图像添加图像边框颜色和图像边框厚度,但似乎没有效果。若我在开发者控制台按“inspect”,我可以看到这个属性被添加到图像样式中,但它的效果并没有显示在屏幕上。 超文本标记语言 JQuery

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 我正在使用slick.js构建一个旋转木马。但是,即使我将属性从更改为,在我滚动到该图像之前,图像仍然会被加载。我怀疑这是因为我的图像中有标记。我的问题是如何防止浏览器加载响应图像,或者如何正确地延迟加载响应图像。 这是我的img标签的样本

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想