React学習|コンポーネント|React

ソースの一部を切り出してコンポーネント化することができる。

切り出し前ファイル

例として以下のソースからLayoutクラスを切り出して別ファイルにする。

import React from "react";
import ReactDOM from "react-dom";

class Layout extends React.Component {
  render() {
    let name = "ken"
    return (
      <div>
        <h1>Welcome!!!!</h1>
        <h2>Welcome!!!!</h2>
        <p>{name} says</p>
        <p>{1+2}</p>
        <p>{this.get_result(2)}</p>
      </div>
    );
  }
  get_result(num) {
    return num * 100
  }
}

const app = document.getElementById('app');
ReactDOM.render(<Layout/>, app);

コンポーネント用のファイルを作成。

$ mkdir -p ./src/js/components
$ touch src/js/components/Layout.js

コマンドで書いたけど普通にFinderとかからベタっと作ってOK

コンポーネント用ファイルの中身を記述。

中身は、client.jsの中でコンポーネント化したいクラス部分をコピーし、他のコンポーネントから読み出せるようにexport defaultをつけたもの。

import React from "react";

export default class Layout extends React.Component {
  render() {
    let name = "ken"
    return (
      <div>
        <h1>Welcome!!!!</h1>
        <h2>Welcome!!!!</h2>
        <p>{name} says</p>
        <p>{1+2}</p>
        <p>{this.get_result(2)}</p>
      </div>
    );
  }
  get_result(num) {
    return num * 100
  }
}

コンポーネント読み込みファイル

読み込み側を元ファイルから以下のように変更。

class部分を切り出したのでまるごと削除し、importにてclassを読み込んでいる。

import React from "react";
import ReactDOM from "react-dom";
import Layout from "./components/Layout";

const app = document.getElementById('app');
ReactDOM.render(<Layout/>, app);

Layoutクラスの実体はLayout.jsに記述されているが、importしたことによりこのjsファイル中でも呼び出すことができる。

ヘッダ、ボディ、フッタでコンポーネントを分けてみる

import React from "react";

export default class Layout extends React.Component {
  render() {
    return (
      <header>
          <h1>ヘッダー</h1>
      </header>
    );
  }
}
import React from "react";

export default class Layout extends React.Component {
  render() {
    return (
      <article>
          <h2>ボディ</h2>
      </article>
    );
  }
}
import React from "react";

export default class Layout extends React.Component {
  render() {
    return (
      <footer>
          <p>フッター</p>
      </footer>
    );
  }
}

それらをLayout.jsでコンポーネントとして読み込む。

この場合のコンポーネントファイルへのパスはLayout.js(読み込むファイル)の場所からの相対。

import React from "react";
import Header from "./Header";
import Body from "./Body";
import Footer from "./Footer";

export default class Layout extends React.Component {
  render() {
    let name = "ken"
    return (
      <article>
          <Header />
          <Body />
          <Footer />
      </article>
    );
  }
}

そうすると、以下のようにindex.htmlにレンダリングして表示される。

<div id="app">
    <article>
        <header><h1>ヘッダー</h1></header>
        <article><h2>ボディ</h2></article>
        <footer><p>フッター</p></footer>
    </article>
</div>