Pythonとサラリーマンと

2020年6月にPythonを始めたサラリーマンのブログです。

React 備忘録 Progate

・return()の中に処理を記載する

・JSX = Javascriptのなかでhmtl構文のような構文をかける
→render()メソッドの中のretrurn()の中にJSXを記述する
→return()のなかは複数要素を一つの要素にまとめないといけない
(複数要素のままではエラー)
→JSXの中でJavascriptの変数を呼び出す場合は{}で囲む
→JSX内で同じクラスのメソッドを呼びだすときはthis.メソッド名

・JSXでは、/ / でコメントアウト

・JSXとHTMLでは書き方が微妙に異なってる

例えば、

<img src='画像のURL'>は  
<img src='画像のURL'/>  

・render()メソッドの中でも、return()の外ではjavascriptがかける
→return()の中ではJSXを記述する
→returnの中でJavascriptを使いたい場合は{}で囲む
(変数など)

・JSX部分、つまりreturn内ではコメントは/ /になる
Javascript内では、コメントはあくまで//

・JSXにボタン要素などが用意されている

・イベント
→イベントを使って、何かが起こった時に、処理を実行するように指定できる
→書き方は

<button イベント名={() => {処理} }> </button>

→のように、タグ内にアロー関数を記載する
→アロー関数はJavascriptなので{}で囲む必要あり
→使えるイベントは、JSXであらかじめ用意されている

onClick → ボタン押されたら

・state
→ユーザの動きに合わせて変わる値のこと
→stateの定義・stateの表示・stateの変更

・stateの定義

constructor(props) {
  super(props);
  this.state = {name: 'にんじゃわんこ'};
 }

→ stateの定義はオブジェクトを使って定義する。
プロパティと値を自分で決める。
constructor(props)/ super(props)は定型文。

・stateの表示 →
render()メソッドの return()の中で定義したstateを呼び出せる

constructor(props) { }
render() {

 return( <h1> {this.state.name} </h1> );

 }
}

・stateの変更

イベントの関数の中でthis.setState()を使えばstateの値を変更できる

<button onClick={ () => {
  this.setState({name: "にんじゃわんこ"})
}}></button>

・stateの変更はイベント操作をメソッド化しておくと便利

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {name: 'にんじゃわんこ'};
  }
  
  // handleClickメソッドを定義してください
  handleClick(name) {this.setState({name: name})}
  
  render() {
    return (
        <div>
          <h1>こんにちは、{this.state.name}さん!</h1>
          {/* onClickイベント内の処理を、handleClickメソッドを呼び出す処理に書き換えてください*/}
        <button onClick={() => {this.handleClick("ひつじ仙人")}}>ひつじ仙人</button>
        
          {/* onClickイベント内の処理を、handleClickメソッドを呼び出す処理に書き換えてください*/}
        <button onClick={() => {this.handleClick("にんじゃわんこ")}}>にんじゃわんこ</button>
      </div>
    );
  }
}

・Reactの処理の流れ
→ xx.js/ index.js/ index.htmlの3つのファイルを用いる。
xx.js -> 処理(JSX)の内容を書く index.js -> xx.jsの処理(JSX)をhtmlに変換し、ここで指定したhtmlのidへ変換後のコードを挿入する。
index.html -> reactの内容を表示したい場所をid指定してく

・JSXにスタイルをつける
→ JSX内のhtmlタグには、ちゃんとCSSのスタイルが適用される。
タグにクラスをつけるときは、className='title'というようにclassNameを使うことに注意

コンポーネント

Webページの画面を部品に分けて作る。 React.Componentクラスを継承して作る。

import React from 'react';

class Language extends React.Component{
 render(){
  return(

   JSX

    )
  )}
}

・各種コンポーネントは、export/importと<コンポーネントクラス名/>を使って一つのJSファイルにまとめるっぽい 直接呼び出さない。
→index.jsで呼び出すファイルのJSXに記載する

コンポーネントは一度作れば、何度でも呼び出せる

・JSXの中で呼び出すコンポーネントへpropsを使って値を渡すことができる

<コンポーネントクラス名 
  props名=値
  props名=値
>

・propsを私たコンポーネントの中でthis.props.プロップス名とすれば指定の値を表示できる

・配列のmapメソッドで連続した同じコンポーネントの値を自動で変更していく →別ファイルのコンポーネントを呼び出し、自らのコンポーネントを定義する

mport React from 'react';
import Lesson from './Lesson';

class Main extends React.Component {
  render() {
    const lessonList = [
      {
        name: 'HTML & CSS',
        image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/html.svg',
      },
      {
        name: 'Sass',
        image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/sass.svg',
      },
      {
        name: 'JavaScript',
        image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/es6.svg',
      },
      {
        name: 'React',
        image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/react.svg',
      },
    ];
    
    return (
      <div className='main-wrapper'>
        <div className='main'>
          <div className='copy-container'>
            <h1>Hello, World.</h1>
            <h2>プログラミングの世界へようこそ!</h2>
          </div>
          <div className='lesson-container'>
            <h3 className='section-title'>学べるレッスン</h3>
            {/* lessonListに対して、mapメソッドを用いてください */}
            {lessonList.map((lessonItem) => {
            return(
              <Lesson
                  name={lessonItem.name}
                  image={lessonItem.image}
                />
              )
            }
             )
            }
            
          </div>
        </div>
      </div>
    );
  }
}

export default Main;

・JSファイルの分け方例 f:id:minipe555:20190817165900p:plain f:id:minipe555:20190817170200p:plain

・ifによって表示する内容を変更するコンポーネント

import React from 'react';

class ContactForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      /* isSubmittedというstateを定義してください */
      isSubmitted: false
    };
  }

  render() {
    /* 空の変数contactFormを定義してください */
    let contactForm;
    
    /* isSubmittedを条件式とするif文を作成してください */
    if(this.state.isSubmitted === true){
        contactForm = (
        <div className='contact-submit-message'>
          送信完了
        </div>)
    }
    else{
      contactForm = (
        <form>
          <p>メールアドレス(必須)</p>
          <input />
          <p>お問い合わせ内容(必須)</p>
          <textarea />
          <input
            type='submit'
            value='送信'
          />
        </form>
        )
    }
    
    return (
      <div className='contact-form'>
        {contactForm}
        
        
        {/* 削除ここまで */}
      </div>
    );
  }
}

export default ContactForm;

・入力値のstate管理

stateで入力値を管理して、{input value=}で紐付ける

・入力イベントはonChangeイベントで取得

eventとevent.taerget.value

import React from 'react';

class ContactForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isSubmitted: false,
      email: '',
      hasEmailError: false,
    };
  }

  handleEmailChange(event) {
    const inputValue = event.target.value;
    /* 定数isEmptyを定義し、入力チェックの結果を代入してください */
    const isEmpty = inputValue === '';
    
    /* hasEmailErrorを更新してください */
    this.setState({email: inputValue, hasEmailError: isEmpty});
    
  }

  handleSubmit() {
    this.setState({isSubmitted: true});
  }

  render() {
    let emailErrorText;
    if (this.state.hasEmailError) {
      emailErrorText = (
        <p className='contact-message-error'>
          メールアドレスを入力してください
        </p>
      );
    }

    let contactForm;
    if (this.state.isSubmitted) {
      contactForm = (
        <div className='contact-submit-message'>
          送信完了
        </div>
      );
    } else {
      contactForm = (
        <form onSubmit={() => {this.handleSubmit()}}>
          <p>メールアドレス(必須)</p>
          <input
            value={this.state.email}
            onChange={(event) => {this.handleEmailChange(event)}}
          />
          {emailErrorText}
          <p>お問い合わせ内容(必須)</p>
          <textarea />
          <input
            type='submit'
            value='送信'
          />
        </form>
      );
    }

    return (
      <div className='contact-form'>
        {contactForm}
      </div>
    );
  }
}

export default ContactForm;

・isEmpty = inputValue === '' → inputValueが空文字列かどうかを代入