質問するログイン新規登録

回答編集履歴

4

テキスト修正

2019/06/15 12:10

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -181,7 +181,7 @@
181
181
 
182
182
  この時点では、 `CarouselTest` の render は、 `<div></div>` を返すだけのものです。
183
183
 
184
- **(2) **上記で作った、CarouselTest の返す `<div>` に、以下のように `<img>` だけを含むイテムを、適当な個数(以下では8個にしています)含む <Carousel> を作ります。とりあえずカルーセルが動くかだけを確認できればよいので、画像は同じものでよいですし、`map` を使う必要もないですので、以下のようなものでテストします。
184
+ **(2) **上記で作った、CarouselTest の返す `<div>` に、以下のように `<img>` だけを含むイテムを、適当な個数(以下では8個にしています)含む `<Carousel>` を作ります。とりあえずカルーセルが動くかだけを確認できればよいので、画像は同じものでよいですし、`map` を使う必要もないですので、以下のようなものでテストします。
185
185
 
186
186
  **CarouselTest: render()**
187
187
  ```

3

テキスト修正

2019/06/15 12:10

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -171,7 +171,7 @@
171
171
 
172
172
  とのことですが、シンプルなカルーセルから初めて徐々に複雑にしいくように作業手順を見直してみてはいかがでしょうか、というのが私の提案になります。
173
173
 
174
- `Beach` コンポーネントはが画像があったりキャプションがあったりし、かつ、様々なCSSクラスが追加されているものですが、カルーセルのライブラリを使うときにこのような(言っみれば)かなり作り込んだものをカルーセルのアイテムとして、カルーセルのライブラリに与えても、うまく動くとは限らないのではと思います。
174
+ `Beach` コンポーネントはが画像があったりキャプションがあったりし、かつ、様々なCSSクラスが追加されているものですが、カルーセルのライブラリを使うときにこのような、スタイル含めてかなり作り込んだものをカルーセルのアイテムとして、カルーセルのライブラリに与えても、うまく動くとは限らないのではと思います。
175
175
 
176
176
  参考までに私がTexonさんのお作りになった現状のコードを引き継いで、カルーセルが意図通りに動くものにしていくとしたら、どのような手順でやっていくかという見通しを回答します。(以下ではReactによるSPAを想定しており、ローカルでのトップページは、 http://localhost:3000 で確認できると仮定します。)
177
177
 

2

テキスト修正

2019/06/14 12:50

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -106,7 +106,7 @@
106
106
 
107
107
  以上参考になれば幸いです。
108
108
 
109
- ### 追記
109
+ ### 追記1
110
110
 
111
111
  上記の回答で、
112
112
  ```javascript
@@ -158,4 +158,102 @@
158
158
  />)
159
159
  )}
160
160
  </Carousel>
161
- ```
161
+ ```
162
+
163
+
164
+ ### 追記2
165
+
166
+ コメントから頂きました以下について、
167
+
168
+ > Display:none;
169
+ が画像に当たってしまっているようなのですが、仕様なのでしょうか?
170
+ Documentを読み直したり、React-slickを検討してみたり、下記のように{`require({this.props.BHimg})`}など試してみたのですが、画像だけ表示が出ないです。。。
171
+
172
+ とのことですが、シンプルなカルーセルから初めて徐々に複雑にしいくように作業手順を見直してみてはいかがでしょうか、というのが私の提案になります。
173
+
174
+ `Beach` コンポーネントはが画像があったりキャプションがあったりし、かつ、様々なCSSクラスが追加されているものですが、カルーセルのライブラリを使うときにこのような(言ってみれば)かなり作り込んだものをカルーセルのアイテムとして、カルーセルのライブラリに与えても、うまく動くとは限らないのではと思います。
175
+
176
+ 参考までに私がTexonさんのお作りになった現状のコードを引き継いで、カルーセルが意図通りに動くものにしていくとしたら、どのような手順でやっていくかという見通しを回答します。(以下ではReactによるSPAを想定しており、ローカルでのトップページは、 http://localhost:3000 で確認できると仮定します。)
177
+
178
+ **(1)** まず、カルーセルを作っていくための白紙のページを用意します。具体的には中身が空のコンテナコンポーネントを、名前は例えば`CarouselTest` として作成し、これが、
179
+ http://localhost:3000/spikes/carousel-test
180
+ のようなURLによってにルーティングされるようにします。spikes はスパイク(技術検証)で作ったもの、の意図です。
181
+
182
+ この時点では、 `CarouselTest` の render は、 `<div></div>` を返すだけのものです。
183
+
184
+ **(2) **上記で作った、CarouselTest の返す `<div>` に、以下のように `<img>` だけを含むイテムを、適当な個数(以下では8個にしています)含む <Carousel> を作ります。とりあえずカルーセルが動くかだけを確認できればよいので、画像は同じものでよいですし、`map` を使う必要もないですので、以下のようなものでテストします。
185
+
186
+ **CarouselTest: render()**
187
+ ```
188
+ <div>
189
+ <Carousel>
190
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
191
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
192
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
193
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
194
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
195
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
196
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
197
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
198
+ </Carousel>
199
+ </div>
200
+ ```
201
+
202
+
203
+ これで、http://localhost:3000/spikes/carousel-test をブラウで表示したときに、カルーセルが意図通り表示されて期待通りの動きをするかを確認します。
204
+
205
+
206
+ **(3)** (2) の確認がOKであれば、次にカルーセルのアイテムをひとつのコンポーネントにします。 仮に `SimpleBeach` とすると、
207
+
208
+ ```jsx
209
+ const SimpleBeach = () => (
210
+ <Carousel.Item>
211
+ <img src="./img/bch/osaka.jpg" />
212
+ </Carousel.Item>
213
+ )
214
+ ```
215
+
216
+ のようなものになでしょう。これを使うと、 `CarouselTest` の `<Carousel>` の中に 8個の `SimpleBeach` を生成するコードは以下のようになります。ここで map を使います。
217
+
218
+
219
+ **CarouselTest: render()**
220
+ ```
221
+ <div>
222
+ <Carousel>
223
+ {[...Array(8)].map((_,i) => (
224
+ <SimpleBeach key={i} />
225
+ ))}
226
+ </Carousel>
227
+ </div>
228
+ ```
229
+ 上記では、配列のインデクスをkey に使っているので、警告が出ますが、スパイクで作っているものなので、後で修正すればよいのでここでは気にせずともよいでしょう。
230
+
231
+ (2) から (3) の修正では、単に `<Carousel.Item>` 1個分のコンポーネントを括りだしただけなので、 (2) が意図通り動くのであれば、上記も動くはずです。
232
+
233
+
234
+ **(4) **次にSimpleBeachに `<Carousel.Caption>` を追加します。
235
+
236
+ ```jsx
237
+ const SimpleBeach = () => (
238
+ <Carousel.Item>
239
+ <img src="./img/bch/osaka.jpg" />
240
+ <Carousel.Caption>
241
+ <p>osaka</p>
242
+ </Carousel.Caption>
243
+ </Carousel.Item>
244
+ )
245
+ ```
246
+
247
+ ここでは、 `<p>osaka</p>` をキャプションの中身にしました。これで動くかを確認します。
248
+
249
+
250
+
251
+ このようにして、白紙のページにもっともシンプルな `<Carousel>` を作ってそれを出発点にして、ちょっとした変更、追加を加えるたびに動作確認をしていきます。このような作業をやっていってCSSクラスをあてるなどして、もともとの `<Beach>` に近づけていったときに、どこかで不具合が起きるかもしれません。カルーセルのライブラリが各アイテムに付与しているクラスだったりスタイルなどが、独自に与えたデザインのためのクラスによるスタイルと干渉しあって、うまくカルーセルが動かなくなることも考えられます。このように、シンプルでデザインは何もあたっていないがカルーセルとして動くということを確認しながら、`<BeachSimple>` を少しずつ複雑にしていくように進めていけば、どこで動かなくなるかが特定できます。このやり方では、どんな小さな修正を加えても動くことを確認しながら進めることが肝心です。
252
+
253
+ なおこのような作業をやるときは Git などのバージョン管理システムが便利です。この場合であれば、カルーセルのスパイクをやるための作業ブランチを作り、追加、修正をして動かなくなったときに、意図通り動いていた最新ものにすぐ戻れるように、些細な追加、変更をしただけでも、その修正をコミットしていきます。
254
+
255
+ このように、確実に動く最もシンプルなものから追加、修正を積み上げていく作業をやっていき、 スパイクとして作っていた`SimpleBeach` をどこかで `Beach` に置き換えても良さそうという完成度になったら、開発の本流ブランチへマージすればよいかと思います。
256
+
257
+ 私が、今回のカルーセルなどのような何らかの新たなコンポーネントを利用するときは、上記のように、そのライブラリを試すためのいわばクリーンルームとしての白紙のページを作り、そのライブラリのドキュメントにあるサンプルをコピペして、「確実に動くもの」を出発点にして、業務の要件に応えられるものに徐々に近づけていき、要件を満たすものになりそうかという点を検討しながらカスタマイズしていくという手順を踏むと思います。
258
+
259
+ 以上参考になれば幸いです。

1

テキスト修正

2019/06/14 10:31

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -104,4 +104,58 @@
104
104
 
105
105
  上記の修正だけで、質問者様の要件を完全に満たすものとして動作するかは分かりませんが、以上が、今のままだと明らかに拙いと思う点とその修正の方針になります。
106
106
 
107
- 以上参考になれば幸いです。
107
+ 以上参考になれば幸いです。
108
+
109
+ ### 追記
110
+
111
+ 上記の回答で、
112
+ ```javascript
113
+ <Carousel>
114
+ {BeachList.map((beachItem, i) => (
115
+ <Beach
116
+ key={i}
117
+ BHlink={beachItem.BHlink}
118
+ BHimg={beachItem.BHimg}
119
+ BHtitle={beachItem.BHtitle}
120
+ BHprc={beachItem.BHprc}
121
+ />)
122
+ )}
123
+ </Carousel>
124
+ ```
125
+
126
+ と書きましたが、 prop `key` に配列のインデクスを渡すのは、(CodePenのほうのサンプルコードもそうなってますが、)推奨されません。
127
+
128
+ できれば `BeachList` の要素に、重複しない値をもつ(`id` のような)プロパティを追加して、以下のようにするのがベターです。
129
+
130
+ ```javascript
131
+ const BeachList = [
132
+ {
133
+ id: 100,
134
+ BHlink: "#link",
135
+ BHimg: "./img/bch/osaka.jpg",
136
+ BHtitle: "Osaka",
137
+ BHprc: "6,160JPY/night average"
138
+ },
139
+ {
140
+ id: 101,
141
+ BHlink: "#link",
142
+ BHimg: "./img/bch/kyoto.jpg",
143
+ BHtitle: "kyoto",
144
+ BHprc: "6,160JPY/night average"
145
+ },
146
+ ...
147
+ ```
148
+
149
+ ```javascript
150
+ <Carousel>
151
+ {BeachList.map(beachItem => (
152
+ <Beach
153
+ key={beachItem.id}
154
+ BHlink={beachItem.BHlink}
155
+ BHimg={beachItem.BHimg}
156
+ BHtitle={beachItem.BHtitle}
157
+ BHprc={beachItem.BHprc}
158
+ />)
159
+ )}
160
+ </Carousel>
161
+ ```