【发布时间】:2018-09-26 21:04:34
【问题描述】:
我想在 React 中无限期地重新加载静态 URL 上的图像。通过一些搜索,我得出了以下不太理想的解决方案。它有效,但我想消除图像加载的闪烁。我意识到问题是组件被重新渲染,然后图像加载。我见过几个例子,它们使用两张图片,一张作为占位符,加载一张隐藏,直到它使用onLoad 和setState 加载,但它们都假设图像数量有限。我怎样才能使这个显示在CardMedia 中的最后一个图像,直到新的图像被加载然后每五秒更换一次而不闪烁?
import React from 'react';
import ReactDOM from 'react-dom';
import { Card, CardMedia, CardTitle } from 'react-toolbox/lib/card';
const LIVE_IMAGE = 'https://cdn-images-1.medium.com/max/1600/1*oi8WLwC2u0EEI1j9uKmwWg.png';
class LiveImageCard extends React.Component {
constructor(props) {
super(props);
this.state = {
liveImage: null
};
}
componentDidMount() {
this.interval = setInterval(
() => this.setState({
liveImage: `${LIVE_IMAGE}?${new Date().getTime()}`,
}),
5000
);
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return (
<Card style={{width: '350px'}}>
<CardTitle title="Live Image" />
<CardMedia
aspectRatio="wide"
image={this.state.liveImage}
/>
</Card>
);
}
}
ReactDOM.render(
<LiveImageCard />,
document.getElementById('root'),
);
【问题讨论】:
-
问题来自这样一个事实,即当图像开始加载(但未完全加载)时,您正在切换
CardMedia中的图像源。您的 Card Media 组件应该为您处理,否则您将不得不自己编写并在图像开始加载和交换 HTML img 源之间使用中间 1s 超时:stackoverflow.com/questions/5438612/… -
感谢您的回复,但您的评论掩盖了问题。我已经尝试了多种方法来执行您的建议,但都没有奏效。例如,按照你的建议,我可以让我的
setInterval函数类似于const img = new Image(); img.onload = () => this.setState({ liveImage: img }); img.src = `${LIVE_IMAGE}?${new Date().getTime()}`; this.setState({ temp: img });但 React 或 React-Toolbox 不喜欢在Image属性中使用Image对象。
标签: javascript reactjs react-toolbox