Vuexの役割についての深い理解

Vuexの役割についての深い理解

概要

vue.js を使用したことがある人なら、vue コンポーネント間で値を渡すことの苦労を知っているはずです。親子や兄弟コンポーネントに基づいて値を渡すのは非常に便利ですが、無関係なコンポーネントが同じデータセットを使用したい場合は、非常に無力に思えます。Vuex はこの問題を非常にうまく解決します。そのため、Vuex は習得しておく必要があり、面接に行くときにも必ず聞かれる質問です。次に、vuex がコンポーネントのステータスをどのように管理しているかを簡単に紹介します。

コンポーネント間でデータを共有する方法

親から子に値を渡す: v-bind 属性バインディング、props 受信; $parent / $children; $refs; $attrs / $listeners;

子が親に値を渡します: v-on イベント バインディング、$emit トリガーと組み合わせる; $parent / $children;

兄弟コンポーネント間でデータを共有する: EventBus; Vuex

  • $on データを受信するコンポーネント
  • $emit データを送信するコンポーネント

Vuex の原則の紹介

Vuex は一方向のデータフローを実装し、データを格納するためのグローバル状態を備えています。コンポーネントが状態内のデータを変更する場合は、ミューテーションを通じて行う必要があります。ミューテーションは、外部プラグインが呼び出して状態データの更新を取得するサブスクライバー モードも提供します。すべての非同期操作 (多くの場合、バックエンド インターフェイスを呼び出して非同期でデータを取得するために使用) またはバッチ同期操作がアクションを経由する必要がある場合、アクションは状態を直接変更できません。ミューテーションでメソッドをトリガーし、その後ミューテーションで状態データを変更する必要があります。データが変更されると、それに応じてコンポーネントにプッシュされ、コンポーネントがビュー上で再レンダリングされます。

Vuex は Vue の状態マネージャーであり、保存されたデータは応答性があります。ただし、保存されません。リフレッシュ後、初期状態に戻ります。具体的な方法は、vuex 内のデータが変更されたときに、データをコピーして localStorage に保存します。リフレッシュ後、localStorage に保存されたデータがある場合は、それを取り出してストア内の状態を置き換えます。

Vuexはコンポーネントのグローバル状態(データ)を管理するためのメカニズムです。

コンポーネント間でデータを共有するのは簡単です

Vuex を使用して状態を統一的に管理する利点:

  • Vuexで共有データを集中管理できるため、開発とメンテナンスが容易になります。
  • コンポーネント間のデータ共有を効率的に実現し、開発効率を向上
  • Vuex に保存されたデータは応答性が高く、データとページをリアルタイムで同期させることができます。

Vuexに保存するのに適したデータの種類

一般的に言えば、コンポーネント間で共有されるデータのみを Vuex に保存する必要があります。コンポーネントのプライベート データは、コンポーネント独自のデータに保存できます。

  • 複数のビューが同じ状態に依存します。たとえば、データは複数のコンポーネント間で共有され、ユーザー情報は異なるページで取得できます。
  • 異なるビューからの動作は同じ状態を変更する必要があります。たとえば、ユーザーのメンバーシップ情報は異なるページで変更できます。

Vuexの基本的な使い方

1. Vuex依存パッケージをインストールする

npm インストール vuex --save

このパッケージは実稼働環境でも使用されるため、必ず –save を追加してください。

2. Vuexパッケージをインポートする

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします
// ヴュークス山
Vue.use(Vuex)

3. ストアオブジェクトを作成する

定数ストア = 新しい Vuex.Store({
  // 状態はグローバルに共有されるデータ状態を格納します: {
    カウント: 0
  }
})
デフォルトストアをエクスポートします。

4. ストアオブジェクトをvueインスタンスにマウントする

新しいVue({
    el: '#app',
    レンダリング: h => h(app),
    ルーター、
    // 作成した共有データオブジェクトを Vue インスタンスにマウントします // すべてのコンポーネントはストアからグローバルデータを取得できます
})

Vuexの主なコアコンセプト

1. 州データウェアハウス

State は一意のパブリック データ ソースを提供し、共有されるすべてのデータはストアの State に保存されます。

コンポーネントがState内のデータにアクセスする最初の方法: this.$store.state.globalデータ名

コンポーネントが State 内のデータにアクセスする 2 番目の方法:

// 1. 必要に応じて mapState 関数をインポートします from vuex import { mapState } from 'vuex'

// 2. 先ほどインポートした mapState 関数を使用して、現在のコンポーネントに必要なグローバル データを現在のコンポーネントの計算プロパティにマップします。
    ...mapSate(['count'])
}

2. 突然変異

ミューテーションはストア内のデータを変更するために使用されます。

ストアのデータはミューテーションを通じてのみ変更可能であり、ストア内のデータを直接操作することはできません。ミューテーションをコミットすることで変更します。その本質は実際には関数です。

この方法は操作が少し複雑ですが、すべてのデータの変更を集中的に監視できます。

変異操作は同期的である必要がある

ミューテーションを送信するたびに、レコードが作成されます。Vuex は、各データ変更の履歴とトラックをより便利に記録するためにこれを実行し、監視やロールバック操作に便利です。

突然変異を引き起こす最初の方法:

// store.js でミューテーションを定義する
定数ストア = 新しい Vuex.Store({
    州: {
        カウント: 0
    },
    突然変異:
        追加(状態) {
            state.count++ //状態の変更}
    }
})
// コンポーネント内でのミューテーションをトリガーする
メソッド: {
    ハンドル() {
        // ミューテーションをトリガーする最初のメソッド this.$store.commit('add')
    }
}

ミューテーションをトリガーするときにパラメータを渡します:

//ストア.js
突然変異:
    addN(state, step) { //最初のパラメータはstateで、次のパラメータはstore.commitによって渡される追加のパラメータ、つまりミューテーションのペイロードです。
        状態.カウント += ステップ
    }
}

// コンポーネント内 this.$store.commit('addN', 3) // コミット関数を呼び出し、ミューテーションをトリガーするときにパラメータを渡します

突然変異を誘発する2番目の方法:

// 1. 必要に応じて mapMutations 関数をインポートします from vuex import { mapMutations } from 'vuex'

// 2. 新しくインポートした mapMutations 関数を使用して、指定された変異関数を現在のコンポーネント メソッドの methods 関数にマップします。{
    ...mapMutations(['add', 'addN'])
}

注意: 遅延の追加などの非同期操作をミューテーション関数で実行しないでください。

3. アクション

アクションは非同期タスクを処理するために使用されます。

非同期操作を通じてデータを変更する場合は、Mutation ではなく Action を使用する必要があります。ただし、Mutation をトリガーして Action 内のデータを間接的に変更する必要はあります。

アクションをトリガーする最初の方法:

//store.js でアクションを定義する
定数ストア = 新しい Vuex.store({
    //...他のコードアクションを省略: {
        addAsync(コンテキスト、ペイロード) {
            タイムアウトを設定する(() => {
                コンテキスト.commit('追加')
            }, 1000)
        }
    }
})
// コンポーネント内のトリガーアクション
メソッド: {
    ハンドル() {
        this.$store.dispatch('addAsync', 3)
    }
}

注意: 遅延の追加などの非同期操作をミューテーション関数で実行しないでください。

ミューテーションで定義された関数のみが状態のデータを変更する権限を持ちます。状態内のデータはアクションで直接変更することはできず、ミューテーションは context.commit を通じてトリガーされる必要があります。

context: context オブジェクトは、矢印関数の this と同等であり、ストアインスタンスと同じプロパティとメソッドを持ちます。

ペイロード: マウントされたパラメータ

アクションをトリガーする 2 番目の方法:

// 1. 必要に応じて mapActions 関数をインポートします from vuex import { mapActions } from 'vuex'

// 2. 新しくインポートした mapActions 関数を使用して、指定されたアクション関数を現在のコンポーネント メソッドのメソッド関数にマップします。{
    ...mapActions(['addAsync', 'addN'])
}

4. ゲッター

Getter は、ストア内のデータを処理して新しいデータを作成するために使用されます。 Getter はストア内の元のデータを変更せず、ラッパーとしてのみ機能します。

Getter は、Vue の計算プロパティと同様に、Store 内の既存のデータを処理して新しいデータを形成できます。

計算プロパティと同様に、ゲッターの戻り値は依存関係に基づいてキャッシュされ、依存関係の値が変更された場合にのみ再計算されます。つまり、Store のデータが変更されると、Getter のデータも変更されます。

// ゲッターを定義する 
定数ストア = 新しい Vuex.store({
    州: {
        カウント: 0
    },
    getters: { // 状態値の変化をリアルタイムで監視する showNum: state => {
            '現在の最新の番号は [' + state.count + '] です' を返します
        }
    }
})

ゲッターを使用する最初の方法: this.$store.getters.name

ゲッターを使用する2番目の方法:

'vuex' から { mapGetters } をインポートします。

計算: {
    ...mapGetters(['showNum'])
}

上記は、Vuex の役割を深く理解するための詳細な内容です。Vuex の詳細については、123WORDPRESS.COM の他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • Vuex の使い方入門チュートリアル
  • まだvuexをお使いですか?piniaについて学ぶ
  • Vuex でのアクションの使用に関する詳細なチュートリアル
  • VueXのインストールと使用方法の基本チュートリアル
  • Vue学習におけるVuexの使用の詳細な説明
  • Vuexの特性と機能の詳細な説明
  • Vuex のコアコンセプトと基本的な使用法の詳細な説明
  • Vueプロジェクトでvuexを使用する方法
  • Vuex全体のケースの詳細な説明
  • 1 つの記事で Vuex を理解する
  • Vuex の詳細な紹介と使用方法

<<:  クロスドメインの問題を解決するためのNginxの実用的な方法

>>:  MySQLでBLOBデータを処理する方法

推薦する

VMwareがモジュールディスクを早期に開けない場合の解決策の詳細な説明

VMWare (Virtual Machine ware) は、「仮想 PC」ソフトウェア会社です。...

N キロメートル以内のデータを検索する MySQL の簡単な例

地球の円周率と半径、検索ポイントの経度と緯度から、検索ポイントと検索データテーブル間の距離はNキロメ...

Nginx 仮想ホストの詳細な分析

目次1. 仮想ホスト1.1 仮想ホストの概念1.2 仮想ホストタイプ2. IP仮想ホストに基づく2....

Mac M1 での Nginx のマルチサイト構成の実装

注: nginxはbrew経由でインストールされますウェブサイトのルートディレクトリ: /opt/h...

MySQL の接続数が多すぎるエラーの原因と解決策

目次概要本日正午、開発およびテスト環境の MySQL サービスで接続数が多すぎるというエラーが報告さ...

React+TS を使用したシンプルな Jira プロジェクトを実装するためのベスト プラクティス

トレーニングのための一連のプロジェクト反応+ts内容は少ないですが、フックのカプセル化、ts ジェネ...

JPG、GIF、PNGなどのさまざまな画像形式の詳細な説明

ウェブページ上の画像が一般的に jpg、gif、png 形式であることは誰もが知っています。それらの...

MySQLデータ内の多数の改行と復帰に対する解決策

目次問題を見つける1. 改行と復帰を削除する方法2. SELECTクエリで「改行と復帰」を無視する方...

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

MySQL 5.7 データベースのインストール手順の個人的な要約

1.mysql-5.7.19-winx64.zip(これは無料のインストールバージョンで、約318 ...

ネイティブ JS を使用してタッチスライド監視イベントを実装する方法

序文今日はちょっとしたデモを書きました。左右にスワイプするロジックに関わる部分があります。当初はプラ...

MySQL IFNULL判定問題の解決方法

問題: mybatis によって返される null 型のデータが消え、フロントエンドの表示にエラーが...

MySQL の datetime フィールドの丸め操作

目次序文1. 背景2. シミュレーションテスト3. 結論要約する序文もし私が罠に陥っていなかったら、...

Vueの子コンポーネントが親コンポーネントのメソッドを呼び出す場合の詳細な説明

1. 子コンポーネントのthis.$parent.eventを通じて親コンポーネントメソッドを直接呼...

MySQL パフォーマンス チューニングについて知っておくべき 15 個の重要な変数 (要約)

序文: MYSQL は最も人気のある WEB バックエンド データベースです。最近、NOSQL がま...