0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

React Native開発でZustand触ってみた - 状態管理と型の学習メモ

Posted at

最近React Nativeで個人開発してるんですが、今日はZustandっていう状態管理ライブラリを使ってみたので、学んだことをまとめておきます。

🛠️ 今日触った技術

  • Zustand (状態管理)
  • TypeScript (Partial<T>型)
  • React Native (FlatList、コンポーネント設計)

💡 Zustandがシンプルすぎて感動

状態管理にZustandを採用しました。storeで管理するだけの簡単操作で、めちゃくちゃシンプルで驚きました。

import { create } from 'zustand';

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));

// 使う時
const { count, increment } = useStore();

これだけ。

useStateとの使い分けが重要だった

最初は「全部Zustandでいいじゃん」って思ったんですが、適切な使い分けが大事でした。

  • useState: そのコンポーネント内だけで使う状態(入力値、表示/非表示など)
  • Zustand: 複数画面で共有する状態(ユーザー情報、アプリ全体のデータなど)

例えば入力フォームの場合:

const SomeInput = () => {
  const [value, setValue] = useState(''); // ローカル状態
  const updateGlobalData = useStore(state => state.updateData); // グローバル状態

  const handleChange = (text) => {
    setValue(text);          // 画面表示用
    updateGlobalData(text);  // 他の画面でも使う用
  };
};

両方を組み合わせることで、最適なUXが実現できるんですね。

🤔 Partial型が予想以上に便利

TypeScriptのPartial<T>型、今まで使ったことがなかったんですが、これがかなり便利でした。

interface User {
  id: string;
  name: string;
  email: string;
}

// Partial<User> だと全てのプロパティがオプショナルに
interface PartialUser {
  id?: string;
  name?: string;  
  email?: string;
}

何がいいかって、段階的にデータを構築していく時に型エラーが出ないんです。

// 最初は名前だけ
const user: Partial<User> = { name: "太郎" };

// 後でメール追加
const updatedUser: Partial<User> = { ...user, email: "taro@example.com" };

// 最終的に完成
const completeUser: User = { id: "1", name: "太郎", email: "taro@example.com" };

フォームで「途中段階のデータ」を管理する時に、すごく役立ちそうです。

🚧 今日つまづいたこと

配列の長さ分だけコンポーネントを生成したかったんですが、なぜかうまくいきませんでした。

const count = 5;
{Array.from({ length: count }, (_, index) => (
  <SomeComponent key={index} number={index + 1} />
))}

これで5個のコンポーネントが表示されるはずなのに、1個しか表示されない...。
おそらくデータの取得タイミングか、状態の保存で何かミスしてると思います。

明日はデバッグ表示で原因を特定してみます。

📝 FlatListのrenderItemの仕組みも理解

昨日からFlatListで詰まってたんですが、renderItemの仕組みがやっと理解できました。

const data = [{ id: 1 }, { id: 2 }, { id: 3 }];

const renderItem = ({ item, index }) => {
  // item: 配列の各要素
  // index: 配列のインデックス
  return <Text>{item.id}</Text>;
};

// FlatListが内部的に data.map(renderItem) のような処理をしている

要するに「配列の各要素に対してrenderItem関数を実行してコンポーネントを生成する」だけでした。
理解してしまえばシンプルですが、最初は「なんで関数を渡すの?」って混乱してました。

🎯 今日の感想

Zustandは本当に使いやすいです。Reduxより圧倒的にシンプルだし、Context APIより高機能。
個人開発レベルなら十分すぎる性能ですね。

Partial<T>型も、今まで「TypeScriptの型チェックがうるさいな」って思ってた場面で活用できそう。
TypeScriptって、使いこなせると本当に便利ですね。

明日は配列生成の問題を解決して、もう少し複雑な状態管理にチャレンジしてみます。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?