Vue3 で状態管理を実装するために provide を使用する方法

Vue3 で状態管理を実装するために provide を使用する方法

序文

Vue エコシステムでは、公式の状態管理ライブラリである Vuex が、Vue アプリケーション開発に非常に便利な機能をもたらします。ただし、Vuex 20K+ のサイズにはコストも伴います。小規模なプロジェクトでは、ユーザー情報などの少量のデータを保存するためだけに Vuex を導入する価値はありません。

Vue2.2.x では、レベル間コンポーネント間の通信を実現するために、provide/inject API が提供されました。

Vue3.x ではアプリケーション API も提供されるため、これに基づいて基本的な状態管理を実装することが容易になります。

provide/inject を通じて Vuex 関数を実装する方法

まずは大まかなロジックを考えてプラグイン化し、use メソッドを通じてアプリケーション インスタンスに登録してみましょう。

install メソッドでは、app.provide メソッドを通じてルート コンポーネントにデータがマウントされます。データはレスポンシブ データである必要があり、データ セキュリティのために、データの変更は制限される必要があります。単方向データ フローの設計に従い、ユーザーが直接変更することはできません。したがって、データを公開するときは、データを読み取り専用として処理する必要があります。

Vuex に似た useStore 関数を実装し、ユーザーがこのメソッドを通じてデータにアクセスできるようにします。

操作を簡素化するために、Vuex に似た mapState、mapMutations、mapActions メソッドを実装します。

使い方はVuexと全く同じです。

このプラグインをアプリケーションに登録する

//メイン.ts
'vue' から {createApp} をインポートします。
'./App.vue' からアプリをインポートします。
'./router' からルーターをインポートします

'./store' からストアをインポートします

const app = createApp(App)

app.use(ルーター).use(ストア).mount('#app')

プラグインエントリファイル

エントリ ファイルで、すべてのメソッドを直接エクスポートします。

// スカイビューエクス/index.ts
'./main/index' から * をエクスポートします

ストアを作成し、対応するデータをルートコンポーネントにマウントします。

ストア自体は、コミットやディスパッチなどの状態プロパティとメソッドを含むオブジェクトです。ストアの主な機能は、すべてのコンポーネントがストア オブジェクトを取得して状態のデータを取得し、関連するメソッドを呼び出して状態を変更できるようにすることです。

//スカイビューエクス/メイン/インデックス.ts
'vue' から {inject, reactive, readonly} をインポートします。

const mainStoreSky = Symbol('メインストアキー')

インターフェース storeOptions {
  状態: 任意
  アクション?: 任意
  突然変異?: どれか
}

export const createStore = (options: storeOptions = {}) => { // ストアオブジェクトを作成する const initOptions = {
    州: {}、
    アクション: {},
    変異: {},
  }

  const mergeOptions: storeOptions = Object.assign(initOptions, オプション)

  const 状態 = リアクティブ(mergeOptions.state)

  定数ストア = {
    状態: 読み取り専用(状態)、
    ディスパッチ(イベント名: 文字列、...引数: 任意[]) {
      mergeOptions.actions[イベント名](ストア、...引数)
    },
    コミット(イベント名: 文字列、...引数: 任意[]) {
      ...
    },
  }

  戻る {
    インストール(アプリ: 任意) {
      app.provide(メインストアSky、ストア)
    },
  }
}

export const useStore = (): any => { // 他のコンポーネントはこのメソッドを使用してストアオブジェクトを取得します return inject(mainStoreSky)
}

mapState、mapMutations、mapActions メソッドの実装

エクスポートconst mapState = () => {
  定数ストア = useStore()
  ストアの状態を返す
}

エクスポート const mapActions = (イベント名: 文字列) => {
  定数ストア = useStore()
  return (...args: any[]) => store.dispatch(eventName, ...args)
}

エクスポートconst mapMutations = (eventName: string) => {
  定数ストア = useStore()
  return (...args: any[]) => store.commit(eventName, ...args)
}

コンポーネントで使用される

// ストア/インデックス.ts
'../sky-vuex/index' から {createStore} をインポートします。

エクスポートデフォルトcreateStore({
  州: {
    年齢: 18
  },
  突然変異:
    setAge(状態: 任意、データ: 数値) {
      state.age = データ
    }
  },
})

// ホーム.vue
<テンプレート>
  <div class="home">
    <button @click="handleAge(23)">データの変更</button>
    <h1>{{ 状態.年齢 }}</h1>
  </div>
</テンプレート>

<script lang="ts">
'vue' から {defineComponent} をインポートします。
'@/sky-vuex/index' から { useStore、mapActions、mapMutations } をインポートします。

エクスポートデフォルトdefineComponent({
  名前: 'ホーム'、
  設定() {
    定数ストア = useStore()

    定数 handleAge = mapMutations('setAge')
    // 定数 handleAge = mapActions('setAge')

    // 定数 handleAge = () => {
    // store.dispatch('setAge', 5)
    // }

    戻る {
      状態: store.state、
      ハンドル年齢、
    }
  },
})
</スクリプト>

要約する

ここまでで、基本的なVuexの機能が実装されました。ご自身で実践して最適化してみてください。ご不明な点がございましたら、お気軽にお問い合わせください。

これで、vue3 の provide を使用して状態管理を実装する方法についての説明は終了です。vue3 provide を使用して状態管理を実装する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue フロントエンド開発補助機能状態管理詳細例
  • vuexプロジェクトにおけるログインステータス管理の実践プロセス
  • Vue3.0 で Vuex 状態管理を開始する方法をすぐに習得します
  • Vueのシンプルな状態管理ストアモードを理解する方法
  • vuex での mapState の考え方の応用
  • Vueプロジェクトでvuexを使用する方法
  • vuex名前空間の使用
  • Vue の状態管理: Vuex の代わりに Pinia を使用する

<<:  HTML テーブル マークアップ チュートリアル (9): セル間隔属性 CELLSPACING

>>:  Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

推薦する

あなたをエキスパートに見せるための 13 個の JavaScript ワンライナー

目次1. ランダムなブール値( true / false )を取得する2. 指定された日付が営業日で...

seata docker 高可用性デプロイメントの詳細な紹介

バージョン1.4.2公式ドキュメントドッカーハブ起動する環境変数SEATA_CONFIG_NAMEを...

優れたウェブワイヤーフレーム設計・制作ツール13選を紹介

プロジェクトの作業を開始するときは、ワイヤーフレームを使用してアイデアをスケッチすることが重要です。...

VMware12 インストール centOS8 構成グラフィック チュートリアルの詳細説明 (vm 仮想マシン インストール centos8 チュートリアル)

数日前に CentOS8 がリリースされました。8 の最初のバージョンですが、今日は VM12 に ...

JSON.stringify を使用する際に発生する循環参照の問題を解決する方法の詳細な説明

プログラマーが日常的に TypeScript/JavaScript 開発を行う場合、複雑な Java...

vue WatchとComputedの使用の概要

目次01. リスナーウォッチ(1)機能(2)特性と方法(3)監視対象(4)リスニングアレイ02. 計...

CSS スタイルが機能しない (史上最も完全な解決策の概要)

ページを作成するときに、記述した CSS スタイルが有効にならないことがあります。この現象にはさまざ...

Linux bash: ./xxx: バイナリ ファイルを実行できません エラー

今日、Ubuntu 用の小さなツールを顧客に送りましたが、ユーザーはそれを受け取った後、実行できませ...

MySQL 5.7.18 バージョンの無料インストール構成チュートリアル

MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...

sql_mode を変更する際の MySQL エラーの解決方法

目次ERR 1067による殺人事件2番目の問題の原因はsql_modeです3. sql_modeを設...

MySQL水平および垂直テーブル変換操作の実装方法

この記事では、例を使用して、MySQL の水平テーブルと垂直テーブル間の変換操作を実装する方法を説明...

透明な入力ボックスにアイコンを追加する HTML コード

最近、弁護士推薦のウェブサイトを作成していたのですが、検索ボックスに問題がありました。検索ボックス内...

HTML文書の基本構造(Webページ作成の基礎知識)

HTMLの動作原理: 1. ローカル操作: ブラウザでhtmlファイルを開く2. リモートアクセス...

MySQLの日付文字列タイムスタンプ変換の詳細な説明

時刻、文字列、タイムスタンプ間の変換は、日常生活でよく使用されます。よく使用されますが、私は使用する...

CentOS 8で自動更新を設定するための手順を完了する

データとコンピューターに対してできる最善のことは、それらを安全に保つことです。アップデートを有効にす...