クモのようにコツコツと

フロントエンドエンジニア イイダリョウの技術ブログ。略称「クモコツ」

【React】クラスコンポーネントで属性を設定する

Reactの続きです。前回はクラスを使ったコンポーネントを作りました。今回はこのクラスの中で属性やテキストを設定してみます。それによって汎用的な使い方ができるコンポーネントになります。それではいきましょう!

【目次】

※参考:【React】クラスを使ったコンポーネントの書き方(React.Component、render()、super()) - クモのようにコツコツと

※Reactでやってみたことまとめ
qiita.com

前回のおさらい

前回作ったものはこちら。

See the Pen React - component class1 by イイダリョウ (@i_ryo) on CodePen.

JSコード

//DOM取得
const text = document.querySelector('.text');

//JSXに埋め込む値
const h2Text = 'コンポーネントのクラス';
const name = 'くらす';

//コンポーネントのスタイル
const bgColor = {
    background: '#fcc',    
    padding: '10px',
}

//コンポーネント
class Hello extends React.Component {
    // コンストラクタ設定
    constructor(props) {
        super(props);
    }

    // JSXレンダリング
    render() {
        return <p style={bgColor}>こんにちは、{name}。</p>
    }
}

//JSXの中身
let elm = (
    <section className="h2_elem">
        <h2>{ h2Text }</h2>
        <div>
            <Hello />
        </div>
    </section>
);
    
ReactDOM.render(elm, text);

詳細は前回記事を参照

※参考:【React】クラスを使ったコンポーネントの書き方(React.Component、render()、super()) - クモのようにコツコツと

属性値を設定

今回も掌田さんの「React.js & Next.js入門」を参考に進める。

※参考:

React.js & Next.js超入門

React.js & Next.js超入門

CSS初期値とCSS設定を入れる連想配列を作る

最初にグローバル変数を設定。

   bgColor = '#fff';
    style = {};
  • 変数bgColorに背景色の初期設定
  • 変数styleに空の配列を入れる(ここにCSSスタイルを設定する)

コンストラクタにCSSを設定する

次にコンストラクタ設定を追加

   // コンストラクタ設定
    constructor(props) {
        super(props);
        this.bgColor = props.bgColor;
        this.padding = props.padding;
        this.style = {
            backgroundColor: this.bgColor,
            padding: '10px'
        }
    }
  • this.bgColorprops.bgColor
  • this.paddingprops.padding
  • this.styleの値は連想配列でCSS設定
  • backgroundColorはthis.bgColor`

JSXレンダリング設定にstyle属性を追加

JSXレンダリング設定にstyle属性を追加

   // JSXレンダリング
    render() {
        return <p style={this.style}>こんにちは、{name}。</p>
    }
  • pタグのstyle属性をthis.style

コンポーネントに背景色の固有値を設定

コンポーネントを3つに増やして背景色を個別に設定する。

//JSXの中身
let elm = (
    <section className="h2_elem">
        <h2>{ h2Text }</h2>
        <div>
            <Hello bgColor="#fcc" />
            <Hello bgColor="#cfc" />
            <Hello bgColor="#ccf" />
        </div>
    </section>
);
  • Helloコンポーネントを3つに増やす
  • 1つ目のHelloコンポーネントのbgColor#fcc
  • 2つ目のHelloコンポーネントのbgColor#cfc
  • 3つ目のHelloコンポーネントのbgColor#ccf

完成品

完成したものこちら。

See the Pen React - component class2 by イイダリョウ (@i_ryo) on CodePen.

3つのpタグの背景色がそれぞれ赤、緑、青になっている!

JSコード(全体)

//DOM取得
const text = document.querySelector('.text');

//JSXに埋め込む値
const h2Text = 'コンポーネントのクラス';
const name = 'くらす';

//コンポーネント
class Hello extends React.Component {
    bgColor = '#fff';
    style = {};

    // コンストラクタ設定
    constructor(props) {
        super(props);
        this.bgColor = props.bgColor;
        this.padding = props.padding;
        this.style = {
            backgroundColor: this.bgColor,
            padding: '10px'
        }
    }

    // JSXレンダリング
    render() {
        return <p style={this.style}>こんにちは、{name}。</p>
    }
}


//JSXの中身
let elm = (
    <section className="h2_elem">
        <h2>{ h2Text }</h2>
        <div>
            <Hello bgColor="#fcc" />
            <Hello bgColor="#cfc" />
            <Hello bgColor="#ccf" />
        </div>
    </section>
);
    
ReactDOM.render(elm, text);

テキストも設定する

先程の例では背景色しか変わらず、コンポーネントに同じテキストが3つ入っている。ここも個別に変更したい。

React公式サイトでクラスコンポーネントのテキスト設定があるのでやってみる。

※参考:コンポーネントと props – React

JSXレンダリングのテキスト部分を変更

JSXレンダリングのテキスト部分を変更

   // JSXレンダリング
    render() {
        return <p style={this.style}>こんにちは、{this.props.name}。</p>
    }
  • pタグの中のnamethis.props.nameに変更する。

テキスト設定はCSSよりもシンプルだった! コンストラクタの中でpropsを設定しなくてもいきなりrender()メソッドの中でthis.props.nameで設定できるようだ。

React がユーザ定義のコンポーネントを見つけた場合、JSX に書かれている属性と子要素を単一のオブジェクトとしてこのコンポーネントに渡します。このオブジェクトのことを “props” と呼びます。

※参考:コンポーネントと props – React

propsオブジェクトは最初から用意されているんだな。

コンポーネントにテキストの固有値を設定

Helloコンポーネントの属性にnameのテキストを設定

//JSXの中身
let elm = (
    <section className="h2_elem">
        <h2>{ h2Text }</h2>
        <div>
            <Hello bgColor="#fcc" name="赤ちゃん"/>
            <Hello bgColor="#cfc" name="緑ちゃん"/>
            <Hello bgColor="#ccf" name="青ちゃん"/>
        </div>
    </section>
);
  • 1つ目のHelloコンポーネントのname赤ちゃん
  • 2つ目のHelloコンポーネントのname緑ちゃん
  • 3つ目のHelloコンポーネントのname青ちゃん

コンポーネントの属性で値を設定するのはCSSと同じ!

完成品

完成したものこちら。

See the Pen React - component class3 by イイダリョウ (@i_ryo) on CodePen.

コンポーネントのテキストが上から「赤ちゃん」「緑ちゃん」「青ちゃん」になっている!

//DOM取得
const text = document.querySelector('.text');

//JSXに埋め込む値
const h2Text = 'コンポーネントのクラス';

//コンポーネント
class Hello extends React.Component {
    bgColor = '#fff';
    style = {};

    // コンストラクタ設定
    constructor(props) {
        super(props);
        this.bgColor = props.bgColor;
        this.padding = props.padding;
        this.style = {
            backgroundColor: this.bgColor,
            padding: '10px'
        }
    }

    // JSXレンダリング
    render() {
        return <p style={this.style}>こんにちは、{this.props.name}。</p>
    }
}


//JSXの中身
let elm = (
    <section className="h2_elem">
        <h2>{ h2Text }</h2>
        <div>
            <Hello bgColor="#fcc" name="赤ちゃん"/>
            <Hello bgColor="#cfc"  name="緑ちゃん"/>
            <Hello bgColor="#ccf"  name="青ちゃん"/>
        </div>
    </section>
);
    
ReactDOM.render(elm, text);

最後に

f:id:idr_zz:20200428181644j:plain

ということでクラスコンポーネントのCSSとテキスト設定をコンポーネントの属性値で個別に設定できました!共通部分はクラスで設定し、固有値は属性値で変更するという棲み分けになっています!だんだんコンポーネントを使う利点を感じられるようになってきました。

次回からは、CodePenではなく「Create React App」でReactプロジェクトを作って、コンポーネントをさらに深掘りしていきたく思います。それではまた!


※Reactでやってみたことまとめ
qiita.com