【发布时间】:2016-11-08 12:40:44
【问题描述】:
- 请查看下面的 EDIT 3,因为我发现这不是 React 的问题,而是浏览器的 chaching 机制的问题。
我正在尝试创建一个应用程序,该应用程序可以从给定的图像 url 数组中创建一些简单的轮播。我编写了一个模块,它可以帮助我在加载所有图像后调用回调,这就是它的外观:
ImagesLoader.js
export default {
// a module that loads an array of images urls and when completes
// calls a callback with the images elements array
load(imagesUrlsArray, callback){
const imagesLoaded = [];
imagesUrlsArray.map((url) => {
const img = new Image();
img.onload = () => {
imagesLoaded.push(img);
if(imagesUrlsArray.length === imagesLoaded.length){
callback(imagesLoaded);
}
};
img.src = url;
});
}
}
我知道一旦加载了所有 url,我就可以使用 Promise 并解决,现在不检查错误。
这是我的组件使用从上面的模块中检索到的图像更新状态的地方:
componentDidMount() {
ImagesLoader.load(this.props.images, (loadedImages) => {
const imagesStateData = this.calculateImagesStateData(loadedImages);
this.setState(Object.assign({},
imagesStateData,
{
loaded: true,
loadedImages: loadedImages
}
));
});
}
每次重新加载图像时,当我单击下一个或上一个按钮(看下面的屏幕截图)时会发生什么,我不明白为什么。
这是我第一次用reactjs做这样的事情,用jquery没问题
这是我传递图片网址的方式:
export default class App extends Component {
render() {
var images = [
"http://www.wallpapereast.com/static/images/excellent-love-quotes-wallpaper-hd.jpg",
"http://www.wallpapereast.com/static/images/My-Samsung-Galaxy-S3-Wallpaper-HD-Landscapes1.jpg",
"https://s-media-cache-ak0.pinimg.com/236x/58/01/02/5801020fea36221ffba33633f99a7d81.jpg",
"http://www.wallpapereast.com/static/images/pier_1080.jpg",
"http://www.wallpapereast.com/static/images/wallpaper-black-hd-hd-wallpapers.jpg",
"http://1.bp.blogspot.com/-dvg12YJKaKg/UnVfkMke7jI/AAAAAAAAUaU/O86x5FMgEuk/s1600/longcat.gif"
];
var settings = {
autoPlay: true,
arrows: true
};
return (
<Layout>
<ReactCarousel images={images} width={500} height={300} settings={settings}/>
</Layout>
);
}
}
编辑:
设法举了一个简短的例子。 http://codepen.io/anon/pen/ObyRPX ,从构建这个示例中我可以看到,如果我不使用 ImageItem 组件并渲染一个简单的 <img src='image.src'/> 元素它工作得很好,所以我想我的问题出在 ImageItem 组件上。
编辑 2: 这很奇怪http://codepen.io/anon/pen/eBpdjx 在这里我只是改变了它,所以 ImageItem 呈现图像元素而不是 div 上的背景图像,它按预期工作。谁能解释一下有什么区别?
编辑 3:
显然,这不仅发生在 react 应用上,还发生在 jquery 应用上,请看这里:
http://codepen.io/anon/pen/VmvyPZ
当我尝试将图像加载为 css 的背景图像属性时,浏览器不会缓存图像并加载两次。
【问题讨论】:
-
对我来说效果很好:
https://jsfiddle.net/pleinx/hxcuruL6/。也许您与此问题有其他关系?看起来这个组件会被渲染两次 -
只有当我点击下一个/上一个按钮时才会第二次渲染。问题是它只加载图像两次,所以如果我继续单击下一个按钮,在下一轮图像显示中,它已经加载并渲染到 DOM 没有加载时间,正如预期的那样。我现在将尝试我的 codepen/jsfiddle 示例。不过谢谢
-
好的,举了一个简短的例子。
http://codepen.io/anon/pen/ObyRPX,从构建这个示例中我可以看到,如果我不使用ImageItem组件并渲染一个简单的<img src='image.src'/>元素它工作得很好,所以我想我的问题出在ImageItem组件上。你能帮我弄清楚那里有什么问题吗?编辑了我的问题 -
做一个小测试:
ImagesLoader将图像直接加载到您的滑块包装器中(您在此处正常执行的操作ImageItem)。所以计划:enable loader然后load images directly in your slider <ul> list然后hide loader。我快速测试了它并且它工作正常(但我用你的提示测试了它不是在background: url(...)中加载图像,而是像你喜欢的<img src="img.jpg/>一样。正如你稍后在网络选项卡(检查器)中看到的那样,你只会看到来自启动器的图像“react.min.js”。我不确定,但我认为反应会像 jquery 预加载图像这样的常规方式。 -
好的,这很奇怪
http://codepen.io/anon/pen/eBpdjx在这里我只是将其更改为图像元素而不是背景图像,它按预期工作。谁能解释一下有什么区别?
标签: javascript image dom browser-cache preload