Q137796

by jun68ykt

HTML

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css">
<div id="app"></div>

CSS

.app {
  padding: 10px;  
}

.main-image, .thumbs {
  overflow: hidden;
}

.main-image { margin-left: 32px; }

.main-image div,
.thumbs div
{
  float: left;
}

.thumbs div
{
  margin-right: 5px;
}

.thumbs img {
  width: 180px;  
}

.main-image .fas {
  padding-top: 90px;
  padding-right: 10px;
  padding-left: 10px;
  color: #888;
}

React

const Thumbnails = ({mainImageIndex, imageUrls}) => {
  const thumbs = [...Array(imageUrls.length-1)].map((_, i) => 
  	<div key={i}>
      <img src={imageUrls[(mainImageIndex + i + 1) % imageUrls.length]} />
    </div>
  );
  
  return  <div className="thumbs">{thumbs}</div>;
};

class App extends React.Component {
  constructor(props) {
    super(props);
    
    this.imageUrls = [
        'https://dummyimage.com/360x240/f29b91/fff&text=1',
        'https://dummyimage.com/360x240/efbd40/fff&text=2',
        'https://dummyimage.com/360x240/81d654/fff&text=3',
        'https://dummyimage.com/360x240/f092c4/fff&text=4',        
      ];
      
    this.onArrowClicked = this.onArrowClicked.bind(this);
    
    this.state = {
     	mainImageIndex: 0
    };
  }
  
  onArrowClicked(direction) {
    return () => {
      let index = this.state.mainImageIndex;
      switch(direction) {
        case 'next':
          index = (index + 1) % this.imageUrls.length;
          break;
        case 'prev':
          index = index > 0 ? index - 1 : this.imageUrls.length - 1;
          break;          
      }      
      this.setState({ mainImageIndex: index });
    };
  }
  
  render() {
    return (
      <div className="app">
        <div className="main-image">
          <div onClick={this.onArrowClicked('prev')}><i className="fas fa-arrow-left fa-4x"></i></div>
          <div><img src={this.imageUrls[this.state.mainImageIndex]}/></div>
          <div onClick={this.onArrowClicked('next')}><i className="fas fa-arrow-right fa-4x"></i></div>
        </div>
        <Thumbnails mainImageIndex={this.state.mainImageIndex} imageUrls={this.imageUrls} />
      </div>
    );
  }
}

ReactDOM.render(<App />, document.querySelector("#app"))