2023/07/28
初めてReactで開発して感じたことのレポート
React初体験
今月にスターフィールド のWebサイトが新しくリニューアルされました。この開発に伴い始めてReact環境で開発を体験しました。 ReactはJavaScriptのライブラリの一種と聞いてはいましたが、Webデザイナーとして経験してきたJavaSciptの開発とは全く別物のように感じました。
このブログでは、React環境での開発体験を詳しくまとめて、初心者がReactに挑戦する際に直面するであろう注意点、気づいたポイントについてまとめます。
そもそもReact とは?
ReactはJavaScriptライブラリであり、主にユーザーインターフェースを構築するのに向いています。近年、Webサイトを構築する上でheader、footerなど 共通部分をモジュール化し、それを読み込ませてページを作ります。 Reactはこのモジュール化の考え方が色濃く表れてる言語という印象を受けました。また、そのため今までの開発環境と大きく変わりました。
例えば、jQuery環境で開発する場合、一般的にはタグ内にjQueryファイルを読み込むコードを記載するでしょう。そして、topページ内ではメインビジュアルをslickスライダーなどのモジュールを読み込み動きを設定し、CSSで装飾をする。などの流れで動きのあるリッチコンテンツを作ります。
しかし、Webサイト全体を見た場合、例えばプライバシーポリシーページなど、ただテキストを配置するだけで、特別な仕掛けもないページも存在します。このとき、不要なページにもjQueryファイルを読み込ませてしまい、サーバーには余計な負荷を書けることになります。
一方、Reactの場合、例えばメインビジュアルのスライダーは
一見すると、WordPressでもよく使われる「include」により、各パーツを指定してページを構成する方法と似ていますが、大きく違うのはWordPressは呼び出すデータはHTMLだけになります。そのため呼び出したページのCSSで、読み込んだHTMLに改めてスタイルを適用させる必要があります。
しかし、Reactの場合はCSSも適用された完成形の形でモジュールが呼び出されるため、改めてスタイルを適用させるを必要もありません。
例えるなら、ブロック工法(機械や建物の製造時に、いくつかの要素を分けて同時に製造し、最後に繋ぎ合わせて完成させる工法)に近い考え方でページを作ります。
実際の記述について
開発を体験してみて、記述の仕方が独特と感じました。実際に特徴的だと思った点を主にまとめてみました。
・各ページ、モジュールを「.tsx」ファイルで作る。
先ずは各ページのモジュールを作ります。
1import Head from 'next/head'; 2import styles from '@/styles/career.module.scss'; 3 4 5function 関数() { 6 return ( 7 実際のHTML 8 ); 9} 10
という形で記述します。
また、HTMLの記述も全てのタグを「 /(スラッシュ)」を記述して閉じなくてはいけません。大概のタグは/(スラッシュ)で閉じるので当たり前ですが、
やタグにもそのルールが適用されて、まるでXHTMLのような記述をする必要があります。
またCSSも
1<div className={styles.textArea}> 2
などのような形で指定していきます。
少しでもミスがあるとエラーが出てしまい、表示が崩れてしまうレベルではなく、ページその物が閲覧できない状態となり戸惑いました。
外部ライブラリーやプライグインを使う場合
トップ画面などで、複数枚の画像をスライダーで見せるホームページはよくあります。jQuery環境下ではこのようなコンテンツを作る際は、主に、slickスライダーなど、有名なプラグインを使うケースが多いです。Reactでもこのようなプラグインを使うことができます。
slickスライダーを例に、React で プラグインを使う場合は以下のようにします。
先ず、
1$ npm install react-slick 2 3(yarn を使っている場合は yarn add react-slick ) 4
とコードを導入して、プロジェクトに silick スライダーをインストールします。
そして、.tsvファイルにCSSと同様に
1import Slider from 'react-slick'; 2import "slick-carousel/slick/slick.css"; 3import "slick-carousel/slick/slick-theme.css"; 4
と記述します。 これで sickスライダーが使える環境が整います。
後は他のモジュールと同様に作成していきます。 例えば、
1 2function slickContents() { 3 const settings = { 4 dots: true, 5 autoplay: true, 6 infinite: true, 7 speed: 500, 8 slidesToShow: 1, 9 slidesToScroll: 1 10 } 11 12 return ( 13 <ul> 14 <Slider {...settings}> 15 <li><img src={img1} alt='img1' /></li> 16 <li><img src={img2} alt='img2' /></li> 17 <li><img src={img3} alt='img3' /></li> 18 </Slider> 19 </ul> 20 ); 21} 22
などのように記述します。
1 const settings = { 2 } 3
こちらの箇所でslickスライダーの設定をします。 jQueryでは外部ファイルのjsファイルに記述して設定するケースが多いですが、記述する位置が違うだけで設定の方法は概ね同じです。
スライダーの動きを設定したあと
1 return ( ) 2
で実際のHTMLを書き、モジュールを作成します。
そして、実際にスライダーを掲載したい位置に
1 2<slickContents/> 3
と記載する事でスライダーが設置されます。
reactは全般的にこのような流れで開発を進めていきます。
プラグインを使わないコードについて
jQuery環境で開発をする際、プラグインを使わず自分で簡単なコードを記述してコンテンツを作る場合があります。 例えば、クリックしたらclss 「on」 を追加し、CSSで実際にその変化を作るということはよくありました。
同じ事をReact環境下でも行いました。
今回実際にアコーディオン形式でクリックしたら配下のコンテンツの表示、非表示が切り替える動きを作りました。
li="dropListItem" をクリックしたら これにon を追加したり、削除する。という動きを作りました。 そして、CSSで li="dropListItem on" の時は配下の hideArea が表示されるという仕掛けを作成しました。
実際には以下のように記述しました。
1import React, {useState} from 'react'; 2 3 4function DropListItem ({title , text}) { 5 const [isOn, setIsOn] = useState(false); 6 const handleClick = () => { 7 setIsOn(!isOn); 8 }; 9 10 return ( 11 <li className={`dropListItem ${isOn ? 'on' : ''}`} onClick={handleClick}> 12 <div className={styles.showArea}> 13 <p>{title}</p> 14 </div> 15 16 <div className={styles.hideArea}> 17 <p>{text}</p> 18 </div> 19 </li> 20 ) 21} 22
先ずはReqctの「useState」という関数を使うので先に、
1import React, {useState} from 'react'; 2
と記述します。
そして、
1function DropListItem ({title , text}) 2
と従来の流れ通りにモジュールのタイトルを設定します。
1{title , text} 2
の部分は最後に解説します。
今回はHTMLに on と off の二段階の変化があります。このように変化するとき useStateを使います。
1const [isOn, setIsOn] = useState(false); 2
と、記述したのは「isON」という状態になるときと、「setIsOn」という状態になるときがある。 そして、
1useState(false); 2
と書くことで書記状態は useState で指定する変化がない状態という意味合いになります。
1 const handleClick = () => { 2 setIsOn(!isOn); 3 }; 4
この関数は hadleClick という関数が呼び出される度に、「setIsOn」と「isOn」 という状態が切り替わるという意味になります。
そして、実際にHTMLを記載する際に
1<li className={`dropListItem ${isOn ? 'on' : ''}`} onClick={handleClick}> 2
と記載しました。 解説すると、先ず、
1 2className={ dropListItem } 3
と記載し、liに「dropListItem」 というclass名を付けます。
1 2${isOn ? 'on' : ''} 3
この部分の意味は isOnの状態では、class「on」を追加、そうでないときは空白を入れる、つまり何も入れない状態にする。という意味になります。
1 2onClick={handleClick} 3
はクリックした際に 「handleClick」を呼ぶという状態になります。
事前に、「handleClick」は「isOn」と「setIsOn」を切り替えるように設定しているのでクリックする度に on が挿入した状態とされない状態に切り替わるようになります。
これで、動作については完成しました。後は、実際にを配置したい場所に
1 2<DropListItem /> 3
と記述することで配置できます。
しかし、この
そのため、先ず、
1 2function DropListItem ({title , text}) 3
と記載し、
実際にテキストを変えるHTMLには
1 <li className={`dropListItem ${isOn ? 'on' : ''}`} onClick={handleClick}> 2 <div className={styles.showArea}> 3 <p>{title}</p> 4 </div> 5 6 <div className={styles.hideArea}> 7 <p>{text}</p> 8 </div> 9 </li> 10
と記載しました。
最終的には以下のように記述します。
1 2<ul>タイトル1の詳細情報を記載ます。 3 <DropListItem title="タイトル1" text="タイトル1の詳細情報を記載します。"/> 4 <DropListItem title="タイトル2" text="タイトル2の詳細情報を記載します。"/> 5 <DropListItem title="タイトル3" text="タイトル3の詳細情報を記載します。"/> 6 <DropListItem title="タイトル4" text="タイトル4の詳細情報を記載します。"/> 7</ul> 8
このような流れでアコーディオン形式のコンテンツの作成ができました。
6 まとめ
Reactは今までのHTMLとCSS、それにjQueryによる開発に慣れている人から見たら全く違う物のように感じます。そのため戸惑う部分が多くあります。 しかし、モジュール単位で開発をするという性質上、複数人での開発に適していると感じました。
せっかく会社に属して仲間と共に開発の仕事をしているので、積極的に覚えてより良い物を作りたいと思いました。
Author Profile
KANAZAWA
長年webデザイナーをしておりました。業務の幅を広めるため日々勉強しています。
SHARE