🐡

[note] react

2022/02/13に公開

随時更新
https://ja.reactjs.org/docs/getting-started.html
YouTubeのvideoIDが不正ですhttps://www.youtube.com/playlist?list=PLX8Rsrpnn3IWPoM7-1YPDksRRkamRY25k

[note]react-official-document

what is react

React is a JavaScript library for building user interfaces, developed by Facebook and the community.

JSXの記法

  • JavaScript の構文の拡張言語 テンプレート言語とは違う
  • htmlライクな記述
  • javascriptの構文が使える

JSXを使う理由

以下の 2 つの例は等価

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

上記を簡単に書けるようにしたのがjsx

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);

あとは

  • 以下の表示のためのロジックを実現する

    • イベントへの応答や経時的な状態の変化、画面表示のためのデータを準備する方法といった、他の UI ロジックと本質的に結合したもの
  • マークアップとロジックを別々のファイルに書いて人為的に技術を分離するのではなく、React はマークアップとロジックを両方含む疎結合の「コンポーネント」という単位を用いて関心を分離

  • JSX があるために React は有用なエラーや警告をより多く表示することができ

jsxは何をしているのか

  1. jsx→React.createElementに変換
  2. react要素を生成

jsx基礎文法

  1. reactライブラリをimportする(ver17から不要)
  2. return文の中がjsx気泡
    • 基本的にはhtmlと同じ
    • classはclassNameに
import React from "react";

interface Props {
  num: string;
}

class Sample extends React.Component<Props> {
  render() {
    return <p>{this.props.num}つ目のコンポーネント</p>;
  }
}

export default Sample;

特殊なjsx構文

  1. jsxは必ず階層構造(最上位のコンポーネントは並列にできない)
  2. React.Fragmentで囲む(htmlとして出力されない、divタブ等必要のないタグを避けれる)
  3. React.Fragmentは省略でかける
  render() {
    return (
      <React.Fragment>
        <p style={{ color: "pink", fontSize: "30px" }}>Dandyyy</p>
        <Sample num={"5"} />

        <p>{this.state.message}</p>
        <button onClick={this.handleClick}>ボタン</button>
        <p>{this.state.counter1}</p>
        <button onClick={this.doAction1}>Click</button>
      </React.Fragment>
    );
  }
}

create-react-appで環境構築

create-react-appとは

reactの環境構築ツールチェイン

  • 最も簡単にreactの開発環境えお構築できる
  • 本来のreact環境構築は以下の設定が必要
    • トランスパイラのbabel
    • バンドラーのwebpack

スクリプトの解説

# ローカルサーバー起動
npm start

# 本番用ファイルを生成してbuildディレクトリ に出力
npom run build

コンポーネントとprops

コンポーネントとは

  • 見た目と機能を持ったUIのパーツ
  • コンポーネントを組み合わせてページを作る
  • 大きく2種類に分ける
    • Class Component(クラスコンポーネント)
    • Functional Component(関数コンポーネント)主流

コンポーネントの違い

  • Functional Component記述量が少ない
  • 昔はClassでないとできないことがあった
  • react hooksの登場でクラスコンポーネントと同じ機能が使えるように

Class Component(クラスコンポーネント)→限定的にか今は使われない

import React, {Component} from 'react';

class Button extends Component {
  render() {
    return <button>Say ,{this.props.hello}</button>
  }
}

export default Button;

Functional Component(関数コンポーネント)主流

import React from 'react';

const Button = (props) => {
    return <button>Say ,{props.hello}</button>
}

export default Button;

なぜコンポーネントを使うのか

  • 再利用するため(再利用性)
    • 同じ記述を何度もする必要がない
  • コードの見通しを良くするため(可読性)
    • 1コンポーネント = 1ファイル
    • 別ファイルに分けることでコードが読みやすく
  • 変更に強くするため(保守性)
    • 修正は1箇所だけでOK

react使うときはできるだけ小さい単位で分けていく

コンポーネントの使いかた

  • ファイル名は大文字
  • 子コンポーネントでexport
  • 親コンポーネントでimport

propsでデータを受け渡す

  • 子コンポーネントの引数にpropsを指定する
  • 親から子にデータを渡す

コンポーネントの再利用

Sample部分

import React from "react";
import Sample from "./Sample";

interface Props {}

interface State {
  message: string;
  counter1: number;
}

class App extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);

    this.state = {
      message: "最初のメッセージ",
      counter1: 0,
    };

    this.handleClick = this.handleClick.bind(this);
    this.doAction1 = this.doAction1.bind(this);
  }

  handleClick() {
    this.setState({
      message: "ボタンが押されました",
    });
  }
  doAction1() {
    this.setState({
      counter1: this.state.counter1 + 1,
    });
  }

  render() {
    return (
      <React.Fragment>
        <p style={{ color: "pink", fontSize: "30px" }}>Dandyyy</p>
        <Sample num={"5"} />
        <Sample num={"6"} />
        <Sample num={"7"} />

        <p>{this.state.message}</p>
        <button onClick={this.handleClick}>ボタン</button>
        <p>{this.state.counter1}</p>
        <button onClick={this.doAction1}>Click</button>
      </React.Fragment>
    );
  }
}

export default App;

コンポーネントのimportとexport

なぜコンポーネントを使うのか
こちら、そのようにして別ファイルのコンポーネントを使うのか

javascriptのモジュール機能(この考え方からコンポーネント単位での考えができている)

  • プログラムをモジュールという単位に分割する(そもそもはjavascript mdmから)
  • 原則は1ファイル = 1モジュール
  • 必要な時に必要なモジュールのみ読み込む

default export(名前なしexport)

  • 推奨されるexport方法
  • 1ファイル = 1export
  • 1度宣言したアロー関数をdefault export
  • 名前付きexport

アロー関数(名前なし)のdefault export

const Title = (props) => {
  return <h2>{props.title}</h2>
};
export default Title;

名前付き関数のdefault export

reactでは一般的
名前なしと書き方が違うだけでやっていることは同じ
!実際ではdefaultという名前でexportしている(Titleではない)

export default function Title(props) {
  return <h2>{props.title}</h2>
};

default import(名前なしimport)

  • default exportしたモジュールをそのまま読み込む
  • import モジュール名 from "ファイルパス"

Title.jsx

const Title = (props) => {
  return <h2>{props.title}</h2>
};
export default Title;
import Title from "./components/Title"

名前付きexport

reactでよく使う

  • 1ファイルから複数モジュールをexportしたい時に使う
  • reactではエントリポイント(だいたいindex.js)でよく使う
  • エントリポイントでは別名exportも併用する

importするときのファイルパスをすっきりさせる(よく使うモジュールのファイルパスがエントリポイントからに統一させる)ため、エントリポイントの役割を果たすファイルに一度importさせてから改めてexportする

export {default as Article} from "./Article"
export {default as Content} from "./Content"
export {default as Title} from "./Title"

名前付きimport

1ファイルから複数モジュールを読み込む
エントリポイントから複数コンポーネントを読み込む

import {Content ,  Title} from "./index";

もし直接imortしたら

import Content from "./components/Content"
import Title from "./components/Title"
どんどん増えていく

コンポーネントの状態管理

インタラクティブなアプリの実現

reactのHooksとは

  • 2020/02に正式にリリース
  • hook は Reactの state やライフサイクルの機能などを、関数コンポーネント内に使用できるようにするための関数
  • クラスコンポーネントの機能に接続するもの
  • 基本的にはフックを用いた関数コンポーネントで書いていき、必要な場合のみクラスで作成する。というのが今後のスタンダードになると予想

https://qiita.com/Mitsuzara/items/98d1bc4a83265a764084

Reactでなぜstateを使うのか

  • domを直接書き換えない(reactの仮想domを使う)
  • 値を再描画
    • stateが変更されたとき
    • propsが変更されたとき

useStateの使い方

// useStateによるstateの宣言
const [count, setCount] = useState(0)
// stateの更新
setCount(count + 1)

propsとstateの違い

props:引数のようにコンポーネントに渡される値
state:コンポーネント内部で宣言・制御される値

stateをpropsに渡す

propsへ関数を渡す際の注意点

ディレクトリ構成

https://qiita.com/Sotq_17/items/7c7ab9880597336b3ee5

Discussion