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データを処理する方法

推薦する

フロントエンドエンジニアが作ったクールなインタラクティブウェブサイトを推薦します

ウェブサイトリンク: http://strml.net/サミュエル・リード著ヒント: 昨日、Mome...

Web デザインにおける HTML フォーマットと長いファイルに関するヒント

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案、W...

親要素を基準にCSSの位置を絶対的に設定する方法についての簡単な説明

ご存知のとおり、CSS の絶対位置はデフォルトでドキュメントに応じて設定されます。たとえば、posi...

Alibaba Cloud ECS サーバーでポート 8080 を開く方法

セキュリティ上の理由から、Alibaba Cloud Server ECS にはデフォルトで独自のセ...

HTML タグのセマンティクス化 (H5 を含む)

導入HTML は、Web ドキュメントのコンテンツのコンテキスト構造と意味を提供します。HTML 自...

この記事では、Vue 3.0 レスポンシブの使い方を説明します。

目次ユースケースリアクティブAPI関連プロセス反応的なcreateReactiveObjectはレス...

LeetCode の SQL 実装 (178. スコアランキング)

[LeetCode] 178.ランクスコアスコアをランク付けする SQL クエリを記述します。2 ...

MAC で MySQL の初期パスワードを変更する方法

問題の説明: Macを購入し、初めてMySQLをインストールしました。初期パスワードが分かりません。...

Javascript における非同期待機の詳細な理解

この記事では、async/await がすべての JavaScript 開発者にとって非同期プログラ...

CSS3 を使用して左上または右上隅にリマインダー ドットを表示するサンプル コード

効果画像(三角形をご希望の場合は、ここをクリックしてください): コード: <html>...

HTML Selectは、デフォルトの選択を設定するためにselected属性を使用します。

オプションに属性 selected = "selected" を追加すると、それ...

JS ES6 非同期ソリューション

目次最初にコールバック関数を使用するes6 非同期処理モデルこの非同期モデルに合わせたAPI: pr...

MySQL 5.7.18 winx64 のインストールと設定方法のグラフィックチュートリアル

圧縮パッケージのインストールは、mysql-5.7 以降、大幅に変更されました。この記事では、mys...

Windows での MySQL 8.0.15 のインストールと設定方法のグラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15のインストールと設定方法のグラフィックチュートリアル...

CSS3 で虫眼鏡効果を模倣するいくつかの方法の原理の分析

記事のタイトルが「模造虫眼鏡」なのはなぜですか?今日お話ししたいのは、一般的に言われているような、マ...