はじめに
たにぐちまことさんのReact入門を拝見させていただきましたので、自分なりの備忘録としてまとめました。とてもためになる動画を配信していただき、ありがとうございます。
基本事項
-
sampleという名のReactのプロジェクトを作成
$ npx create-react-app sample
-
サーバを起動
$ npm run start
($ npm start
でも良い。これは上記のエイリアス。) -
babelがないとJSXが使えないが、
create-react-app
すればJSXが使えるようになる -
JSXでは、class属性は、
className
と書かなければならない -
JSXの中でJavaScript部分の変数や関数を使う場合は、
{}
で囲えば良い -
JSXで属性値にJavaScript部分の変数や関数を設定する時は、""は不要。{}で囲むだけで良い
-
Bootstrap などを使いたい時は、プロジェクトディレクトリ -> public -> index.html にCDNをおけば良い。これがテンプレートだから。ゆえに、これの body -> divタグ の中にJSXで書いたものが入れ込まれる
-
src -> Apps.js の内容が実行される
-
Apps.js に次のインポート文を追加する
import React from 'react’;
コンポーネント
-
React.Component
を継承したクラスが、コンポーネントとなる -
コンポーネントを使う時は、
<Hoge />
のようにする -
コンポーネント中で次のメソッドが返す値が画面に出力される
render() { return 出力する内容をJSXで書いたもの }
-
出力内容にタグの入れ子がある場合は、()で内容全体を囲う必要がある
-
タグを並列して出力はできない。一番外側を一つのタグで囲む(例えば
<div>
)
ステート
-
Reactがステートを監視してくれて、
setState()
を呼び出すと、Reactが自動的に画面を書き換えてくれる -
ステートは、コンポーネントのコンストラクタ内で次のように定義する
this.state = {fuga : foo};
-
コンストラクタの引数に、例えば
props
を渡す -
コンストラクタでは、最初に
super(props);
を記述する -
コンポーネントのメソッドで
setState()
を使うなら、コンストラクタの中でメソッドをバインドする。
this.bar = this.bar.bind(this);
ルーティング
-
URLを変更した時にどういう動きをするかを決める機能をルーターなどと呼ぶ
-
ルーターの機能をインストール
-% npm i -S react-router-dom
-npm
-> Node Package Manager(Node.jsのパッケージ管理)
-i
-> install
--S
-> --saveのショートハンド -
ルーティングのAppの中、記述方法が変わっている模様
-
$ npm list --depth=0
でreact-router-domのバージョン確認 -
react-router-dom@6.26.0
v6だった - 記述を変更
-
<Route>
を<Routes></Routes>
で囲む -
exact
を削除 -
component
部分 をelement={<Home />}
に変更
-
-
-
Link
- Reactでは、
<a>
タグの代わりにLink
の機能を使った方がいい <Link to="URL">hoge</Link>
- URLが複雑になったときにスムーズに作れる機能を利用できる
- Reactでは、
-
Routeのパラメータ
- Routeのpathにパラメータを埋め込むことができる
- 例えば、blogの各記事のページをid(数字)で管理している時などに利用する。ページの数が増えて複雑になったとき、ひとつひとつ
<Route>
を記述するのは現実的でないから -
path="/blog/:id"
のようにパラメータ名の前に:
をつける - パラメータは文字列として渡される
- コンポーネント内でパラメータを利用する方法
const { id } = useParams(); //URL中にidというパラメータがあれば受け取る
return <p>{id}番目の記事</p>; //{id}の部分がパラメータの値となる
Reduxを用いたステート管理
- ページ遷移する際に、何らか値を保持し、次のページへ渡すための処理
- Redux がよく使われる
- React-Reduxという版がある
- 素のReduxではなく@reduxjs/toolkit を使うことが推奨されている
以下は素のReduxでの内容
- Reduxで行いたい処理を関数で書く際は、状態を表すパラメータ(名例:
state
)とaction
を引数に渡す。その関数の中でswitch文を使い、action.type
の値によってやりたい処理を分ける - 関数を
createStore()
の引数に渡し、返り値を変数(名前はstore
など)に格納しておく -
store
のdispatch()
メソッドに、オブジェクトとして{type : type名}
を渡して実行すると、上記の行いたい処理を呼び出すことができる - Storeという場所に値が保持されており、その値は、
store
のgetState()
メソッドで得ることができる
Reducerの処理が2回実行される
原因の調査
- 1ずつインクリメントしたい値が2ずつインクリメントされていたため、原因を調査
- 正しい仕様だった。Reactは、Reducerを意図的に2回実行する模様
- バグを減らすためにReducerを純粋関数とすることが推奨されており、純粋関数でなければ、引数が同じ場合でも違う結果が返されるため、バグを早期に発見することができる
- 本番環境では、実行は1度。2度実行されるのは開発環境のときだけ
純粋関数
- 引数が同じ場合、常に同じ返り値となる。(参照透過性)
- 副作用(関数の外への影響)が発生しない
- 上記を満たす関数のこと。意図しない挙動をさせないための技術