Want an easy way to make your images a little more graceful? This recipe is for an Image component that fades in once the image is loaded. You can see it in action here.
.image { opacity: 0; transition: opacity 0.3s; }
.image-loaded { opacity: 1; }
var classNames = require('classnames');
var Image = React.createClass({
getInitialState: function() {
return {
loaded: false
};
},
onImageLoad: function() {
if (this.isMounted()) {
this.setState({ loaded: true });
}
},
componentDidMount: function() {
var imgTag = ReactDOM.findDOMNode(this.refs.img);
var imgSrc = imgTag.getAttribute('src');
// You may want to rename the component if the <Image> definition
// overrides window.Image
var img = new window.Image();
img.onload = this.onImageLoad;
img.src = imgSrc;
},
render: function() {
var { className, ...props } = this.props;
var imgClasses = 'image';
var rootClassName = classNames(className, 'image', {
'image-loaded': this.state.loaded,
});
return (
<img ref="img" {...props} className={rootClassName} />
);
}
});
ReactDOM.render(
<Image src="path/to/image" />,
node
);
See this JSBin for a working example.
Although this recipe is pretty straightforward, it shows the power of reusable components. Getting images to fade becomes a matter of replacing <img>
with <Image>
.
The last tutorial introduces React's virtual DOM and how React performs updates.
Subscribe for a range of articles from React basics to advanced topics such as performance optimization and deep dives in the React source code.