LoginSignup
8
5

More than 5 years have passed since last update.

[react:day1.2] とりあえず動的に何か表示したい欲求

Posted at

環境

ここと同じアプリをそのまま使ってます

何を表示しよう。。。

アイドルかな

アイドルネッサンスのメンバーの名前と写真を表示する

アイドルネッサンスHP
スクリーンショット 2018-01-30 19.18.04.png

イメージ図

tagの入れ子イメージ

    Member
        L MemberName
        L MemberImage

まずは親になるMemberタグを作ってみよう

# appのrootにcomponentsディレクトリを作ってそこにtagを作る
mkdir components

Memberのカスタムコンポーネントを作成

components/member.js
import React, { Component } from 'react';

export default class Member extends Component {
  render() {
    return (
      <h1> test name </h1>
    );
  }
}

index.jsでimportして表示

index.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import Member from '../components/member';

ReactDOM.render(<Member/>, document.getElementById('root'));
registerServiceWorker();

errorになった
スクリーンショット 2018-01-30 19.50.16.png

index.jsからmember.jsのimportに失敗
errorメッセージをみるとsrcディレクトリ内に入れれば入れれば参照できるらしい

mv ./components/ ./src/

index.jsのimportのパスも変更

index.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
- import Member from '../components/member';
+ import Member from './components/member';
ReactDOM.render(<Member/>, document.getElementById('root'));
registerServiceWorker();

再度確認
スクリーンショット 2018-01-30 20.04.09.png

でた〜😀

子要素のMemberNameとMemberImageを作成

src/components/menber-name.js
import React, { Component } from 'react';

export default class MemberName extends Component {
  render() {
    return(
      <span>menber name</span>
    );
  }
}
src/components/menber-image.js
import React, { Component } from 'react';

export default class MemberImage extends Component {
  render() {
    return(
      <span>membar image</span>
    );
  }
}

親のMemberでMemberNameとMemberImageをimportしてみる

src/components/menber.js
import React, { Component } from 'react';
import MemberName from './member-name';
import MemberImage from './member-image';

export default class Member extends Component {
  render() {
    return(
      <h1> test name </h1>
      <MemberName/>
      <MemberImage/>
    );
  }
}

reload
スクリーンショット 2018-01-30 20.24.51.png

またerrorに出会えました。

Syntax error: Adjacent JSX elements must be wrapped in an enclosing tag

複数行ある場合は何か適当なタグでwrapしなきゃいけないみたいですね。
divタグで囲んで再表示

src/components/menber.js
import React, { Component } from 'react';
import MemberName from './member-name';
import MemberImage from './member-image';

export default class Member extends Component {
  render() {
    return(
+      <div>
        <h1> test name </h1>
        <MemberName/>
        <MemberImage/>
+      </div>
    );
  }
}

でた〜〜〜〜😄
スクリーンショット 2018-01-30 20.29.48.png

dataを渡して表示してみる

各コンポーネントの土台はできたので次はデータから動的に表示してみる

propsに出会う

コンポーネントをrenderする時にデータを引き渡せる。
そのデータを参照する為にコンポーネント内でpropsという変数を使う

試しにindex.jsからMemberにデータを渡してみる

index.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import Member from './components/member';

// Memberに渡す変数
var testData = 'index.jsからお届け'
ReactDOM.render(<Member testData={testData}/>, document.getElementById('root'));
registerServiceWorker();

{this.props.testData}を表示してみる

member.js
import React, { Component } from 'react';
import MemberName from './member-name';
import MemberImage from './member-image';

export default class Member extends Component {
  render() {
    return(
      <div>
        <h1>{this.props.testData}</h1>
        <MemberName/>
        <MemberImage/>
      </div>
    );
  }
}

スクリーンショット 2018-01-30 20.38.49.png

った〜〜😆

tips

癖で var を使って宣言しているものがあるが時代的(ES6)に
const, letで宣言した方がよい。以後、そうします。今からそうします。次の行から変えます!

ではデータを渡していきましょう

index.jsでデータを宣言する

index.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import Member from './components/member';

// Memberに渡す変数
const memberList = [
  {
    name:'宮本茉凜'
    ,image:'http://idolrenaissance.com/images/home/member/marin.jpg'
  }
  ,{
    name:'原田珠々華'
    ,image:'http://idolrenaissance.com/images/home/member/suzuka.jpg'
  }
  ,{
    name:'百岡古宵'
    ,image:'http://idolrenaissance.com/images/home/member/koyoi.jpg'
  }
  ,{
    name:'石野理子'
    ,image:'http://idolrenaissance.com/images/home/member/riko.jpg'
  }
  ,{
    name:'南端まいな'
    ,image:'http://idolrenaissance.com/images/home/member/maina.jpg'
  }
  ,{
    name:'比嘉奈菜子'
    ,image:'http://idolrenaissance.com/images/home/member/nanako.jpg'
  }
  ,{
    name:'野本ゆめか'
    ,image:'http://idolrenaissance.com/images/home/member/yumeka.jpg'
  }
  ,{
    name:'新井乃亜'
    ,image:'http://idolrenaissance.com/images/home/member/noa.jpg'
  }
];

ReactDOM.render(<Member memberList={memberList}/>, document.getElementById('root'));
registerServiceWorker();

Memberでlistを回して表示

member.js
import React, { Component } from 'react';
import MemberName from './member-name';
import MemberImage from './member-image';

export default class Member extends Component {
  render() {
    return(
      <div>
        {this.props.memberList.map((member) => {
          return (
            <div>
              <MemberName memberName={member.name}/>
              <MemberImage memberImage={member.image}/>
            </div>
          );
        })}
      </div>
    );
  }
}

子要素で引き渡された情報を表示

menmber-name.js
import React, { Component } from 'react';

export default class MemberName extends Component {
  render() {
    return(
      <span>{this.props.memberName}</span>
    );
  }
}
member-image.js
import React, { Component } from 'react';

export default class MemberImage extends Component {
  render() {
    return(
      <span>{this.props.memberImage}</span>
    );
  }
}

でた〜、が
スクリーンショット 2018-01-30 21.00.58.png

データを表示できたけどconsoleにerrorが出る

Warning: Each child in an array or iterator should have a unique "key" prop.

なんだろうか。。。

google先生の回答
「ループで回して生成する時はkeyをつけなさい」
「keyがあれば差分だけ再描画されるのである!」

keyはなんでも良さそうなのでmapのindexを設定する

member.js
import React, { Component } from 'react';
import MemberName from './member-name';
import MemberImage from './member-image';

export default class Member extends Component {
  render() {
    return(
      <div>
        {this.props.memberList.map((member, index) => {
          return (
            <div key={index}>
              <MemberName memberName={member.name}/>
              <MemberImage memberImage={member.image}/>
            </div>
          );
        })}
      </div>
    );
  }
}

消えたん
スクリーンショット 2018-01-30 21.13.11.png

memberImageを画像が表示される様にする

member-image.js
import React, { Component } from 'react';

export default class MemberImage extends Component {
  render() {
    return(
      <img src={this.props.memberImage}/>
    );
  }
}

スクリーンショット 2018-01-30 21.16.32.png

Reactでstyleを設定する

個人的にはsassで書くのが一番しっくりくるのだが、どんなものがあるのか軽く調査してたら、、、

いろいろあるので次回!

8
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5