在同构渲染页面图像可以在主script.js文件之前下载。所以图像可以在react注册onLoad事件之前已经加载- 永远不会触发这个事件。
script.js
constructor(props) {
super(props);
this.handleImageLoaded = this.handleImageLoaded.bind(this);
}
handleImageLoaded() {
console.log('image loaded');
}
render() {
return (
<img src='image.jpg' onLoad={this.handleImageLoaded} />
);
}
场景 1 -image.jpg大于script.js
在这种情况下,一切正常。在最终加载图像之前注册事件,因此在控制台中是image loaded消息。
场景 2 -image.jpg小于script.js
这个场景你可以看到文章开头描述的问题。onLoad事件未触发。
问题
我该怎么做才能触发场景 2 中的onLoad事件?
编辑:Soviut 答案实现
要检测图像是否已准备好渲染,您应该检查complete纯 javascriptimg对象的属性:
constructor(props) {
super(props);
this.state = { loaded: false };
this.handleImageLoaded = this.handleImageLoaded.bind(this);
this.image = React.createRef();
}
componentDidMount() {
const img = this.image.current;
if (img && img.complete) {
this.handleImageLoaded();
}
}
handleImageLoaded() {
if (!this.state.loaded) {
console.log('image loaded');
this.setState({ loaded: true });
}
}
render() {
return (
<img src='image.jpg' ref={this.image} onLoad={this.handleImageLoaded} />
);
}

