You can use map()
to iterate through your images:
<picture>
{this.props.personas[this.state.index].images.map((item, i) => {
return (
<source
key={i}
media={item.mediaSize}
srcSet={item.imageUrl}
/>
);
})}
<img src={this.props.personas[this.state.index].defaultImage} />
</picture>
Check out the full demo below, or a modified version of your bin, here.
Demo
class Personas extends React.Component {
constructor(props, context, images) {
super(props);
this.state = {
index: 0
};
}
changePerson (e, index) {
e.preventDefault();
this.setState({
index: index
});
}
render() {
const thumbs = this.props.personas.map((current, idx) => {
return (
<a key={idx} className={'persona-link ' + (this.state.active ? 'active-link' : '')} >
<div >
<img src={current.thumbnail} onClick={(event) => this.changePerson(event, idx)}/>
</div>
</a>
)
});
return (
<div className='personas'>
<picture>
{this.props.personas[this.state.index].images.map((item, i) => {
return (
<source
key={i}
media={item.mediaSize}
srcSet={item.imageUrl}
/>
);
})}
<img src={this.props.personas[this.state.index].defaultImage} />
</picture>
<span className='personas-thumbnail'>
{thumbs}
</span>
</div>
)
}
}
ReactDOM.render(<Personas
personas = {[
{
thumbnail: '//via.placeholder.com/90x90',
defaultImage: '//via.placeholder.com/768x400',
images: [
{
imageUrl: '//via.placeholder.com/1024x400',
mediaSize: "(min-width: 500px)"
},
{
imageUrl: '//via.placeholder.com/1027x400',
mediaSize: "(min-width: 600px)"
}
]
}
]}
/>, document.querySelector('#app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
Useful links