我的目标是让我的图库图片在加载时呈现
在线查看,我了解了onLoad
方法
这是我试图利用的,这个想法是preloader.gif
会在图像加载之前呈现,只需用加载的图像替换图像src。
就像现在(下图)一样,如果我没有使用onLoad
方法,图像看起来像往常一样加载,所以有一个时刻没有图像呈现在所有在图像加载之前。
我到底做错了什么?
我已经删除了代码,使问题更容易阅读。
import React from 'react';
import ReactDOM from 'react-dom';
import preloaderImage from '../../../img/site/preloader.gif';
class WorksPage extends React.Component {
constructor(){
super();
}
imageLoadHandler(image,e) {
e.target.src = image;
}
render() {
const listWork = this.props.array.map((item,index)=> {
return(
<li key={item.id}>
<div>
<img src={preloaderImage} onLoad={this.imageLoadHandler.bind(this,item.image)}/>
</div>
</li>
)
});
return(
<li>
<div>
<ul>
{listWork}
</ul>
</div>
</li>
)
}
}
module.exports = WorksPage;
答案 0 :(得分:10)
preloader
图片未呈现的原因的解释:preloaderImage
加载imageLoadHandler
时触发器src
属性更改为主image
src(因此preloaderImage
即使现在已加载state
也未呈现如果您编写React应用程序,则应该以React方式执行:
将图片设置为constructor
方法中的组件props
。你需要这样做,因为你要改变图像的渲染方式(在React中你通过改变组件state
或state
来实现渲染更改,在你的情况下它应该是{ {1}})。但请注意,您应该将列表中每个图片的src
属性设置为preloaderImage
(例如下面我使用的是object destructuring
语法)。
constructor() {
super();
this.state = {
images: this.props.images.map(image => ({
...image,
src: preloaderImage
}))
}
}
现在在render
方法中创建这样的图片列表(注意,这里你不需要onLoad
处理程序):
const listWork = this.state.images.map(image => (
<li key={image.id}>
<div>
<img src={image.src} />
</div>
</li>
));
在componentWillMount
方法中,开始使用vanilla JS动态加载主图像src
(您可以阅读有关它的文章here
)。在加载它们时,请调用setState
方法来更新图像src
属性:
componentWillMount() {
this.state.images.forEach((image, index) => {
const {src} = this.props.images[index] // get image primary src
const primaryImage = new Image() // create an image object programmatically
primaryImage.onload = () => { // use arrow function here
console.log(`image #${index + 1} is loaded!`)
const images = [...this.state.images] // copy images array from state
images[index].src = src // adjust loaded image src
this.setState({
images
})
}
primaryImage.src = src // do it after you set onload handler
})
}
使用更改后的setState
数组调用images
后,React会自动使用正确的src
路径重新渲染您的图片。
您可以将<img />
标记用于<div />
css属性,而不是background-image
标记。在那里你可以简单地设置你的后备(预加载)图像:
background-image: url('path/to/primary-image'), url('path/to/preload-image');
您可以使用style
属性动态设置路径(使用render
方法):
const listWork = this.props.images.map(image => {
const imageStyle = {
backgroundImage: `url(${image.src}), url(${preloaderImage});`
}
return (
<li key={image.id}>
<div>
<div style={imageStyle} />
</div>
</li>
)
})
不要忘记将height
和width
设置为此<div />
。
答案 1 :(得分:1)
不知道这是否有帮助,但您可以在加载时为图像设置CSS属性(例如,不透明度或可见性设置不显示图像),然后在onLoad
事件时更改该CSS属性被解雇了。你可以使用相同的预加载器图像,但显然在反向模式。
如果图像无法加载,您也应该可以通过调用onError
函数来设置后备操作,也可以在正在加载的图像中。
希望这有帮助!