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の実装プロセスの詳細な説明

推薦する

Linux環境変数ファイルの簡単な紹介

Linux システムでは、環境変数は適用範囲に応じて、システムレベルの環境変数とユーザーレベルの環境...

Linux ドメイン ネーム サービス DNS 設定方法

DNSとはDNS の正式名称は Domain Name System で、ドメイン名解決システムを意...

Centos6 で 20TB を超えるディスクをパーティション分割してフォーマットするためのサンプル コード

1. サーバー環境の構成: 1. ディスクパーティションを確認します。最近、あるプロジェクト内のサー...

HTML埋め込みタグの使用方法と属性の詳細な説明

1. 基本的な文法コードをコピーコードは次のとおりです。埋め込み src=url注: 埋め込みはさま...

ElementUI ページネーション コンポーネントの使い方 Vue でのページネーション

ElementUIページングコンポーネントPagination in Vueの使用は参考になります。...

Vue の DOM の非同期更新の簡単な分析

目次Vue が DOM を非同期更新する原理1 実際の DOM 要素を取得できるのはいつですか? 2...

MySQL マスタースレーブ構成の学習ノート

● 新しいプロジェクトのセキュリティを確保するためにクラウド データを購入する予定でした。 Alib...

Vue でスロットを使用する方法についての簡単な説明

定義と使用方法:コンポーネントのテンプレートでスロットタグの定義を使用します。デフォルトの表示値は、...

マージンの重複問題を解決する方法

1. まず、2つ以上の隣接する通常フローブロック要素の垂直マージンの崩壊を引き起こす原因を知る必要が...

Intellij IDEA による Docker イメージの展開方法の手順の迅速な実装

目次1. Dockerはリモートアクセスを可能にする2. Intellij IDEAにDockerプ...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...

Linux で AutoFs マウント サービスをインストールするチュートリアル

Samba サービスでも NFS サービスでも、サーバーの起動時にリモート共有リソースが自動的にマ...

Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決

Mysql マスタースレーブ同期の Last_IO_Errno:1236 エラーの原因は何ですか? ...

MYSQL大規模書き込み問題の最適化の詳細な説明

概要: MySQL のパフォーマンス最適化について話すとき、誰もがクエリ パフォーマンスを向上させる...

Vueの最初のプログラムを書くための勉強ノート

目次1. HTMLを書く、最初のVueプログラムビューテンプレートとデータに注意してください決定ルー...