質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

453閲覧

Reactで配列の表示方法を分けて並べたい

k10a

総合スコア35

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2018/07/25 09:07

編集2018/07/25 09:10

前提・実現したいこと

Reactでアイテムを選択した後に、配列を一つを大きく詳細表示し、残りをサムネイル表示し、右アイコン、左アイコンを押すと主張される表示が回るように表示される仕組みを作りたいと考えています。どう説明したら良いのかわからず、理解しにくい説明となってしまい申し訳ございません。

イメージとしては下記のようなものをイメージしています。
現在は「1」が主張表示されていますが、右を押すと「2」が主張表示され、「1」は「4」の位置にずれます。左を押すとその逆の動きをします。

イメージ説明

試してみたこと

・まず、データに「mainView」という要素を追加します
・一番始めに選択したものにのみ「mainView」をtrueにします
・左右を押すと、「mainView」をfalseにして、次のアイテムをtrueにする

=> これを試みると、一度選択したものを非選択した時に、詰めて一番始めになったものが「mainView」Trueとならない仕様になる。

コードに写す前に何から始めれば良いのか検討がつかないような状態です。ライブラリがあれば、それも採用したいと考えています。

極めて抽象的ではありますが、どなたかお助けくださいませ。

また、配列で取得したアイテムの番号(一番最初に取ってきたものを「No.1」、次に取ってきたものを「No.2」)と表示したいのですが、これはIndexを使えば取れるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

いろいろなやり方があると思いますので、あくまで一例として、以下のような感じでいかがでしょうか?
(※矢印にFont Awesome を、ダミーの画像に dummyimage を使用しています。)

javascript

1 2const Thumbnails = ({mainImageIndex, imageUrls}) => { 3 const thumbs = [...Array(imageUrls.length-1)].map((_, i) => 4 <div key={i}> 5 <img src={imageUrls[(mainImageIndex + i + 1) % imageUrls.length]} /> 6 </div> 7 ); 8 9 return <div className="thumbs">{thumbs}</div>; 10}; 11 12class App extends React.Component { 13 constructor(props) { 14 super(props); 15 16 this.imageUrls = [ 17 'https://dummyimage.com/360x240/f29b91/fff&text=1', 18 'https://dummyimage.com/360x240/efbd40/fff&text=2', 19 'https://dummyimage.com/360x240/81d654/fff&text=3', 20 'https://dummyimage.com/360x240/f092c4/fff&text=4', 21 ]; 22 23 this.onArrowClicked = this.onArrowClicked.bind(this); 24 25 this.state = { 26 mainImageIndex: 0 27 }; 28 } 29 30 onArrowClicked(direction) { 31 return () => { 32 let index = this.state.mainImageIndex; 33 switch(direction) { 34 case 'next': 35 index = (index + 1) % this.imageUrls.length; 36 break; 37 case 'prev': 38 index = index > 0 ? index - 1 : this.imageUrls.length - 1; 39 break; 40 } 41 this.setState({ mainImageIndex: index }); 42 }; 43 } 44 45 render() { 46 return ( 47 <div className="app"> 48 <div className="main-image"> 49 <div onClick={this.onArrowClicked('prev')}><i className="fas fa-arrow-left fa-4x"></i></div> 50 <div><img src={this.imageUrls[this.state.mainImageIndex]}/></div> 51 <div onClick={this.onArrowClicked('next')}><i className="fas fa-arrow-right fa-4x"></i></div> 52 </div> 53 <Thumbnails mainImageIndex={this.state.mainImageIndex} imageUrls={this.imageUrls} /> 54 </div> 55 ); 56 } 57} 58 59ReactDOM.render(<App />, document.querySelector("#app")) 60 61

以下は、上記のコードのデモです。

https://jsfiddle.net/jun68ykt/3kt29qzc/8/

参考になれば幸いです。

投稿2018/07/26 05:45

編集2018/07/26 06:06
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k10a

2018/07/26 06:17

jun68kytさま、大変詳しいご説明を頂きまして、誠にありがとうございます。 参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問