【React】って何だ？

# はじめに

はじめまして！ガク@Necono_Engineerと申します。
プログラミングスクール<font color="Orange">RUNTEQ</font>で、現在RubyとRuby on Railsを中心に学んでいます。この度フロントエンドの技術<font color="Aqua">`React`</font>について学びましたので、その知識をシェアしたいと思います!


![React](https://test-hack.com/wp-content/uploads/2022/04/9d0a6780-394a-11eb-9fd1-6296a684b124.jpeg)
↑ ( アイコンカッコよくて好きです...)

# 概要
今回、ちょっと勇気を出して新しい分野、<font color="Aqua">`React`</font>に手を出してみることにしました。その大きなきっかけは、ポートフォリオ作成です。僕にとってReactは未知の領域です。RUNTEQでの学びは、RubyとRuby on Railsが中心になります。それでも、現在のウェブ開発のトレンドを見逃すわけにはいかないと思い、ポートフォリオをより引き立てるためには、Reactの知識が必要だと感じました。
この記事では、React初心者がゼロから少しずつ学んだことを共有していきたいと思います。

:::note warn
プログラミング初学者のため、内容に誤りがある可能性がございます。
もし間違いがあればご指摘いただけると幸いです。
:::


# 初めてのReact

Reactは`シングルページアプリケーション（SPA）`の開発によく使われるJavaScriptライブラリです。React自体はRuby on Railsのようなフレームワークではありません。あくまでもUIを構築するだけのライブラリです。

# ライブラリって？
ライブラリとは再利用可能なプログラムを1つのファイルにまとめたものです。
`「コンポーネント」`と呼ばれる小さく独立した部品から組み立てることができるツールセットのようなものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/39f1c67a-9156-6d09-e389-690cda52b03a.png)




## SPAって？(Single Page Application)

ReactはSPA(Single Page Application)で作成されています。
SPAはその名の通り(1つのページのアプリケーション)基本的に`HTMLファイルは1つのみ`でJavaScriptで画面を書き換えることで画面遷移などの動きを実現しています。

従来のWebシステム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/9c37e024-de65-441d-2f71-f2f4f7063692.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/c13d3ebd-564a-004f-d859-00eac4211f82.png)
従来のWebシステムの場合、ページ遷移の度にサーバー側にリクエストが送られます。この場合、サーバー側からHTMLファイルを返却するためページ遷移の際に少しだけラグがあります。

SPAの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/2902f0cc-56cb-2b4f-34cc-d7184fb6a746.png)
1️⃣ユーザーが「Webページ見せて~」とリクエストを送るとHTMLファイルを返却してくれます(ここまでは従来と一緒）
2️⃣その後、画面表示を変更したい場合はHTMLはそのまま変更することなく、JavaScriptで`DOM`を書き換えてデータを画面に反映、遷移を実現します。

データのみの取得であれば非同期で実行できるため、ラグがなく快適な閲覧が可能になります!

# DOM(Document Object Model)とは？
ドキュメントオブジェクトモデルという名前の通り、DOMはWebページを構成するHTMLタグやテキスト、属性などの情報を一つ一つの「オブジェクト」として管理する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/ddb91214-3806-336a-a7f7-81d6b25d36b6.png)
イメージとしては、Webページを一つの大きな「ツリー」のように考えます。
そのツリーにはたくさんの「枝」と「葉」がついていると想像してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/1be8d709-7be0-8528-bfa1-e71642c5fc9e.png)
この「ツリー」全体が`DOM`であり、それぞれの「枝」や「葉」がWebページの要素（例えば、ヘッダー、画像、テキストなど）を表しています。

# 仮想DOM
Reactには**仮想DOM**を構築する機能が備わっています。

たとえばウェブページに何か変更があったとき、通常だとページ全体をリロードして更新する必要があります。

しかし、それだと時間もかかりますし、ユーザーにストレスをかけてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/ae64cd2d-4d35-fd0d-61e6-7ca850bc482f.png)
(この画面でイライラした記憶...)

そこで仮想DOMの登場です。
仮想DOMはDOMのコピーを作成し、そこに変更を加えたものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/cc9c0672-a9fc-f3f1-3d9e-5c935ed78517.png)![ツリー仮装.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/71c4b2ab-3a63-1a66-5d12-3c4972a50a70.jpeg)
そして、変更が必要な部分だけをピンポイントで更新します。
変更差分だけを素早く描画することができるので、ウェブページの表示が速くなります。

# コンポーネント指向とは？
Web開発を部品単位(コンポーネント)に小さく分けて進める考え方のことです。
例）UIを構成する部品(ボタン、入力フォーム、モーダル、タブ）など
コンポーネントとはそれらを再利用できる単位で切り出したJavaScriptの関数のことを言います。
JavaScript（特にReactなどのフレームワーク）では、これらのコンポーネントは関数として定義されます。これを「関数コンポーネント」と呼びます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/f7ece52c-22bd-21ad-37bf-f3e0d38a2428.png)
(いろんな部品(コンポーネント)を作って再利用しやすくする)

### 関数コンポーネントの定義方法
関数コンポーネントは以下のように定義します。
```
function コンポーネント名( 引数 ) {
return ...JSXによる表示...;
}
```


# JSX(JavaScript XML)とは？
Reactの要素を生成するJavaScriptの拡張構文です。
Reactでは`JSX記法`と呼ばれる書き方を使用します。JavaScriptのファイル内に直接、HTMLと似たようなタグの記述ができます。

- HTMLとJSXの違いについて
```
<button class="post" >投稿する</button>
```
```
<button className="post" >投稿する</button>
```
CSSを適用する場合、JSXでは`class`ではなく`className`と記述します。
JSXのルールとして`return内は1つのタグで囲われている`必要があります。
```
const App = () => {
return (
  <> 
  <h1>こんにちは</h1>
  </>
 );
};
```
<>空のタグで囲んであげることで1つの要素として扱われるようになります。(Fragmentなど他にも1つのタグで囲む方法はありますが今回は割愛します）

# import/exportについて
Reactは`jsxファイル`(コンポーネント:部品）をimportすることでコンポーネントをレンダリングします。
`export const ファイル名`
`import {  ファイル名  } from “./ディレクトリ名`
上記のようにexportすればimportすることで他のファイルの内容をimportしたファイルで使用可能になります。
```
export const Square = () => {
return ( ~内容
 );
};
```
```
import { Square } from "./components/Square"
```
# Reactの醍醐味
作成したコンポーネント(部品）をLEGOのように組み合わせて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/062a69f7-a61d-e6f4-1183-96544bca4ffc.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/f5b6f7e3-287e-e9e4-67de-6ed6388d10c1.png)
大きなアプリを作ることができます！


# まとめ
今回は初歩の部分だけの紹介になりましたが、Reactには他にもState、Props、React Hooks、再レンダリングなど覚えることがたくさんあります。まだまだ道のりは長いですが記事を書くことでReactのことをもっと知っていきたいと思えました！

# 参考文献
- [モダンJavaScriptの基本から始める React実践の教科書](https://www.amazon.co.jp/%E3%83%A2%E3%83%80%E3%83%B3JavaScript%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-React%E5%AE%9F%E8%B7%B5%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E6%9C%80%E6%96%B0ReactHooks%E5%AF%BE%E5%BF%9C-Informatics-IDEA/dp/481561072X)
- [基礎から学ぶ React/React Hooks](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-React-Hooks-asakohattori/dp/486354359X)