回答編集履歴

4

テキスト修正

2019/06/15 12:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -364,7 +364,7 @@
364
364
 
365
365
 
366
366
 
367
- **(2) **上記で作った、CarouselTest の返す `<div>` に、以下のように `<img>` だけを含むイテムを、適当な個数(以下では8個にしています)含む <Carousel> を作ります。とりあえずカルーセルが動くかだけを確認できればよいので、画像は同じものでよいですし、`map` を使う必要もないですので、以下のようなものでテストします。
367
+ **(2) **上記で作った、CarouselTest の返す `<div>` に、以下のように `<img>` だけを含むイテムを、適当な個数(以下では8個にしています)含む `<Carousel>` を作ります。とりあえずカルーセルが動くかだけを確認できればよいので、画像は同じものでよいですし、`map` を使う必要もないですので、以下のようなものでテストします。
368
368
 
369
369
 
370
370
 

3

テキスト修正

2019/06/15 12:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -344,7 +344,7 @@
344
344
 
345
345
 
346
346
 
347
- `Beach` コンポーネントはが画像があったりキャプションがあったりし、かつ、様々なCSSクラスが追加されているものですが、カルーセルのライブラリを使うときにこのような(言っみれば)かなり作り込んだものをカルーセルのアイテムとして、カルーセルのライブラリに与えても、うまく動くとは限らないのではと思います。
347
+ `Beach` コンポーネントはが画像があったりキャプションがあったりし、かつ、様々なCSSクラスが追加されているものですが、カルーセルのライブラリを使うときにこのような、スタイル含めてかなり作り込んだものをカルーセルのアイテムとして、カルーセルのライブラリに与えても、うまく動くとは限らないのではと思います。
348
348
 
349
349
 
350
350
 

2

テキスト修正

2019/06/14 12:50

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -214,7 +214,7 @@
214
214
 
215
215
 
216
216
 
217
- ### 追記
217
+ ### 追記1
218
218
 
219
219
 
220
220
 
@@ -319,3 +319,199 @@
319
319
  </Carousel>
320
320
 
321
321
  ```
322
+
323
+
324
+
325
+
326
+
327
+ ### 追記2
328
+
329
+
330
+
331
+ コメントから頂きました以下について、
332
+
333
+
334
+
335
+ > Display:none;
336
+
337
+ が画像に当たってしまっているようなのですが、仕様なのでしょうか?
338
+
339
+ Documentを読み直したり、React-slickを検討してみたり、下記のように{`require({this.props.BHimg})`}など試してみたのですが、画像だけ表示が出ないです。。。
340
+
341
+
342
+
343
+ とのことですが、シンプルなカルーセルから初めて徐々に複雑にしいくように作業手順を見直してみてはいかがでしょうか、というのが私の提案になります。
344
+
345
+
346
+
347
+ `Beach` コンポーネントはが画像があったりキャプションがあったりし、かつ、様々なCSSクラスが追加されているものですが、カルーセルのライブラリを使うときにこのような(言ってみれば)かなり作り込んだものをカルーセルのアイテムとして、カルーセルのライブラリに与えても、うまく動くとは限らないのではと思います。
348
+
349
+
350
+
351
+ 参考までに私がTexonさんのお作りになった現状のコードを引き継いで、カルーセルが意図通りに動くものにしていくとしたら、どのような手順でやっていくかという見通しを回答します。(以下ではReactによるSPAを想定しており、ローカルでのトップページは、 http://localhost:3000 で確認できると仮定します。)
352
+
353
+
354
+
355
+ **(1)** まず、カルーセルを作っていくための白紙のページを用意します。具体的には中身が空のコンテナコンポーネントを、名前は例えば`CarouselTest` として作成し、これが、
356
+
357
+ http://localhost:3000/spikes/carousel-test
358
+
359
+ のようなURLによってにルーティングされるようにします。spikes はスパイク(技術検証)で作ったもの、の意図です。
360
+
361
+
362
+
363
+ この時点では、 `CarouselTest` の render は、 `<div></div>` を返すだけのものです。
364
+
365
+
366
+
367
+ **(2) **上記で作った、CarouselTest の返す `<div>` に、以下のように `<img>` だけを含むイテムを、適当な個数(以下では8個にしています)含む <Carousel> を作ります。とりあえずカルーセルが動くかだけを確認できればよいので、画像は同じものでよいですし、`map` を使う必要もないですので、以下のようなものでテストします。
368
+
369
+
370
+
371
+ **CarouselTest: render()**
372
+
373
+ ```
374
+
375
+ <div>
376
+
377
+ <Carousel>
378
+
379
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
380
+
381
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
382
+
383
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
384
+
385
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
386
+
387
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
388
+
389
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
390
+
391
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
392
+
393
+ <Carousel.Item><img src="./img/bch/osaka.jpg" /></Carousel.Item>
394
+
395
+ </Carousel>
396
+
397
+ </div>
398
+
399
+ ```
400
+
401
+
402
+
403
+
404
+
405
+ これで、http://localhost:3000/spikes/carousel-test をブラウで表示したときに、カルーセルが意図通り表示されて期待通りの動きをするかを確認します。
406
+
407
+
408
+
409
+
410
+
411
+ **(3)** (2) の確認がOKであれば、次にカルーセルのアイテムをひとつのコンポーネントにします。 仮に `SimpleBeach` とすると、
412
+
413
+
414
+
415
+ ```jsx
416
+
417
+ const SimpleBeach = () => (
418
+
419
+ <Carousel.Item>
420
+
421
+ <img src="./img/bch/osaka.jpg" />
422
+
423
+ </Carousel.Item>
424
+
425
+ )
426
+
427
+ ```
428
+
429
+
430
+
431
+ のようなものになでしょう。これを使うと、 `CarouselTest` の `<Carousel>` の中に 8個の `SimpleBeach` を生成するコードは以下のようになります。ここで map を使います。
432
+
433
+
434
+
435
+
436
+
437
+ **CarouselTest: render()**
438
+
439
+ ```
440
+
441
+ <div>
442
+
443
+ <Carousel>
444
+
445
+ {[...Array(8)].map((_,i) => (
446
+
447
+ <SimpleBeach key={i} />
448
+
449
+ ))}
450
+
451
+ </Carousel>
452
+
453
+ </div>
454
+
455
+ ```
456
+
457
+ 上記では、配列のインデクスをkey に使っているので、警告が出ますが、スパイクで作っているものなので、後で修正すればよいのでここでは気にせずともよいでしょう。
458
+
459
+
460
+
461
+ (2) から (3) の修正では、単に `<Carousel.Item>` 1個分のコンポーネントを括りだしただけなので、 (2) が意図通り動くのであれば、上記も動くはずです。
462
+
463
+
464
+
465
+
466
+
467
+ **(4) **次にSimpleBeachに `<Carousel.Caption>` を追加します。
468
+
469
+
470
+
471
+ ```jsx
472
+
473
+ const SimpleBeach = () => (
474
+
475
+ <Carousel.Item>
476
+
477
+ <img src="./img/bch/osaka.jpg" />
478
+
479
+ <Carousel.Caption>
480
+
481
+ <p>osaka</p>
482
+
483
+ </Carousel.Caption>
484
+
485
+ </Carousel.Item>
486
+
487
+ )
488
+
489
+ ```
490
+
491
+
492
+
493
+ ここでは、 `<p>osaka</p>` をキャプションの中身にしました。これで動くかを確認します。
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+ このようにして、白紙のページにもっともシンプルな `<Carousel>` を作ってそれを出発点にして、ちょっとした変更、追加を加えるたびに動作確認をしていきます。このような作業をやっていってCSSクラスをあてるなどして、もともとの `<Beach>` に近づけていったときに、どこかで不具合が起きるかもしれません。カルーセルのライブラリが各アイテムに付与しているクラスだったりスタイルなどが、独自に与えたデザインのためのクラスによるスタイルと干渉しあって、うまくカルーセルが動かなくなることも考えられます。このように、シンプルでデザインは何もあたっていないがカルーセルとして動くということを確認しながら、`<BeachSimple>` を少しずつ複雑にしていくように進めていけば、どこで動かなくなるかが特定できます。このやり方では、どんな小さな修正を加えても動くことを確認しながら進めることが肝心です。
502
+
503
+
504
+
505
+ なおこのような作業をやるときは Git などのバージョン管理システムが便利です。この場合であれば、カルーセルのスパイクをやるための作業ブランチを作り、追加、修正をして動かなくなったときに、意図通り動いていた最新ものにすぐ戻れるように、些細な追加、変更をしただけでも、その修正をコミットしていきます。
506
+
507
+
508
+
509
+ このように、確実に動く最もシンプルなものから追加、修正を積み上げていく作業をやっていき、 スパイクとして作っていた`SimpleBeach` をどこかで `Beach` に置き換えても良さそうという完成度になったら、開発の本流ブランチへマージすればよいかと思います。
510
+
511
+
512
+
513
+ 私が、今回のカルーセルなどのような何らかの新たなコンポーネントを利用するときは、上記のように、そのライブラリを試すためのいわばクリーンルームとしての白紙のページを作り、そのライブラリのドキュメントにあるサンプルをコピペして、「確実に動くもの」を出発点にして、業務の要件に応えられるものに徐々に近づけていき、要件を満たすものになりそうかという点を検討しながらカスタマイズしていくという手順を踏むと思います。
514
+
515
+
516
+
517
+ 以上参考になれば幸いです。

1

テキスト修正

2019/06/14 10:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -211,3 +211,111 @@
211
211
 
212
212
 
213
213
  以上参考になれば幸いです。
214
+
215
+
216
+
217
+ ### 追記
218
+
219
+
220
+
221
+ 上記の回答で、
222
+
223
+ ```javascript
224
+
225
+ <Carousel>
226
+
227
+ {BeachList.map((beachItem, i) => (
228
+
229
+ <Beach
230
+
231
+ key={i}
232
+
233
+ BHlink={beachItem.BHlink}
234
+
235
+ BHimg={beachItem.BHimg}
236
+
237
+ BHtitle={beachItem.BHtitle}
238
+
239
+ BHprc={beachItem.BHprc}
240
+
241
+ />)
242
+
243
+ )}
244
+
245
+ </Carousel>
246
+
247
+ ```
248
+
249
+
250
+
251
+ と書きましたが、 prop `key` に配列のインデクスを渡すのは、(CodePenのほうのサンプルコードもそうなってますが、)推奨されません。
252
+
253
+
254
+
255
+ できれば `BeachList` の要素に、重複しない値をもつ(`id` のような)プロパティを追加して、以下のようにするのがベターです。
256
+
257
+
258
+
259
+ ```javascript
260
+
261
+ const BeachList = [
262
+
263
+ {
264
+
265
+ id: 100,
266
+
267
+ BHlink: "#link",
268
+
269
+ BHimg: "./img/bch/osaka.jpg",
270
+
271
+ BHtitle: "Osaka",
272
+
273
+ BHprc: "6,160JPY/night average"
274
+
275
+ },
276
+
277
+ {
278
+
279
+ id: 101,
280
+
281
+ BHlink: "#link",
282
+
283
+ BHimg: "./img/bch/kyoto.jpg",
284
+
285
+ BHtitle: "kyoto",
286
+
287
+ BHprc: "6,160JPY/night average"
288
+
289
+ },
290
+
291
+ ...
292
+
293
+ ```
294
+
295
+
296
+
297
+ ```javascript
298
+
299
+ <Carousel>
300
+
301
+ {BeachList.map(beachItem => (
302
+
303
+ <Beach
304
+
305
+ key={beachItem.id}
306
+
307
+ BHlink={beachItem.BHlink}
308
+
309
+ BHimg={beachItem.BHimg}
310
+
311
+ BHtitle={beachItem.BHtitle}
312
+
313
+ BHprc={beachItem.BHprc}
314
+
315
+ />)
316
+
317
+ )}
318
+
319
+ </Carousel>
320
+
321
+ ```