【问题标题】:find size of react component or image before rendering在渲染之前找到反应组件或图像的大小
【发布时间】:2016-07-11 17:03:11
【问题描述】:

我有一个不同尺寸的图片列表。

images = ['https://example.com/1.jpg','https://example.com/2.jpg', ... ]

我想在渲染它们之前获取它们的高度数组。然后,我将仅根据 scrollHeight 渲染应在视口中的图像。例如使用React Infinte

我可以在 react 组件之外轻松做到这一点

let imgHeights =  images.map(imgUrl => {
    var img  = new Image()
    img.src = imgUrl
    return img.height;
})

但是 new image() 在 react 中不起作用,因为它依赖于 DOM。

我的 React 组件渲染方法如下所示。

var ImageList = (images) => {
     let buildImageList = images.map(imgUrl => {
         return <img src= {imgUrl}></img>
     })

     let imgHeights = images.map(imgUrl => {
         let img = new Image()
         img.src = imgUrl
         return img.height //this doesn't work 
     })

     return (
         <Infinte elemetHeight = {imgHeights} onInfiniteLoad ={buildImageList} />
     ) 
}

如何获得图像高度?我应该使用 ReactDOM 在临时 div 中渲染图像吗?

【问题讨论】:

  • 嗯应该可以工作,因为你并没有真正渲染new Image,只是使用api来获取高度。当您说“不起作用”时,您能详细说明什么不起作用吗? img.height 返回什么?
  • 每次都返回0。
  • 它返回 0。我认为新图像依赖于 DOM
  • 问题是当您在 Image 对象上设置 src 属性时,浏览器会异步获取图像。您需要注册onload 回调,以便在图像下载完成时收到通知。只有这样你才能得到尺寸。

标签: reactjs react-dom


【解决方案1】:

图像在 javascript 继续执行时异步下载,因此您需要等待它们加载才能记录它们的高度。您可以等待他们的onload 事件并执行类似的操作

 let imgHeights = {};
 images.forEach(imgUrl => {
     let img = new Image();
     img.src = imgUrl;
     img.onload = () => imgHeights[imgUrl] = img.height;
 })

这只是让你开始;您仍然需要弄清楚如何在它们准备就绪时渲染它们。

【讨论】:

  • 它有效。抱歉,我应该更仔细地阅读 Image API。谢谢。
  • 有没有类似视频的方式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2021-07-12
  • 2020-12-28
  • 2016-09-12
  • 2020-03-26
相关资源
最近更新 更多