【基礎】useEffect.useStateについて

Reactを使用した開発の勉強をしているので、頻繁に使用するuseEffectやuseStateなどのHooksにして基本的な用途と作業した例をまとめます。

1. そもそもHooks(useEffect、useState)って何?


1-1. React Hooksとは?

React Hookとは上記のReactの機能をクラスを使用せずに使える機能です。

Hooksは関数コンポーネントという扱いで、React16.8から追加された機能になります。


Reactには記述方法が以下の2種類があります。

 ■クラスコンポーネント

 ■関数コンポーネント

上記の2種でHooksが追加される前はクラスコンポーネントで記述するのが一般的となっていました。


理由としては当時はクラスコンポーネントにのみ

 ■変数などの状態管理

 ■ライフサイクル

などの機能があるのですが、当時の関数コンポーネントではそれらの機能がありませんでした。

そのため、関数コンポーネントよりもクラスコンポーネントを主に使用していました。


ですが、Hooksの機能が追加されたことにより、関数コンポーネントで状態管理・ライフサイクルなどの機能を使用できるようになりました。

後述しますがクラスコンポーネントよりも関数コンポーネントのほうがコード量が少なく、読みやすいため書きやすく再利用が容易になります。

1-2. useEffect・useStateとは?

useEffect、useStateはReact Hooksというクラスを使用せずにReactを書くことができる機能の一つです。

useStateは関数コンポーネントのState(状態)を保持、更新するための機能です。

例えばカウンターを作成したとすると、カウント数の保持やカウント数の増減などの状態を変更します。


useEffectはDOMの変更やファイルの書き込みなどのイベント処理の発火タイミングを指定することができます。

主な使用としては外部APIなおからデータの取得をする場合などに使用されます。

その際にはasync awaitなどの非同期処理構文を使用することがあります。

2. React Hooks(useEffect、useState等)のメリット


useEffect、useState等のReact Hooksを使用するメリットとしては、

 ■複雑なクラスコンポーネントを減らせる

 ■props,stateの管理等の負担を軽減できる

 ■コンポーネント間でのStateを共有しやすくできる

 ■関数コンポーネントのリファクタリングが容易になる


などの実作業においてかなり便利になる要素があります

2-1. メリットの詳細説明

Reactではコンポーネントの記述が2通りあり、クラスを使用する場合と関数を使用する場合があります。

関数

 const 関数名 = (引数(props)) => {
   return <h1>{引数}</h1>
  }

同様の記述をクラスで記述した場合は、

クラス

 class クラス名 extends 継承するクラス{
  render(){
      cpmst { 引数 } = this.引数(props);
      return <h1>{ 引数 }</h1>;
    }
  }

こちらはクラスなので、thisを使用して引数である(props)を参照して使用する必要があります。

上記を参考にuseEffect、useStateの記述例を以下にまとめます。

関数の場合

■useEffect、useState

 import { useState, useState } from "react":

  function App(){
   const [状態を格納する変数、状態を変更する関数] = useState(初期値);
   
   useEffect(() => {
    <div>
     //変更した状態を表示
     <p>count : {useState}</p>
   //ボタンをクリックして状態を変更
     <button onClick-{() -> setState(count + 1)}>Click</button>
    </div>
   }

   retrun (
    <div>
      <p>クリック回数:{useState}</p>
      <button onClik={() => setState(count + 1)}>
        Click
      </button>
    </div>
   );
};

useEffectはuseStateなどで更新された際のレンダー時および毎回の更新時に呼び出しが行われます。

クラスの場合

 class クラス名 extends 継承するクラス{
   constructor(引数(props)){
     super(引数(props));
     this.state - {
       count: 0,
      }
     }
   
    componentDidMount(){
     docuent.title = "${this.state.count} 回クリック"
   

3. クラスコンポーネントと関数コンポーネントどちらを使用すればいいのか?


クラスコンポーネントと関数コンポーネントどちらを使用すればいいのか?

React Hooksが出たことにより既存のクラスコンポーネントと関数コンポーネントのどちらを使用すればよいのか。


基本的には関数コンポーネントを使用することが推奨されています。

こちらはReact開発チームとしても、長期的にはHooksである関数コンポーネントを書く際の第一選択になるように意識しています。


Hooksの登場でクラスのみでしかできないことが関数コンポーネントでできるようになっているので、実際に作業をする際には関数コンポーネントで作成をするで大丈夫そうです。

まだ対応していないライフサイクルについても、今後対応するとのことなのでいずれは関数コンポーネントでできないことはなくなるかと思います。


また、カスタムフックというというユーザーがフックを作成することもできるようです。

このように関数コンポーネントを推進しているので、使用するのは関数コンポーネントを優先するといいと思います。

ですが、実際に現地のほうではクラスを使用している所もあるようなので、クラスコンポーネントに関しても多少は勉強が必要ではあります。