🌐

🔰はじめおのReact入門ガむド【クむックスタヌト】

に公開

フロント゚ンドが苊手なのに、Reactを始めおみた

蚳あっおReactの勉匷を始めたした。

日ごろAIを掻甚しおいる関係でPythonは少し慣れおいたすが、フロント゚ンドは苊手意識がありこれたで距離を眮いおきたした。

javascriptだけなら、ただマシですが、

「HTMLずかCSSずか芚えるの面倒そう・・・」

ずいうのもあり、これたで敬遠しおきたした。

ずりあえず、「挫折するこずなく手っ取り早く始めおみたい」ずいうこずで、いろいろ読み持った結果、公匏サむトの「クむックスタヌト」が初心者向けに簡単そうなのでここから初めおみたした。公匏のクむックスタヌトだけあっお、なんずReactのコンセプトの8割がこのクむックスタヌトに盛り蟌たれおるようです

React ドキュメントぞようこそ このペヌゞでは、日々の開発で䜿甚する React のコンセプトのうち 80 の郚分を玹介したす。

参考情報

https://ja.react.dev/learn

でも、この手の公匏サむトの情報は行間が省略されおいおずおもわかりにくいのが倚いので、少し行間を補完しながらたずめおみたした。

事前準備

残念ながら、Reactのクむックスタヌトには、Reactの環境準備方法は蚘茉がありたせんでした。

本蚘事でも環境準備は省略したすが、筆者の環境では事前に以䞋を準備しおいたす。

  • nodeのむンストヌル
  • npx create-react-app の実行
  • npm startでReact動䜜確認

Reactの環境準備方法はさたざたな方法があり、情報もたくさんありたすので、お奜みの方法で準備しおいきたしょう。

Webブラりザ䞊でReactの開発ができる以䞋のサヌビスもおすすめです。Freeプランもありたすので孊習甚途の範囲なら無償で利甚できるず思いたす。

  • CodeSandBox
  • StackBlitz

参考たでに筆者の環境準備の順番を以䞋蚘茉しおおきたす。

nodeのバヌゞョン

# node -v 
v22.14.0

npxの実行

# npx create-react-app test-react-typescript --teplate typescript

npm startで実行

# cd test-react-typescript/
# ls
README.md  node_modules  package-lock.json  package.json  public  src
# npm start

ロヌカルで立ち䞊げた堎合は、ブラりザで「http://localhost:3000」にアクセスしたす。

以䞋の画面が衚瀺されたらReactの動䜜確認は完了です。

Reactクむックスタヌト

それでは公匏のクむックスタヌトに沿っお始めおいきたしょう。

コンポヌネントの䜜成ずネスト

Reactアプリは「コンポヌネント」ずいうブロックで䜜られおいたす。コンポヌネントは、簡単に説明するず以䞋のずおりです。

コンポヌネントは、画面に衚瀺される郚品です

それぞれの郚品は芋た目デザむンず動き機胜を持っおいたす

小さなコンポヌネント䟋ボタン、入力フォヌムから倧きなコンポヌネント䟋ヘッダヌ、ペヌゞ党䜓たでありたす

技術的には、Reactのコンポヌネントは「HTMLのようなマヌクアップを返すJavaScript関数」です。

これは䟋えで蚀うず、「この関数を呌ぶず、画面に衚瀺する郚品が返っおくる」ずいう仕組みです。

コンポヌネントを組み合わせるこずで、耇雑なりェブサむトも簡単なパヌツに分解しお䜜るこずができたす。

以䞋はHTMLの「<button>」タグを返华するMyButton()ずいう関数の䟋です。

function MyButton() {
  return (
    <button>I'm a button</button>
  );
}

MyButton関数 を宣蚀したあず、別のコンポヌネント内にネストできたす。

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <MyButton />
    </div>
  );
}

Reactでは名前の付け方に重芁なルヌルがありたす。

<MyButton /> が倧文字で始たっおいるこずに泚目しおください。これには理由がありたす。

倧文字ず小文字の䜿い分け

  • 倧文字で始める<MyButton />、<Header />、<ProfileCard />
    • これらはReactのカスタムコンポヌネントだず認識されたす
    • あなたや他の開発者が䜜ったパヌツであるこずを瀺したす
  • 小文字で始める<div>、<span>、<button>
    • これらは通垞のHTMLタグだず認識されたす
    • ブラりザが最初から理解できる暙準的な芁玠です

先頭の文字を倧文字にするこずでReact のコンポヌネントであるずいうこずを瀺しおいたす。React のコンポヌネント名は垞に倧文字で始める必芁がありたす。䞀方、HTML タグは小文字にする必芁がありたす。

それでは、実際にボタンを衚瀺しおみたしょう。

「npx create-react-app 」で䜜成した堎合、src/App.jsファむルがありたすので、䞭身を党郚削陀したす。

䞭身を消したあず、以䞋のように蚘茉したす。

function MyButton() {
  return (
    <button>
      I'm a button
    </button>
  );
}

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <MyButton />
    </div>
  );
}

ファむルを保存するず、自動的にブラりザで「http://localhost:3000」にアクセスした画面が自動的に以䞋のように倉曎されたす。もし画面が倉わらない堎合は、画面をリロヌドしおみおください

ちゃんずボタンが衚瀺されたした。

JavaScript の構文に぀いおの詳现は、MDN やjavascript infoのリファレンスを参照したしょう。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export

https://javascript.info/import-export

JSX でマヌクアップを曞く

前述のマヌクアップ構文は、「JSX」蚘法ず呌ばれおいたす。

利甚しなくおも問題ないですのですが、䟿利なのでほずんどのReact プロゞェクトでは JSX が䜿甚されおいるず思いたす。

HTMLず比范するずJSX では構文芳点でいく぀か泚意点がありたす。
のようにタグは閉じる必芁がありたす。たた、コンポヌネントは耇数の JSX タグを return するこずはできたせん。<div>...</div> や空の <>...</> ラッパのような共通の芪芁玠で囲む必芁がありたす。

耇数タグがNGな䟋<h1>ず<p>タグの぀がreturnで指定されおいたす

export default function MyApp() {
  return (
      <h1>Welcome to my app</h1>
      <p>こんにちは</p>
  );
}

䞊蚘の曞き方だず、耇数タグをreturnで返しおいるため゚ラヌが出たす。

この堎合は、芪芁玠ずしお<div></div>を远加しおreturnで返すタグを぀にする必芁がありたす。

OKな䟋

export default function MyApp() {
  return (
    <div>
      <h1>Welcome to my app</h1>
      <MyButton />
    </div>
  );
}

以䞋のように空タグを䜿っおもreturnずしおは぀のタグになりたすのでこれでも問題ありたせん。

空タグで括った䟋

function AboutPage() {
  return (
    <>
      <h1>About</h1>
      <p>Hello there.<br />How do you do?</p>
    </>
  );
}

前述の䟋では、<div></div>タグでreturnで返すタグが䞀぀ですので、䞭にタグを远加するこずは可胜です。
詊しに、さきほどボタンを衚瀺したApp.jsに<h2>、<p>タグを远加しおみたしょう。

function MyButton() {
  return (
    <button>
      I'm a button
    </button>
  );
}

export default function MyApp() {
  return (
    <div>
    
      <h1>Welcome to my app</h1>
      <h2>ボタンのテスト</h2>
      <p>ボタンのテスト</p>
      <MyButton />
    </div>
    
  );
}

HTMLタグが衚瀺されたした。

JSXは䟿利ずはいえ、JSXに倉換したいHTMLがたくさんある堎合は少し面倒ですよね。もし、JSX に倉換しないずいけない HTML がたくさんある堎合は、オンラむンコンバヌタを䜿うず䞀気に倉換が可胜です。

オンラむンコンバヌタ

䟋えば以䞋のようなHTMLを、JSXに倉換しおくれたす。

HTML

<!-- Hello world -->
<div class="awesome" style="border: 1px solid red">
  <label for="name">Enter your name: </label>
  <input type="text" id="name" />
</div>
<p>Enter your HTML here</p>

JSX

<>
  {/* Hello world */}
  <div className="awesome" style={{ border: "1px solid red" }}>
    <label htmlFor="name">Enter your name: </label>
    <input type="text" id="name" />
  </div>
  <p>Enter your HTML here</p>
</>

スタむルの远加

React では、CSS クラスを className で指定したす。HTML の class 属性ず同じ方法で動䜜したす。

https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/class

<img className="avatar" />

そしお、別の CSS ファむルに察応する CSS ルヌルを蚘述したす。

/* In your CSS */
.avatar {
  border-radius: 50%;
}

border-radius CSSのプロパティで、芁玠の境界の角を䞞めたす。1 ぀の半埄を蚭定するず円の角になり、2 ぀の半埄を蚭定するず楕円の角になりたす。䞊蚘䟋では぀の半埄を指定しおいるので䞞衚瀺になりたす。

以䞋のサむトにアクセスするずCSSの効果をリアルタむムに確認するこずが可胜です。

https://developer.mozilla.org/ja/docs/Web/CSS/border-radius

詊しに、䞊から぀目の「border-radius: 25% 10%;」をクリックするず、右偎に効果のむメヌゞが衚瀺されたす。

React には CSS ファむルの远加方法に関する芏則はありたせん。

簡単な䟋を挙げるず、HTML に <link> タグを远加したす。ビルドツヌルやフレヌムワヌクを䜿っおいる堎合は、それらのドキュメントを参照しお、プロゞェクトに CSS ファむルを远加する方法を確認したしょう。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/link

デヌタの衚瀺

JSX を䜿うこずで、JavaScript 内にマヌクアップを入れるこずができたす。

反察に、波括匧「{ }」を䜿うこずで、JSX の䞭から JavaScript に「戻る」こずができたす。

コヌド内の倉数を埋め蟌んでナヌザに衚瀺するこずができたす。たずえば、以䞋は倉数であるuser.name を衚瀺したす。

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

JSX の属性 (attribute) の郚分から JavaScript に「戻る」こずもでき、その堎合匕甚笊の代わりに波括匧を䜿う必芁がありたす。

䟋えば、className="avatar" は CSS クラスずしお "avatar" 文字列を枡すものですが、src={user.imageUrl} は JavaScript の user.imageUrl 倉数の倀を読み蟌み、その倀を src 属性ずしお枡したす。

return (
  <img
    className="avatar"
    src={user.imageUrl}
  />
);

以䞋のようなconsole.log()を利甚するこずも可胜です。

return (
  <>
    {console.log("console log test")
    <h1>
      {user.name}
    </h1>
  </>
);

JSX の波括匧の䞭にもっず耇雑な匏を入れるこずもできたす。䟋えば、文字列の連結ができたす。

https://javascript.info/operators#string-concatenation-with-binary

以䞋のコヌドでは、「alt={’Photo of ‘ + user.name}」で文字列を連結しおいたす。

const user = {
  name: 'Hedy Lamarr',
  imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
  imageSize: 90,
};

export default function Profile() {
  return (
    <>
      <h1>{user.name}</h1>
      <img
        className="avatar"
        src={user.imageUrl}
        alt={'Photo of ' + user.name}
        style={{
          width: user.imageSize,
          height: user.imageSize
        }}
      />
    </>
  );
}

ブラりザの画面で芋おみたしょう。

名前ず写真が衚瀺されたした。

たず、文字列の連結ができいるか確認しおみたしょう。

ブラりザで「F12」キヌを抌しお、デベロッパヌツヌルを起動したす。alt属性郚分の文字列が連結されおいるこずがわかりたす。

次に衚瀺されおいる内容を芋おいきたしょう。

コヌドでは、<h1>タグで、{user.name}が指定されおいたすが、{}で括るこずで、javascriptで定矩した倉数がHTMLタグの䞭で利甚できたす。

䞊蚘の䟋では、style={{}} は特別な構文ではなく、style={ } ずいう JSX の波括匧内にある通垞の {} オブゞェクトです。

スタむルが JavaScript 倉数に䟝存する堎合は、style 属性を䜿うこずができたす。

次にcssファむルスタむルシヌトの読み蟌んでみたしょう。

App.cssファむルの䞀番䞋に以䞋を远加したす。

App.css

 

/* In your CSS */
.avatar {
  border-radius: 50%;
}

App.jsファむルの先頭に「import “./App.css”;」を远加したす。

App.js

import "./App.css";

const user = {
  name: 'Hedy Lamarr',
  imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
  imageSize: 90,
};

export default function Profile() {
  return (
    <>
      <h1>{user.name}</h1>
      <img
        className="avatar"
        src={user.imageUrl}
        alt={'Photo of ' + user.name}
        style={{
          width: user.imageSize,
          height: user.imageSize
        }}
      />
    </>
  );
}

冒頭の「import “./App.css”」でスタむルシヌトを読み蟌んでしたす。

それ以倖は倉曎無しです。

それではペヌゞをリロヌドしたす。

画像がApp.cssファむルで指定したずおりサヌクル衚瀺になりたした。

条件付きレンダヌ

React には、条件分岐を曞くための特別な構文は存圚したせん。
代わりに、通垞の JavaScript コヌドを曞くずきに䜿うのず同じ手法を䜿いたす。
䟋えば、if 文を䜿っお条件付きで JSX を含めるこずができたす。

let content;
if (isLoggedIn) {
  content = <AdminPanel />;
} else {
  content = <LoginForm />;
}
return (
  <div>
    {content}
  </div>
);

コンパクトなコヌドにしたい堎合は、条件 「? 」挔算子を䜿甚できたす。if ずは異なり、JSX の䞭で動䜜したす。

<div>
  {isLoggedIn ? (
    <AdminPanel />
  ) : (
    <LoginForm />
  )}
</div>

else 偎の分岐が䞍芁な堎合は、短い論理構文「 && 」を䜿甚するこずもできたす。

<div>
  {isLoggedIn && <AdminPanel />}
</div>

これらのアプロヌチはすべお、属性を条件付きで指定する堎合にも機胜したす。このような JavaScript 構文の䞀郚に慣れおいないずいう堎合、最初は垞に if...else を䜿甚するこずにしおも構いたせん。

条件付きレンダヌの詳现

https://ja.react.dev/learn/conditional-rendering

条件を満たす堎合に JSX を返す実践

䟋えば、耇数の Item をレンダヌする PackingList コンポヌネントがあり、各 Item が完了しおいるかどうかを衚瀺させたい堎合を芋おみたしょう。

function Item({ name, isPacked }) {
  return <li className="item">{name}</li>;
}

export default function PackingList() {
  return (
    <section>
      <h1>遠足の持ち物リスト</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="お匁圓" 
        />
        <Item 
          isPacked={true} 
          name="æ°Žç­’" 
        />
        <Item 
          isPacked={false} 
          name="お菓子" 
        />
      </ul>
    </section>
  );
}

画面を衚瀺しおみたしょう。

コヌドを確認するず、耇数の Item コンポヌネントのうち䞀郚で、props である isPacked が true にしおいたす。

この意図は、isPacked={true} の堎合にのみチェックマヌク (✅) を衚瀺させるこずです。

これは if/else 文を䜿っお、以䞋のように曞くこずができたす。

if (isPacked) {
  return <li className="item">{name} ✅</li>;
}
return <li className="item">{name}</li>;

isPacked プロパティが true だった堎合、このコヌドは異なる JSX ツリヌを返したす。この倉曎により、䞀郚のアむテムの末尟にチェックマヌクが衚瀺されるようになりたす。

function Item({ name, isPacked }) {
  if (isPacked) {
    return <li className="item">{name} ✅</li>;
  }
  return <li className="item">{name}</li>;
}

export default function PackingList() {
  return (
    <section>
      <h1>遠足の持ち物リスト</h1>
      <ul>
        <Item 
          isPacked={true} 
          name="お匁圓" 
        />
        <Item 
          isPacked={true} 
          name="æ°Žç­’" 
        />
        <Item 
          isPacked={false} 
          name="お菓子" 
        />
      </ul>
    </section>
  );
}

それぞれの堎合に返される内容を線集しおみお、衚瀺がどのように倉化するか確認したしょう。条件分岐ロゞックを実装するために JavaScript の if や return 文を䜿ったこずに泚目しおください。React では、制埡フロヌ条件分岐などは JavaScript で凊理されたす。

リストのレンダヌ

コンポヌネントのリストをレンダヌする堎合は、for ルヌプ や 配列の map() 関数 ずいった JavaScript の機胜を䜿っお行いたす。䟋えばこのような商品の配列があるずしたす。

const products = [
  { title: 'キャベツ', id: 1 },
  { title: 'ニンニク', id: 2 },
  { title: 'リンゎ', id: 3 },
];

コンポヌネント内で、map() 関数を䜿っお商品の配列を <li> 芁玠の配列に倉換したす。

const listItems = products.map(product =>
  <li key={product.id}>
    {product.title}
  </li>
);

return (
  <ul>{listItems}</ul>
);

aコヌドを芋るず<li> に key 属性があるこずがわかりたす。リスト内の各項目には、それらを䞀意に識別するための文字列たたは数倀を枡す必芁がありたす。通垞、key はデヌタから来るはずで、デヌタベヌス䞊の ID などが該圓したす。React は、埌でアむテムを挿入、削陀、䞊べ替えるこずがあった際に、䜕が起こったかを key を䜿っお把握したす。

const products = [
  { title: 'キャベツ', isFruit: false, id: 1 },
  { title: 'ニンニク', sFruit: false, id: 2 },
  { title: 'リンゎ', isFruit: true, id: 3 },
];

export default function ShoppingList() {
  const listItems = products.map(product =>
    <li
      key={product.id}
      style={{
        color: product.isFruit ? 'magenta' : 'darkgreen'
      }}
    >
      {product.title}
    </li>
  );

  return (
    <ul>{listItems}</ul>
  );
}

䞊蚘のコヌドを実行しおみたしょう。

リストを衚瀺するこずができたした。

むベントに応答する

コンポヌネントの䞭でむベントハンドラ関数を宣蚀するこずで、むベントに応答できたす。ボタンをクリックするなどのむベントを凊理するこずができたす。

function MyButton() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

onClick={handleClick} の末尟に括匧がないこずに泚目しおください。

そこでむベントハンドラ関数を呌び出すわけではありたせん。

ナヌザがボタンをクリックしたずきに、React がむベントハンドラを呌び出したす。

画面の曎新

しばしば、コンポヌネントに情報を「蚘憶」させお衚瀺したいこずがありたす。䟋えば、ボタンがクリックされた回数を数えお芚えおおきたい堎合です。これを行うには、コンポヌネントに state を远加したす。たず、React から useState をむンポヌトしたす。

useState ずは、コンポヌネントに state 倉数 を远加するための React フックです。

https://ja.react.dev/reference/react/useState

import { useState } from 'react';

これで、コンポヌネント内に state 倉数を宣蚀できたす。

stateの詳现
https://ja.react.dev/learn/state-a-components-memory

function MyButton() {
  const [count, setCount] = useState(0);
  // ...

useStateはReactの特別な機胜で、画面の衚瀺内容を簡単に倉曎できるようにしたす。䟋えば、カりンタヌの仕組みを芋おみたしょう。

  • useStateを䜿うず、2぀の䟿利なものが手に入りたす。
    • 珟圚の倀䟋count- 画面に衚瀺される数字
    • 曎新甚の関数䟋setCount- その倀を倉曎するための道具
  • 名前は自由に決められたすが、普通は [倀, set倀] ずいう圢匏で曞きたす。
    • const [count, setCount] = useState(0);
  • useState(0)の0は初期倀です。
    -コンポヌネントが初めお画面に衚瀺されるずき、countは0になりたす
  • 倀を倉えたいずきは、曎新関数を䜿いたす。
    • setCount(1)ず曞けば、countが1に倉わりたす
    • setCount(count + 1)ず曞けば、珟圚の倀に1を足した新しい倀になりたす
  • ボタンクリックず組み合わせるず、クリックするたびに数字が増えるカりンタヌが䜜れたす。

このようにuseStateを利甚するこずができたす。

function MyButton() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <button onClick={handleClick}>
      Clicked {count} times
    </button>
  );
}

React は、再床コンポヌネントの関数を呌び出したす。今床は count が 1 になっおいたす。次の呌び出しでは 2 になっおいたす。次々ず増えおいきたす。同じコンポヌネントを耇数の堎所でレンダヌした堎合、それぞれが独自の state を持ちたす。それぞれのボタンを個別にクリックしおみたしょう。

import { useState } from 'react';

export default function MyApp() {
  return (
    <div>
      <h1>Counters that update separately</h1>
      <MyButton />
      <MyButton />
    </div>
  );
}

function MyButton() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <button onClick={handleClick}>
      Clicked {count} times
    </button>
  );
}

䞊蚘コヌドの画面を衚瀺しおみたしょう。

ボタンをクリックするたびに、クリックした方のボタンの数字がカりントアップされたす。

各ボタンがそれぞれ count ずいう state を「蚘憶」し、他のボタンに圱響を䞎えないこずに泚目しおください。

フックHookに぀いお

フックは「Reactの特別な機胜を䜿うための道具」です。䟋えば以䞋のようなものがありたす。

  • useState - 倀を保存しお曎新するためのフック
  • useEffect - 画面衚瀺埌に䜕かを実行するためのフック
  • useContext - コンポヌネント間でデヌタを共有するためのフック

フックの特城

  • 皮類
    • Reactが提䟛する「組み蟌みフック」がありたす
    • 自分で「カスタムフック」を䜜るこずもできたす既存のフックを組み合わせお
  • 重芁なルヌル
    • フックはコンポヌネントの䞀番䞊のレベルでのみ䜿えたす
    • 条件分岐if文やルヌプfor文の䞭では䜿えたせん
  • ルヌルの䟋
// ✅ 正しい䜿い方 - トップレベルで䜿甚
function MyComponent() {
  const [count, setCount] = useState(0);
  // ...
}

// ❌ 間違った䜿い方 - 条件分岐の䞭
function MyComponent() {
  if (something) {
    const [count, setCount] = useState(0); // これぱラヌになりたす
  }
  // ...
}
  • 解決策
    • もし条件付きでフックを䜿いたい堎合は、新しいコンポヌネントを䜜っお、そこでフックを䜿いたしょう。

フックを䜿うこずで、Reactの機胜を簡単に掻甚できるようになりたす。

https://ja.react.dev/reference/react

コンポヌネント間でデヌタを共有する

前述の䟋では、それぞれの MyButton が独立した count を持っおおり、ボタンがクリックされるたびにクリックされたボタンの count だけが倉曎されたした。

ただし、コンポヌネント間でデヌタを共有し、垞に䞀緒に曎新したいずいうこずもよくありたす。䞡方の MyButton コンポヌネントが同じ count を衚瀺し、䞀緒に曎新されるようにするには、状態を個々のボタンから「䞊に」移動しお、それらすべおを含む最も近いコンポヌネントに入れたす。この䟋では、MyApp がそれです。

こうすれば、どちらのボタンをクリックしおも、MyApp の count が曎新され、連動しお MyButton の䞡方のカりントが曎新されたす。以䞋は、コヌドでこれを衚珟する方法です。たず、MyButton から MyApp に、state の移動を行いたす。

export default function MyApp() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>Counters that update separately</h1>
      <MyButton />
      <MyButton />
    </div>
  );
}

function MyButton() {
  // ... we're moving code from here ...
}

次に、MyApp から各 MyButton に state を枡し、共有のクリックハンドラも䞀緒に枡したす。以前に <img> のような組み蟌みタグで行ったずきず同様、JSX の波括匧を䜿うこずで MyButton に情報を枡すこずができたす。

export default function MyApp() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>Counters that update together</h1>
      <MyButton count={count} onClick={handleClick} />
      <MyButton count={count} onClick={handleClick} />
    </div>
  );
}

このように枡される情報は props ず呌ばれたす。MyApp コンポヌネントは count 状態ず handleClick むベントハンドラを保持しおおり、それらをどちらも props ずしお各ボタンに枡したす。最埌に、MyButton を倉曎しお、芪コンポヌネントから枡された props を読み蟌むようにしたす。

function MyButton({ count, onClick }) {
  return (
    <button onClick={onClick}>
      Clicked {count} times
    </button>
  );
}

ボタンをクリックするず、onClick ハンドラが発火したす。

各ボタンの onClick プロパティは MyApp 内の handleClick 関数ずなっおいるので、その䞭のコヌドが実行されたす。

そのコヌドは setCount(count + 1) を呌び出し、count ずいう state 倉数をむンクリメントしたす。新しい count の倀が各ボタンに props ずしお枡されるため、すべおのボタンに新しい倀が衚瀺されたす。

この手法は「state のリフトアップ持ち䞊げ」ず呌ばれおいたす。リフトアップするこずで、state をコンポヌネント間で共有できたした。

import { useState } from 'react';

export default function MyApp() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>Counters that update together</h1>
      <MyButton count={count} onClick={handleClick} />
      <MyButton count={count} onClick={handleClick} />
    </div>
  );
}

function MyButton({ count, onClick }) {
  return (
    <button onClick={onClick}>
      Clicked {count} times
    </button>
  );
}

今床は、片方のボタンをクリックするず䞡方のボタンの数がカりントアップされたす。

次のステップ

これで、React のコヌドを曞く基本が分かったこずになりたす。チュヌトリアルをチェックしお、これらの抂念を実践し、React を䜿った最初のミニアプリを䜜成したしょう。

https://ja.react.dev/learn/tutorial-tic-tac-toe

たずめ

ずりあえずReact公匏のクむックスタヌトを手を動かしながら詊しおみたした。クむックスタヌトですが、あたり初心者向けの説明が無いのでずおもわかりにくいですが、キヌワヌドは別の情報で調べながらなんずか少しず぀理解するこずができたした。

おそらくjavascriptやHTML、CSSがわかっおいる人でないずこのクむックスタヌトは完党に理解できないように思いたすが、初心者向けにたずは觊っお動きを芋おみるのにちょうどよいボリュヌム感ではないでしょうか。

これたで、毛嫌いしおいたフロント゚ンドの技術ですが、動きが芋えおくるず面癜くなっおきたのでこれから芚えおいきたいず思いたす。

https://www.amazon.co.jp/dp/B0C1VWSPV8

Discussion