【あべちゃんのフロントエンド塾】課題１を通して学んだこと

# はじめに

**「コンポーネント指向や、アトミックデザインを意識してポートフォリオサイトを作る」**という課題を通して、
**”苦労した点”**や**”それらをどう乗り越えたか”**など、自分の考えをまとめるためにも、整理しながらアウトプットしていきたいと思います。


# コンポーネント指向とは

> コンポーネント指向とは、ソフトウエアを機能ごとに部品（ソフトウエアコンポーネント）として分割し、必要に応じて組み合わせて使うという考え方である。

例えば、ホームページ内の”ヘッダー”にはメニューアイコンや検索バー、そのサイトのロゴなどがあったりします。

『コンポーネント指向』を意識して、それらひとつひとつを「コンポーネント」として切り出して作成することで、**後々の管理を行いやすくなる** メリットがあります。

また、必要に応じてコンポーネントを”再利用”することで、コードの記述量を減らすことも出来るし、複数箇所の変更を”一箇所”で同時に行うこともできます。


####【参考】

[フロントエンドのコンポーネント設計に立ち向かう]
(https://qiita.com/seya/items/8814e905693f00cdade2)


# Atomic Designとは（概念）


>Atomic DesignはUIコンポーネントの切り出し方と組み上げ方ついて、UIの粒度を明確にし、組織的な指標となるよう考え出された概念です。

>Atomic Designは自然界で起こっているのと同じプロセスを適用してUIを設計していきます。
自然界で起こっていることとは、すべての物質は原子で構成され、原子は互いに結合して分子を形成し、より複雑な生物に結合し、最終的には宇宙のすべての物質を創造している世界のことです。

>小さなUIコンポーネントが集まり、一つのコンポーネントとなり、さらにそれらを組み合わさるとページになる画面UIの比喩としています。

>Atomic Designは階層的なUI設計システムを作成するために、コンポーネントを以下の5つの単位に分別します。

>![atomic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1472874/fabc3b92-71ab-4c70-e4f3-7b6d4db92192.png)

>1. **Atoms**（原子）
フォームラベル、入力、ボタンなどの基本的なHTML要素。これ以上分けられないもっとも小さなUIパーツ。

>2. **Molecules**（分子）
原子を組み合わせてつくる比較的単純なグループ。たとえば、いいねボタン、コメントボタン、詳細ボタンを組み合わせてできるユーティリティ。

>3. **Organisms**（生命体）
原子と分子を組み合わせてできる大きなグループ。ヘッダーやフッターなど。

>4. **Templates**（テンプレート）
原子〜生体までのコンポーネントを配置した、ページレベルのフレーム。中の画像や文章などは「サンプル」になる。

>5. **Pages**（ページ）
テンプレートに具体的にコンテンツを埋め込んだもの

>ー参照ー
[Atomic Designとは 〜Atomic Designを使ったコンポーネント指向のUI開発：序〜](https://ugap.hatenablog.com/entry/2018/06/28/074920)


どの”粒度”でATOMSやMOLECULESなどに分けていくのか、という尺度は個人や所属しているグループによって変わると思います。

個人で開発している分には、厳密に意識しなくても今のところ困ることはそんなにありませんでした。

しかし、”ルール”をきちんと設けることで「もっとわかりやすいディレクトリ構造などに出来るんだろうな」と思うので、アトミックデザインの考え方は今後のためにもさらに深めていく必要があると思っています。

会社などに所属した場合にどのようなルールがあるのか、不安でもあり楽しみでもあります。
# 課題をこなす上で苦労した点

「エラーに遭遇したとき」や「全く知らないことを取り入れるとき」は当たり前ですが”精神的”にきつかったです笑

具体的な部分でいうと、

**”モーダル作成”**
**”コンタクトフォームのバリデーション”**

は、考え方やコードの記述方など頭を使いました。


# 苦労をどのように克服したか

####【エラーや、全く知らないことに遭遇したとき】

まずひたすらググります。笑
エラー文をそのまま検索したり、英文でわからないときは[DeepL](https://www.deepl.com/ja/home)というアプリを使って日本語に翻訳しました。

それでもわからない場合は、『あべちゃんのフロントエンド塾』にて質問を投げかけました。

質問をする際は「テンプレートに沿って」**質問に答えてくれる側がわかりやすく**なるようにまとめます。

●　タスクのゴール
●　現状
●　何がわからないのか
●　自分が試した方法
●　リモートリポジトリのURL

上記項目に沿って、そのときの状況を整理しました。


#### 【モーダル作成】

ここでは、`useState()`を使って状態を管理したり、`onClick()`でモーダルや`overlay`(※モーダル以外の部分を黒い画面にする)を出現させたり、というプログラムを実装していきました。

`props`を使って他のコンポーネントに`state`の情報を渡したりもしたので、モーダルの実装を行う過程でReactの基本的な機能を学習することができたように思います。

あとは、**余計なエラーに見舞われない**ように、検索して出てきたコードをまずは[CodeSandbox](https://codesandbox.io/?from-app=1)などで挙動を確かめて、そのあと自分のプログラムに組み込んでいきました。

Githubへの適宜`commit`や`push`も、粒度をなるべく細かくして頻繁に行いました。
ブランチを切って、マージしたりプルリクを出したり、といった部分の理解がまだしっかり出来ていないので、このあたりの学習も今後すすめていこうと思っています。


#### 【コンタクトフォームのバリデーション】

バリデーションは[React Hook Form](https://react-hook-form.com/jp/)を使って実装しました。

「名前」
「メール」
「メッセージ」

という項目に分けてコンタクトフォームを作ったのですが、「メール」の部分が苦労しました。

**”@gmail.com”のような記述がないとエラーになる**というバリデーションを作りたかったので、まずはその記述方法を検索し、さらに、複数のエラーメッセージに対応させる方法も調べ実装しました。

下記コードがその部分に該当します。

```contact.tsx
   <p className={scss.validateMsg}>
     {errors.Email?.type === "pattern" && "*Please enter a valid email address."}
     {errors.Email?.type === "required" && "*Email is required."}
   </p>
```
```contact.tsx
 {...register("Email", {
   required: true,
   pattern: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
 })}
```





# 参考サイト

####【Figma】

https://yososhi.com/archives/figma-for-beginner/

https://bagelee.com/design/figma-5-plugins/


#### 【デザイン】

https://colorhunt.co/


#### 【React関連】

https://blog.gaji.jp/2020/08/20/4799/

https://www.i-ryo.com/entry/2020/12/11/065700

https://awesome-linus.com/2020/01/03/react-material-ui-css-nth-of-type-hover/

https://yoheiko.com/?p=1856

https://material-ui.com/components/material-icons/#material-icons

https://qiita.com/10mi8o/items/2cc8f4a0e82cfb3082be

https://reffect.co.jp/react/react-modal

https://sam8hello.hatenablog.jp/entry/2018/05/25/192748


#### 【TypeScript関連】

https://zenn.dev/karibash/articles/4e432a91db3179


#### 【HTML, CSS関連】

http://www.htmq.com/html/textarea.shtml

https://mamiline.tumblr.com/post/132598484510/cssinput-%E3%81%AE%E5%88%9D%E6%9C%9F%E5%80%A4%E3%81%A7%E5%A4%89%E3%81%AA%E6%9E%A0%E7%B7%9A%E3%81%8C%E3%81%A7%E3%82%8B%E3%81%AE%E3%82%92%E6%B6%88%E3%81%99

https://qiita.com/yassh/items/4256f8ca3856cd4f86cc

https://webis.co.jp/blog/1502/

https://cotodama.co/position-absolute-center/

https://tomotan.hateblo.jp/entry/web-placeholder-position

https://daib-log.com/responsive/

https://zenn.dev/thao_0108/articles/d48a8a763f791c71e21b

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Flexible_Box_Layout/Aligning_Items_in_a_Flex_Container

https://qiita.com/ROY_M/items/2c4feb5de05535441bc8


####  【AWS Amplify】

https://aws.amazon.com/jp/amplify/hosting/

https://blog.denet.co.jp/aws-amplify-react/

https://www.d-make.co.jp/blog/2021/03/16/static-html-hosting-by-aws-amplify-console/

#### 【ファビコン】

https://ao-system.net/favicon/

https://qiita.com/190131start/items/ae7eeaa5522cd566fc5c

https://www.canva.com/

https://mebee.info/2020/05/05/post-8283/

#### 【ドメイン取得】

https://teratail.com/questions/235620

https://www.youtube.com/watch?v=8n-ejYlYNtw

https://www.youtube.com/watch?v=kFj_mdW7Sy8&t=771s

# まとめ

Reactを使うことで**SPA（シングルページアプリケーション）**として、挙動がサクサクと快適なポートフォリオが作れました。

TypeScriptは、`string`や`boolean`などのデータ型をあらかじめ指定することで、**セキュリティ的に堅牢**なアプリを作れるみたいですが、正直全然使いこなせていないです。

Atomic Designもそうですが、ひとまず”基礎的な概念”などがわかったので、しっかり理解して活用していきます。

**”１ヶ月”**という期間(まだ実質は半月程度)、一つの制作物と向き合うことで、詰まっているときは時間に追われる感じがして焦ってしまいますが、そうでないときは、逆にその領域の知見を落ち着いて深められて、そういう環境を提供してくれている**『あべちゃんのフロントエンド塾』**に入って良かったなと、改めて思いました。

基本的には**”自走力”**を付けることに重きを置いている塾なので、ひとりでコツコツやることになるのですが、**困ったときは質問できる環境がある**、また、**同じ課題に取り組んでいる仲間がいる**という状況は心にゆとりを持たせてくれます。

今後も、今回のポートフォリオのブラッシュアップをしながら、さらに知識を深め、技術も高めていきたいと思います。