「AWS無料相談会」をオンラインで開催中

React Hooks

こんにちは、土居です。赤ちゃんがどんどん重くなってきて、しばらく抱っこしているとかなりズッシリきますが、その分成長を実感しています。

Hooks

ReactのHooks機能が16.8.0より正式版になりましたが 、実はまだ使ったことなかったのでちょっと触ってみました。Hooksを使えば、classを書くことなくstateを用いることができるようです。

Hooksとは?

class componentでは以下のようにしてコンストラクタでstateにデフォルトをセットしたりしていますが

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = this.defaultState();

    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({value: event.target.value})
  }
}

HooksのuseStateを使うと関数コンポーネント内でこんな感じで書くことができて、
stateに引数で渡したデフォルト、setValueにstateを更新できる関数が返ってきます。

const App = () => {
  const [state, setValue] = useState(defaultState);
}

その他のHook

useEffect

コンポーネントのマウント/アンマウント時ににデータを取ってくるときに、class componentのライフサイクルでは
以下のようにやっていたのを

class App extends React.Component {
  <!-- マウント時にしたい処理 -->
  componentDidMount() {
    setValue();
  }
  <!-- アンマウント時にしたい処理 -->
  componentWillUnMount() {
    cleanUp();
  }
  <!-- 更新時 -->
  componentDidUpdate() {
    cleaUp();
    setValue();
  }
}

useEffectを使うと関数コンポーネント内でこう書けて、記述量も減っています。

const App => {
  useEffect(() => {
    setValue();
    return () => {
      cleanUp();
    }
  });
}

useReducer

複数の値についてstateを更新したり、今のstateの値をみたい場合などは以下のようにreducer関数を用意した上で、
useReducerを使うと、typeによって動作を切り替えるdispatch関数が返されます。useStateの応用みたいな感じですね。
この辺りは業務で使っているNuxt.jsのVuexに似ていたので、馴染みがありました。

const reducer = (state, action) => {
  switch (action.type) {
    case "request":
      return {
        ...state,
        fetching: true,
        errorMessage: null,
      };
    case "success":
      return {
        ...state,
        fetching: false,
        movies: action.payload
      }
    default:
      return state;
  }
}
const App = () => {
  const [state, dispatch] = useReducer(reducer, defaultState);

  dispatch({
    type: "requesst",
    payload: result.item
  })

  result = fetch();

  dispatch({
    type: "success",
    payload: result.item
  })
}

まとめ

便利なHookですが、stateにどのように動作しているのかはちょっと気になります。
フックのルール
こちらにさらに詳しいことが書いてあるようなので、気になる方は目を通してみてください。

参考:
https://reactjs.org/docs/hooks-reference.html