XStateによるReactの状態管理

目次

1. はじめに

Reactの状態管理ライブラリには、Redux、Recoil、Zustand などさまざまな選択肢があります。その中でも XState は状態遷移を明確に定義できる ステートマシン に基づいたアプローチを提供し、複雑な状態管理を直感的に記述できます。

本記事では、XStateの基本仕様と使い方を解説し、他の状態管理ライブラリとの比較、実際のコードを使った導入方法を紹介します。


2. XStateの仕様と使い方

XStateとは?

XState は 有限状態機械 (FSM: Finite State Machine)階層型状態機械 (Statecharts) の考え方に基づいた状態管理ライブラリです。状態管理を視覚的に理解しやすくなり、複雑なアプリケーションの状態遷移を明確に定義できます。

インストール

まず、XStateをインストールします。

npm install xstate @xstate/react

また、開発時にはXStateの可視化ツール(XState Visualizer)を利用すると便利です。

簡単なステートマシンの作成

以下のコードで、簡単な トグルボタン のステートマシンを作成できます。

import { createMachine } from 'xstate';

const toggleMachine = createMachine({
  id: 'toggle',
  initial: 'inactive',
  states: {
    inactive: {
      on: { TOGGLE: 'active' }
    },
    active: {
      on: { TOGGLE: 'inactive' }
    }
  }
});

このマシンは inactiveactive の2つの状態を持ち、TOGGLE イベントで遷移します。

3. XStateと他の状態管理ライブラリの比較

ライブラリメリットデメリット
XState状態遷移を明確に定義できる、視覚的な理解がしやすい、イベントドリブン学習コストがやや高い、単純な状態管理にはオーバースペック
Redux大規模開発に向いている、エコシステムが充実ボイラープレートが多い、シンプルな状態管理には冗長
RecoilReactと親和性が高い、非同期処理が簡単エコシステムが少ない、React専用
ZustandAPIがシンプルで軽量中規模以上のアプリでは管理が難しくなる

4. XStateを使ってReactで状態管理をする

プロジェクトのセットアップ

まず、Reactの新規プロジェクトを作成します。

npx create-react-app xstate-demo --template typescript
cd xstate-demo
npm install xstate @xstate/react

ステートマシンをReactコンポーネントで使用する

次に、作成したステートマシンを React で利用します。

import React from 'react';
import { useMachine } from '@xstate/react';
import { createMachine } from 'xstate';

const toggleMachine = createMachine({
  id: 'toggle',
  initial: 'inactive',
  states: {
    inactive: {
      on: { TOGGLE: 'active' }
    },
    active: {
      on: { TOGGLE: 'inactive' }
    }
  }
});

const ToggleButton = () => {
  const [state, send] = useMachine(toggleMachine);

  return (
    <button onClick={() => send('TOGGLE')}>
      {state.matches('active') ? 'ON' : 'OFF'}
    </button>
  );
};

export default ToggleButton;

このコードでは、useMachine フックを使い、現在の状態 (state.matches('active')) に応じてボタンのテキストを変更しています。

5. まとめ

  • XState は ステートマシン を用いた状態管理ライブラリ。
  • 状態遷移を明確に定義できるため、複雑な状態管理が容易。
  • 他のライブラリに比べて 視覚的に理解しやすい メリットがあるが、単純なアプリには オーバースペック になる可能性も。
  • useMachine を利用することで、Reactコンポーネント内で簡単に XState を扱える。

6. 参考資料

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

新卒4年目です。spring boot, jquery, vue を使ってフロントエンド開発、quarkus、azure kubernetesを使ってバックエンドを作ってました。 今は、UXデザイナーを目指して勉強中です! よろしくお願いします。

コメント

コメントする

CAPTCHA


目次