0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

React入門

Posted at

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました
React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで

propsのチェック

Reactにはpropsの型チェック機能がある。
ますはインストール

$ npm install -save prop-types

ReactコンポーネントのptopTypesに型情報を記載していく。

基本のproprTypes

javascriptの基本型に対応するPropType
PropTypesとpropTypesは別物

名前 説明
PropTypes インポートしたprop-typesモジュールが持つオブジェクトで型情報を持つ
propTypes 自作したReactコンポーネントが持つプロパティ。ここに各props野方情報を記述

配列やオブジェクトのpropTypes

なんの配列かどんなオブジェクトかを記述できる。
PropTypesは型情報作成する関数を持っている。

どんな要素が入ったオブジェクトなのかを記述する
SomeComponent.propTypes = {
  //配列の中身を指定
  someArray: PropTypes.arrayOf(PropTypes.number),
  //オブジェクトの中身を指定
  someObject: PropTypes.object(PropTypes.number),
  //オブジェクトについては個別のプロパティについて指定できる
  //complexObjectは文字列のnameと数値のageを持つオブジェクトであると定義している。
  complecObject: PropTypes.shape({
    name: PropTypes.string,
    age: PropTypes.number
  }),

}

参考:React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで

JSX独自のpropTypes

Reactコンポーネントは最後はHTMLになるJSXなどの表示要素をプロパティとして受け渡すときのために、elementやnodeというエイリアスがある。

Todoアプリの作成

名前 説明
state 何を入力するか、何を表示すべきかの状態を示す。

必要なコンポーネントは以下

  • アプリ全体表す
  • 入力フォーム
  • ひとつひとつのTodoを表す
  • Todoの一覧を表す

Appコンポーネント

各コンポーネントをまとめる
表示上の要件なし
データ管理を行う

TodoInputコンポーネント

Todo入力のコンポーネント

TodoListコンポ

propsを受け取ったtodoListを元に一つのTodoItemwo表示

TodoItem

ひとうひとつのTodoを表すコンポ

stateの初期値

初期値はconstructorで設定
this.stateプロパティにtasksとuniqueIdという値を含んだオブジェクトを設定している。
このstateという名前は何でもわけじゃなくてこの名前であるからこそ意味がある。

stateの値は直接変更しない.
直接弄っているのはocnstructorだけ

合わせてtodoListに渡す部分も変更

stateの変更

次はユーザ入力でしんきTODOを追加できるようにする
tasksはTodoアプリに紐づく情報だからこのメソッドはAppポンコで作る

App.js
    addTodo(title) {
        const {
            tasks,
            uniqueId,
        } = this.state;
        tasks.push({
            title, if: uniqueId,
        })
        this.setState({
            tasks,
            uniqueId: uniqueId + 1,
        })
    }

参考:React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで
引数にTodoのtitleを受け取る
stateに記録されたtasksにしんきTODOをpushしてせtStateでstateに保存している。

stateを変更するにはsetStateを使う

setStateは今のを置き換えるんじゃなくて変更があった問だけstateを上書きする
uniqueIdがsetStateに渡されなくても値は保持される。

なぜsetStateを使うのか

配列のpushメソッドはもとの変数に値を追加するメソッドのため、pushした時点でstateの状態が変化する。
直接stateを変更すると副作用がある。

作成したaddTodoメソッドをTodoInputコンポに渡す
最後にaddTodoメソッドで適切ににstateを変更するコードを追加

this.addTodo=this.addTodo.bind(this);

bindはすべてのFunctionオブジェクトが持っているメソッド
これはaddTodoメソッドでAppコンポのstateを変更するために必要
javascriptでは関数を変数として渡せるが、thisは何を指すのかまでは渡されない。
addTodoメソッドの定義時はthisはAppじゃなくて他のコンポやDOM。
こうすることでaddTodoは常にAppkコンポのstateを参照する。

bindを使わない方法

アロー関数

定義したメソッドをpropsとして渡すんじゃなくて、アロー関数でメソッドを使う関数を定義して渡す。

<TodoInput addTodo={(title)=>{this.addTodo}}/>

参考:React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで

こう書けばconstructorにbindを書かなくても大丈夫
デメリットは同じメソッドを複数のコンポに渡すときには毎回これを書かないといけない
とりあえず当面はbindを使う方向で。

イベントハンドリング

AppコンポのaddToDoをTodoInputで使ってみる
TodoInputコンポはpropsとしてaddTodoが渡されていた
これでクリックするたびにaddtodoが呼ばれる

イベント引数

onClickなどのイベントは引数としてEventオブジェクトを受け取っている
これはブラウザでも同様に動く。ブラウザ本来のイベントと同じように使える
以下は<a>タグにイベントを追加した例
そのままでは<a>自身の機能でページ遷移がされるが、これを止める例

const { render } = require("react-dom");

handleClick(e){
    e.preventDefault();//preventDefaultによりaタグのデフォルト機能のページ遷移を止めている。
    this.PaymentResponse.addTodo('新規TODO')
}
render(){
    return (
        <div>
            <input placeholder="新規TODO" />
            <a href="/register" onClick={this.handleClick}>登録</a>
        </div>
    )
}

参考:React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで

fromの操作

Reactではフォーム入力値もstateで扱う。

  1. フォームの初期値をconstructorでstateに渡す
  2. state保値をinput要素のvalueに設定する。
  3. handleChangeメソッドを記述

っていうかこのファイルをどこに置けば実行されるのか、私にはわからない。調べる必要がある。

0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?