「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 最も単純な状態のチュートリアル

最も単純な状態のチュートリアル

2024 年 11 月 9 日に公開
ブラウズ:557

Simplest Zustand Tutorial

Zustand は、React 用の小型、高速、スケーラブルな状態管理ライブラリであり、Redux のようなより複雑なソリューションの代替として機能します。 Zustand が大きな注目を集めた主な理由は、Redux と比較してそのサイズが小さく、構文が単純であることです。

Zustand のセットアップを理解する

まず、Zustand と TypeScript をまだインストールしていない場合はインストールする必要があります。

npm install zustand
'or'
yarn add zustand

Zustand はストアを定義するための作成機能を提供します。カウント値を保存および操作する基本的な例を見てみましょう。

カスタム フック useCounterStore():
を含む、store.ts というファイルを作成しましょう。

import { create } from "zustand"

type CounterStore = {
    count: number
    increment: () => void
    resetCount: () => void
}

export const useCounterStore = create((set) => ({
    count: 0
    increment: () => set((state) => ({ count: state.count   1 })),
    resetCount: () => set({ count: 0 })
}))

この例では:

  • count は状態の一部です。

  • increaseCount とresetCount は、状態を変更するアクションです。

  • setは、Zustandが提供するストアを更新する機能です。

React コンポーネントでのストアの使用

import React from 'react'
import { useCounterStore } from './store'

const Counter: React.FC = () => {
  const count = useCounterStore((state) => state.count) // Get count from the store
  const increment = useCounterStore((state) => state.increment) // Get the action

  return (
    

{count}

) } export default Counter;

ここで、Counter は React コンポーネントです。ご覧のとおり、useCounterState() はカウントとインクリメントにアクセスするために使用されます。

次のように状態を直接取​​得する代わりに、状態を構造化できます。

const {count, increment} = useCounterStore((state) => state)

しかし、このアプローチではパフォーマンスが低下します。したがって、ベスト プラクティスは、前に示したように状態に直接アクセスすることです。

非同期アクション

非同期アクションを作成したり、サーバーに API リクエストを呼び出したりすることも、Zustand では非常に簡単です。ここで、次のコードですべてを説明します。

export const useCounterStore = create((set) => ({
    count: 0
    increment: () => set((state) => ({ count: state.count   1 })),
    incrementAsync: async () => {
        await new Promise((resolve) => setTimeout(resolve, 1000))
        set((state) => ({ count: state.count   1 }))
    },
    resetCount: () => set({ count: 0 })
}))

これは JavaScript の一般的な非同期関数のように思えませんか?まず非同期コードを実行し、次に指定された値で状態を設定します。

それでは、反応コンポーネントでそれを使用する方法を見てみましょう:

const OtherComponent = ({ count }: { count: number }) => {
  const incrementAsync = useCounterStore((state) => state.incrementAsync)

  return (
    
{count}
) }

React コンポーネントの外部の状態にアクセスする方法

これまでは、React コンポーネント内の状態にのみアクセスしてきました。しかし、React コンポーネントの外部から状態にアクセスする場合はどうでしょうか?はい、Zustand を使用すると、React コンポーネントの外部から状態にアクセスできます。

const getCount = () => {
  const count = useCounterStore.getState().count
  console.log("count", count)
}

const OtherComponent = ({ count }: { count: number }) => {
  const incrementAsync = useCounterStore((state) => state.incrementAsync)
  const decrement = useCounterStore((state) => state.decrement)

  useEffect(() => {
    getCount()
  }, [])

  return (
    
{count}
) }

ここでは、getCount() が getState() によって状態にアクセスしていることがわかります

カウントも設定できます:

const setCount = () => {
  useCounterStore.setState({ count: 10 })
}

永続化ミドルウェア

Zustand の永続ミドルウェアは、通常 localStorage または sessionStorage を使用して、ブラウザー セッション間で状態を永続化し、再ハイドレートするために使用されます。この機能を使用すると、ページをリロードした後、またはユーザーがブラウザを閉じて再度開いた後でも、状態を維持できます。仕組みと使用方法の詳細は次のとおりです。

永続化の基本的な使い方

永続化を使用して Zustand ストアをセットアップする方法は次のとおりです:

import create from 'zustand';
import { persist } from 'zustand/middleware';

// Define the state and actions
interface BearState {
  bears: number;
  increase: () => void;
  reset: () => void;
}

// Create a store with persist middleware
export const useStore = create(
  persist(
    (set) => ({
      bears: 0,
      increase: () => set((state) => ({ bears: state.bears   1 })),
      reset: () => set({ bears: 0 }),
    }),
    {
      name: 'bear-storage', // Name of the key in localStorage
    }
  )
);

状態はlocalStorageのキー「bear-storage」に保存されます。これで、ページを更新してもクマの数はリロード後も維持されます。

デフォルトでは、persist は localStorage を使用しますが、これを sessionStorage または他のストレージ システムに変更できます。 Zustand での永続状態のトピックについては、取り上げるべきことがたくさんあります。このトピックに関する詳細なチュートリアル/投稿は、この投稿の後に表示されます。

結論

Redux が状態管理ツールとしていかに優れているかは誰もが知っています。しかし、Redux は少々複雑で大規模な定型文を持っています。そのため、ますます多くの開発者が、シンプルで拡張可能な状態管理ツールとして Zustand を選択しています。

それでも、非常に複雑でネストされた状態管理には Redux の方が推奨されることがわかります。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/abeertech01/simplest-zustand-tutorial-28a8?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • Go における確率的早期有効期限切れ
    Go における確率的早期有効期限切れ
    キャッシュスタンピードについて あれこれキャッシュする必要がある状況に陥ることがよくあります。多くの場合、これらの値は一定期間キャッシュされます。おそらくこのパターンに精通しているでしょう。キャッシュから値を取得しようとして、成功した場合は、その値を呼び出し元に返し、それで終わりで...
    プログラミング 2024 年 11 月 9 日に公開
  • JavaScript の正規表現一致で大文字と小文字を区別しないようにするにはどうすればよいですか?
    JavaScript の正規表現一致で大文字と小文字を区別しないようにするにはどうすればよいですか?
    JavaScript での大文字と小文字を区別しない正規表現一致の実行URL を操作する場合、多くの場合、クエリ文字列からデータを抽出する必要があります。 JavaScript では、正規表現を使用してこの抽出を実行するのは簡単ですが、大文字と小文字を区別しないようにするのは困難な場合があります。こ...
    プログラミング 2024 年 11 月 9 日に公開
  • PHP でデータ URI をファイルに変換するときに破損したイメージの問題を解決するにはどうすればよいですか?
    PHP でデータ URI をファイルに変換するときに破損したイメージの問題を解決するにはどうすればよいですか?
    PHP データ URI からファイルへ: 破損した画像の問題を解決するデータ URI からファイル形式への変換中に画像データの整合性を維持する重要です。 PHP の file_put_contents 関数を使用して JavaScript Canvas.toDataURL() 呼び出しからのデータを...
    プログラミング 2024 年 11 月 9 日に公開
  • データベースの階層データ構造は隣接リストと代替のどちらが最適ですか?
    データベースの階層データ構造は隣接リストと代替のどちらが最適ですか?
    データベースの階層データ構造: 隣接リストと他のアプローチリレーショナル データベースに階層データを実装する場合、開発者は通常 2 つのアプローチを検討します。 : 隣接リストとネストされたツリー。隣接リストは単純に見えますが、多数のクエリが発生する可能性があるため、トラバーサル操作のパフォーマンス...
    プログラミング 2024 年 11 月 9 日に公開
  • Cucumber.js: 動作駆動テストの完全ガイド
    Cucumber.js: 動作駆動テストの完全ガイド
    Cucumber.js は、平易な言語で記述された自動テストを実行するための人気のあるツールであり、開発者と開発者以外が共同でテストを行うことができます。これは、関係者間の明確なコミュニケーションが鍵となる行動駆動開発 (BDD) で特に役立ちます。人間が読める言語を使用することで、Cucumbe...
    プログラミング 2024 年 11 月 9 日に公開
  • Celestial Escapade: 宇宙とコードを巡る旅
    Celestial Escapade: 宇宙とコードを巡る旅
    インスピレーション 私はいつも宇宙の広大さと神秘に魅了されてきました。惑星の複雑な動き、天体の壮大さ、これらの要素は常に私の好奇心を刺激します。この課題に出会ったとき、私は宇宙に対する情熱を創造性とテクノロジーと組み合わせる機会だと考えました。私は、宇宙の畏怖の念を捉え、どこにいても、どのデバイスを...
    プログラミング 2024 年 11 月 9 日に公開
  • 数式が含まれている場合でも、Openpyxl でセルの生の値を取得する方法
    数式が含まれている場合でも、Openpyxl でセルの生の値を取得する方法
    Openpyxl で実際のセル値を取得する方法openpyxl を使用して Excel のセル値にアクセスすると、表示される値と、セルに数式が含まれている場合。これは、openpyxl が通常、数式を解釈して計算結果を取得するためです。数式を含む実際のセル値を取得するには、ワークブックのロード時に ...
    プログラミング 2024 年 11 月 9 日に公開
  • React の基本的な中心概念
    React の基本的な中心概念
    急速に進化する Web 開発の世界において、React は動的でパフォーマンスの高いユーザー インターフェイスを構築するための基礎であり続けています。経験豊富な開発者であっても、初心者であっても、React の可能性を最大限に活用するには、React の中核となる概念を理解することが不可欠です。この...
    プログラミング 2024 年 11 月 9 日に公開
  • Chrome の自動入力によってフォントが変更されないようにするにはどうすればよいですか?
    Chrome の自動入力によってフォントが変更されないようにするにはどうすればよいですか?
    Chrome の自動入力フォント変更の課題を克服するWindows で Chrome の自動入力機能を使用すると、迷惑なフォント変更の問題が発生する可能性があります。保存されたユーザー名の上にマウスを移動すると、フォント サイズとスタイルが変更され、フォームの配置が乱れます。この問題を軽減するために...
    プログラミング 2024 年 11 月 9 日に公開
  • エムとレム: 違いは何ですか?
    エムとレム: 違いは何ですか?
    概要: rem と em は両方とも CSS のサイズの単位です。 Rem は、root 要素のフォント サイズです。 Em はローカル コンテキストのフォント サイズです。 em ユニットは印刷タイポグラフィの世界から借用したもので、要素のフォント サイズをコンポーネント階層内で最も近い宣言された...
    プログラミング 2024 年 11 月 9 日に公開
  • Go で WebSocket を使用してリアルタイム通信を行う
    Go で WebSocket を使用してリアルタイム通信を行う
    チャット アプリケーション、ライブ通知、共同作業ツールなど、リアルタイムの更新が必要なアプリを構築するには、従来の HTTP よりも高速でインタラクティブな通信方法が必要です。そこで WebSocket が登場します。今日は、アプリケーションにリアルタイム機能を追加できるように、Go で WebSo...
    プログラミング 2024 年 11 月 9 日に公開
  • 重複の処理を含め、Python で文字列の可能なすべての順列を生成するにはどうすればよいですか?
    重複の処理を含め、Python で文字列の可能なすべての順列を生成するにはどうすればよいですか?
    Python での文字列の並べ替え指定された文字列の考えられるすべての並べ替えを見つけるのは、困難な作業になる場合があります。ただし、Python は itertools モジュールを使用した簡単な解決策を提供します。解決策: itertools.permutations() itertools.p...
    プログラミング 2024 年 11 月 9 日に公開
  • D3.js GeoJSON 描画の問題の修正: 巻き順を修正するには?
    D3.js GeoJSON 描画の問題の修正: 巻き順を修正するには?
    D3.js が GeoJSON を間違って描画する: 巻き順の問題geoJSON データを使用してロシア地域を視覚化しようとしたときに、プログラマーが問題に遭遇しましたここで、D3.js は、目的の地図の輪郭の代わりに単一の黒い四角形を描画します。この不一致は、geoJSON ファイル内の座標の巻き...
    プログラミング 2024 年 11 月 9 日に公開
  • 多重継承の問題
    多重継承の問題
    Java はクラスの多重継承をサポートしていません。クラスは (インスタンス変数を使用して) 状態を維持できますが、インターフェイスは維持できないため、標準メソッドはこの制限を回避できません。 デフォルト メソッドは、限定された形式の動作の多重継承を提供し、クラスがデフォルト メソッドを使用して複...
    プログラミング 2024 年 11 月 9 日に公開
  • getImageData() での「キャンバスはクロスオリジン データによって汚染されています」エラーを回避するにはどうすればよいですか?
    getImageData() での「キャンバスはクロスオリジン データによって汚染されています」エラーを回避するにはどうすればよいですか?
    getImageData() の「キャンバスがクロスオリジン データによって汚染されています」エラーを回避する方法getImageData( ) メソッドを使用してキャンバスからピクセル データを取得すると、「キャンバスはクロスオリジン データによって汚染されています。」というエラーが発生する場合が...
    プログラミング 2024 年 11 月 9 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3