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

推薦する

Vueはコンピュータカメラを呼び出して写真機能を実現します

この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考...

設定操作からMySQLへのNULLが見つからない問題を解決する

興味深い発見:合計 1000 件のレコードを含むテーブルがあります。クエリ ステートメントは次のよう...

HTML で div+CSS を使用してシンプルな矢印アイコンを実装するコード

ウェブデザインでは、ウェブページを美しく見せるために矢印を装飾としてよく使用します。現在、多くのウェ...

ウェブページ作成時に標準 HTML コードを使用する際のポイント

多くの Web サイト デザイナーが犯す最も一般的な間違いは、Web ページが IE で正常に表示さ...

Dockerイメージの作成、アップロード、プル、デプロイを理解するための記事

目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...

Linux nslookup コマンドの使用方法の詳細な説明

[nslookup とは?] 】 nslookup コマンドは、Linux で非常によく使用されるネ...

Linux テキスト検索コマンド find の詳細な使用方法

find コマンドは主にディレクトリやファイルを検索するために使用され、一致のために複数のパラメータ...

MySQL 8.0.21.0 コミュニティ エディションのインストール チュートリアル (詳細な図解)

1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...

この記事では、VUE の複数の DIV とボタン バインディングの Enter イベントを実装する方法を説明します。

現在、OK ボタンをクリックしたときやキーボードの Enter キーを押したときに操作を実行するとい...

ローカルのMySQLをサーバーデータベースに移行する方法

Linux の scp コマンド (Windows では scp は使用できません) と、mysql...

jsを使用してスライダーをドラッグする効果を実現します

この記事では、jsでスライダーをドラッグする方法の具体的なコードを参考までに共有します。具体的な内容...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...

キャッシュサーバーを構築するためのMemcached方式

序文多くの Web アプリケーションは、リレーショナル データベース管理システム (RDBMS) に...