【駆け出しのReact】propsとstateを理解する
概要
入社してまだ間もない駆け出しエンジニアです。
学んだことのアウトプット+備忘録として、記事を書いていきます!
今回はReactを学んでいく中で理解しておきたい、props
とstate
の2つの概念を自分なりに説明します。
propsとは?
Reactでは親コンポーネントから子コンポーネントへのデータの受け渡しにprops
が使用され
ます。
子コンポーネント内でprops
は読み取り専用であり、後から変更することはできません。
子コンポーネントが親コンポーネントから渡されたprops
を受け取る方法として、
「引数にpropsを書く」「分割代入する」という2つの記述方法があります。
以下よりコードで具体的に説明していきます。
分割代入
import Noob from "./noob";
// 親コンポーネント
const App = () => {
return <Noob name="太郎" year={1} />;
};
export default App;
type NoobProps = {
name: string;
year: number;
};
// 子コンポーネント
const Noob = ({ name, year }: NoobProps) => {
return (
<div>
<p>こんにちは{name}さん</p>
<p>入社{year}年目です</p>
</div>
);
};
export default Noob;
import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root")!);
root.render(<App />);
ここでは親コンポーネントであるApp
でprops
というオブジェクトのname
とyear
というプロパティが子コンポーネントであるNoob
に渡されています。
Noob
コンポーネントでは、渡されてきたprops
オブジェクトのname
とyear
を引数として受け取り、以下のようにレンダリングしています。
return (
<div>
<p>こんにちは{name}さん</p>
<p>入社{year}年目です</p>
</div>
);
つまり分割代入では、props
オブジェクト内のname
とyear
というプロパティを直接受け渡ししているということになります。
propsを直接記述
また、分割代入を使わずにprops
を記述する渡し方では、
const Noob = (props: NoobProps) => {
return (
<div>
<p>こんにちは{props.name}さん</p>
<p>入社{props.year}年目です</p>
</div>
);
};
props
オブジェクト全体を受け取り、その中から必要なプロパティを取り出して使用します。
この場合だと、props.*
のように記述するため、props.
と書く手間が発生します。そのため複数のprops
を受け渡す際は少し読みにくいコードになると思います。
propsまとめ
props
とは親コンポーネントから子コンポーネントへ受け渡す際に使われるものです。
props
の受け渡し方については、分割代入を使ったほうがわかりやすく読みやすいコードになる場合が多いと思うので、僕は分割代入を主に使いたいと思います。
stateとは?
簡単に言えば、各コンポーネントごとの状態を管理するためのものです。
props
との違いとして、コンポーネント内でユーザーの操作やイベントに応じて変更されることがあります。
state
は変更できるとありますが、ではそのstate
の管理はどのように行うのでしょうか?
それはReactHooks
の中の一つ、useState
を使用して行います。
以下よりコードで具体的に説明していきます。
stateの変更
まず、useState
を使うには以下のような形で記述します。
const [state変数, state更新の関数] = useState(初期値);
実際に簡単なものを書いてみます。
import { useState } from "react";
const StateButton = () => {
const [count, setCount] = useState<number>(0);
const handleCount = () => {
setCount(count + 1);
};
return (
<>
<p>現在のカウントは{count}</p>
<button onClick={handleCount}>+1</button>
</>
);
};
export default StateButton;
count
というstate
を宣言して、ボタンが押された際にhandleCount
関数が実行され、setCount
関数が呼び出されてカウントが1増えます。
また、count
はsetCount
が呼び出されてすぐに変更されているわけではありません。
const handleCount = () => {
setCount(count + 1);
console.log(count);//この時点ではcountは更新されていない!!
};
useState
の値は再レンダリングの後に更新されます。
再レンダリングとは
再レンダリングについては以下の記事を参考にしてみてください。
stateまとめ
state
とはReactにおいて各コンポーネントの状態を管理するためのものです。
そのstate
を関数コンポーネントで作成する際にuseState
を使用します。
Discussion