ともブロ。

Rails, Vue.js, React.js, JavaScript等、日々学んだ技術・知識を備忘録的に記していきます。

【React】Hooksについてカウントアプリを作成して学ぶ

ReactはHooksの扱い方が重要だと感じた。 Railsからweb開発に入っている為、状態管理についてイメージしにくいため、学んだことを記事化する。

React Hooksとは?

version 16.8から新たに追加されたAPI。 Hooksを利用することで、関数コンポーネント(functional component)においても状態管理を行うことができる。

状態管理はカウントアプリを想像すると理解しやすい。 ボタンをクリックすると、数値が1ずつ上がっていく。 Hooksの中の機能の一つである、useStateを利用することで容易に作成できる。

以下がカウントアプリのコード例(component)。

import { React, useState, Fragment } from "react";

const Caluclator = () => {
  const [count, setCount] = useState(0);

  const countUp = () => {
    setCount(count + 1);
  };

  const countDown = () => {
    setCount(count - 1);
  };
  const countReset = () => {
    setCount(0);
  };

  return (
    <Fragment>
      <h1>{count}</h1>
      <button onClick={countUp}> + </button>
      <button onClick={countDown}> - </button>
      <button onClick={countReset}> RESET </button>
    </Fragment>
  );
};

export default Caluclator;

FunctionalComponent, アロー関数で書いている。

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

これにより、count, setCount共に初期値は0と明示的に宣言している。 ちなみに、count はカウント数、setCountはカウント数を更新する関数だ。

なぜ引数を2つ(count, setCount)入れているかというと、useStateにおいては、state,stateを更新する関数をペアにするからだ。 つまり、今回のアプリではstate=count, stateを更新する関数=setCountとなる。

  const countUp = () => {
    setCount(count + 1);
  };

  const countDown = () => {
    setCount(count - 1);
  };
  const countReset = () => {
    setCount(0);
  };

こちらはカウントアップ(+)、カウントダウン(-)、カウントリセット(RESET)の関数。 setCountの引数にcount+1, count-1と入れることで、現在のcountの数値からそれぞれプラス、マイナスされる。 countResetではsetCount(0)とすることで、強制的に0に戻す。

  return (
    <Fragment>
      <h1>{count}</h1>
      <button onClick={countUp}> + </button>
      <button onClick={countDown}> - </button>
      <button onClick={countReset}> RESET </button>
    </Fragment>
  );

こちらのコードはreturnにより返却されるモノ。 countUp, countDown, countResetを呼び出し、ボタンを表示させる。

以上がHooksを利用したカウントアプリが完成した。

小ネタ:コード末尾のexport文を消す?

上記コード例では、末尾で

export default Caluclator

と、exportしているが、これは消すことができる。

const Caluclator = () => {
...

を、

export default function Caluclator {
...

と、予め宣言することで、末尾にexportを書く必要がなくなる。