Vue2 における 12 種類のコンポーネント通信

Vue2 における 12 種類のコンポーネント通信

以下に各コンポーネント通信方式の記述方法を一つずつ列挙する。

1. 小道具

親コンポーネントが子コンポーネントにデータを送信します。これは最も一般的に使用される方法です。子コンポーネントがデータを受信した後、親コンポーネントのデータを直接変更することはできません。エラーが報告されるため、親コンポーネントが再レンダリングされると、データが上書きされます。サブコンポーネントを変更する場合は、 computedされた

// Parent.vue は <template> を転送します
    <child :msg="メッセージ"></child>
</テンプレート>

// Child.vue はエクスポート デフォルトを受け取ります {
  //書き方1: 配列を使用して props:['msg'] を受け取る
  // 書き方2: オブジェクトを使用して受信すると、受信するデータ型を制限したり、デフォルト値を設定したり、検証したりすることができます。 props:{
      メッセージ:{
          タイプ:文字列、
          デフォルト: 'これはデフォルトのデータです'
      }
  },
  マウントされた(){
      コンソールログ(このメッセージ)
  },
}

2. .sync

親コンポーネントから子コンポーネントに渡されるデータの双方向バインディングを実現できるため、子コンポーネントはデータを受け取った後すぐにデータを変更でき、同時に親コンポーネントのデータも変更できます。

// 親.vue
<テンプレート>
    <child :page.sync="ページ"></child>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
    データ(){
        戻る {
            ページ:1
        }
    }
}

// 子.vue
エクスポートデフォルト{
    プロパティ:["ページ"],
    計算された(){
        // 子コンポーネントの currentPage を変更すると、親コンポーネントのページも変更されます currentPage {
            得る(){
                このページを返す
            },
            set(newVal){
                this.$emit("update:page", newVal)
            }
        }
    }
}
</スクリプト>

3. Vモデル

.syncと同様に、親コンポーネントから子コンポーネントへのデータの双方向バインディングを実現でき、子コンポーネントは$emitを通じて親コンポーネントのデータを変更できる。

// 親.vue
<テンプレート>
    <子 v-model="値"></子>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
    データ(){
        戻る {
            値:1
        }
    }
}

// 子.vue
<テンプレート>
    <input :value="値" @input="ハンドラ変更">
</テンプレート>
エクスポートデフォルト{
    プロパティ:["値"],
    // イベント名を変更できます。デフォルトは入力です
    モデル:{
        イベント:"updateValue"
    },
    方法:{
        ハンドラの変更(e){
            this.$emit("入力", e.target.value) を実行します。
            // 上に名前変更がある場合は、次のようになります。$emit("updateValue", e.target.value)
        }
    }
}
</スクリプト>

4. 参照

ref が通常のDOM要素上にある場合、参照はその DOM 要素を指します。
参照が子コンポーネントインスタンスへの参照である場合、親コンポーネントは子コンポーネントのプロパティをアクティブに取得したり、refを介して子コンポーネントのメソッドを呼び出したりすることができます。

// 子.vue
エクスポートデフォルト{
    データ(){
        戻る {
            名前:「ムーファ」
        }
    },
    方法:{
        いくつかのメソッド(メッセージ){
            コンソール.log(メッセージ)
        }
    }
}

// 親.vue
<テンプレート>
    <child ref="child"></child>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
    マウントされた(){
        const 子 = this.$refs.child
        console.log(child.name) // Muhuachild.someMethod("子コンポーネントのメソッドが呼び出されました")
    }
}
</スクリプト>

5. $emit / v-on

子コンポーネントはイベントをディスパッチして親コンポーネントにデータを送信したり、親コンポーネントの更新やその他の操作をトリガーしたりします。

// Child.vue ディスパッチエクスポートデフォルト {
  データ(){
      return { msg: "これは親コンポーネントに送信されたメッセージです" }
  },
  メソッド: {
      ハンドルクリック(){
          this.$emit("sendMsg",this.msg)
      }
  },
}
// Parent.vue は <template> に応答します
    <child v-on:sendMsg="getChildMsg"></child>
    // または省略形 <child @sendMsg="getChildMsg"></child>
</テンプレート>

エクスポートデフォルト{
    方法:{
        getChildMsg(メッセージ){
            console.log(msg) // これは親コンポーネントが受信したメッセージです}
    }
}

6. $attrs / $listeners

ネストされたコンポーネントの複数の層がデータを渡す場合、親コンポーネントが孫コンポーネントにデータを渡すときなど、中間処理を実行せずにデータのみを渡す場合に使用できます。
$attrs:親スコープ内のclassstyleを除く非props属性のコレクションが含まれます。 this.$attrsを通じて親スコープ内のすべての修飾属性セットを取得し、 v-bind="$attrs"を通じて子コンポーネント内の他のコンポーネントに渡します。

$listeners: nativeを除く親スコープ内のリスナー イベントのコレクションが含まれます。子コンポーネント内の他のコンポーネントに引き続き渡したい場合は、v on="$linteners"を使用できます。

使い方は同じです

// 親.vue
<テンプレート>
    <child :name="名前" title="1111" ></child>
</テンプレート
エクスポートデフォルト{
    データ(){
        戻る {
            名前:「ムーファ」
        }
    }
}

// 子.vue
<テンプレート>
    // 孫コンポーネントに渡し続ける <sun-child v-bind="$attrs"></sun-child>
</テンプレート>
エクスポートデフォルト{
    props:["name"], // これは受信することも受信しないこともできます。mounted(){
        // props が name を受け取った場合は { title:1111 } になり、それ以外の場合は { name:"Muhua", title:1111 } になります。
        console.log(this.$attrs)
    }
}

7. $children / $parent

$children:すべての子コンポーネント (孫コンポーネントを除く) を含むVueComponentオブジェクトの配列を取得し、子コンポーネント内のすべてのデータとメソッドを直接取得できます。
$parent:親ノードのVueComponentオブジェクトを取得します。これには、親ノード内のすべてのデータとメソッドも含まれます。

// 親.vue
エクスポートデフォルト{
    マウントされた(){
        this.$children[0].someMethod() // 最初の子コンポーネントのメソッドを呼び出す this.$children[0].name // 最初の子コンポーネントのプロパティを取得する }
}

// 子.vue
エクスポートデフォルト{
    マウントされた(){
        this.$parent.someMethod() //親コンポーネントのメソッドを呼び出す this.$parent.name //親コンポーネントのプロパティを取得する}
}

8. 提供する/注入する

provide / inject依存性注入です。アプリケーションコードで直接使用することは推奨されていませんが、一部のプラグインやコンポーネントライブラリではよく使われているので、使用しても問題ないと思います。かなり便利です。

提供:子孫コンポーネントに提供したいデータやメソッドを指定できます
inject:このコンポーネントに追加するデータやメソッドを任意の子孫コンポーネントで受け取ります。コンポーネントがどれだけ深くネストされていても、直接使用できます。

provideinjectによって渡されるデータは応答性がないことに注意してください。つまり、 injectでデータを受信した後、 provideのデータが変更されても、渡されたオブジェクトが listenable オブジェクトでない限り、子孫コンポーネントのデータは変更されません。したがって、いくつかの定数またはメソッドを渡すことをお勧めします。

// 親コンポーネント export default{
    // メソッド 1 はメソッド provide:{ 内のメソッドを取得できません。
        名前:"Muhua",
        age: this.dataのプロパティ},
    // 方法 2 ではデータ内の属性を取得できません provide(){
        戻る {
            名前:"Muhua",
            someMethod:this.someMethod // メソッド内のメソッド }
    },
    方法:{
        いくつかのメソッド(){
            console.log("これは注入方法です")
        }
    }
}

// 子孫コンポーネントエクスポートデフォルト{
    挿入:["名前","何らかのメソッド"],
    マウントされた(){
        console.log(この名前)
        this.someMethod()
    }
}

9. イベントバス

EventBusは中心的なイベント バスです。親子コンポーネント、兄弟コンポーネント、またはクロスレベル コンポーネントのいずれであっても、通信操作を完了するために使用できます。定義方法は 3 つあります。

/方法1:

// これを別の js ファイル Bus.js に抽出し、必要な場所にインポートします // Bus.js
「vue」からVueをインポートします
デフォルトの新しい Vue() をエクスポートします

方法2: グローバルに直接マウントする

// メイン.js
「vue」からVueをインポートします
Vue.prototype.$bus = 新しいVue()

方法3: Vueルートオブジェクトに注入する

// メイン.js
「vue」からVueをインポートします
新しいVue({
    el:"#アプリ",
    データ:{
        バス: 新しい Vue()
    }
})

使用法は以下のとおりです。オンデマンド導入の例として方法1を挙げます。

// カスタムイベントを外部に送信する必要があるコンポーネント内 <template>
    <button @click="handlerClick">ボタン</button>
</テンプレート>
「./Bus.js」からBusをインポートします。
エクスポートデフォルト{
    方法:{
        ハンドラクリック(){
            // カスタムイベント名 sendMsg
            Bus.$emit("sendMsg", "これは外部に送信されるデータです")
        }
    }
}

// 外部イベントを受信する必要があるコンポーネントで「./Bus.js」からBusをインポートします
エクスポートデフォルト{
    マウントされた(){
        // イベントトリガーをリッスンする Bus.$on("sendMsg", data => {
            console.log("これは受信したデータです:", data)
        })
    },
    beforeDestroy(){
        //監視をキャンセル Bus.$off("sendMsg")
    }
}

10. ヴュークス

Vuex 、すべてのコンポーネントの状態を集中的に保存および管理する状態マネージャーです。このセクションは長すぎます。基本に詳しくない場合は、このVuexを参照してください。一般的な使用方法は次のとおりです。

たとえば、次のようなファイル構造を作成します。

index.js の内容は次のとおりです。

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします
'./getters' からゲッターをインポートします
'./actions' からアクションをインポートします
'./mutations' から変異をインポートします
'./state' から状態をインポートします
'./modules/user' からユーザーをインポートします

Vue.use(Vuex)

定数ストア = 新しい Vuex.Store({
  モジュール:
    ユーザー
  },
  ゲッター、
  行動、
  突然変異、
  州
})
デフォルトストアをエクスポート

次に、main.js にインポートします。

「vue」からVueをインポートします
「./store」からストアをインポートします。
新しいVue({
    el:"#アプリ",
    店、
    レンダリング: h => h(App)
})

次に、必要なコンポーネントで次の操作を実行します。

「vuex」から { mapGetters, mapMutations } をインポートします。
エクスポートデフォルト{
    計算:{
        // 方法 1 次にこれを使用します。プロパティ名...mapGetters(["getters.js プロパティ 1 を導入する", "プロパティ 2"])
        // メソッド 2...mapGetters("user", ["ユーザー モジュールの属性 1", "属性 2"])
    },
    方法:{
        // 方法 1 次にこれを使用します。プロパティ名...mapMutations(["mutations.js からの方法 1","方法 2"])
        // メソッド 2...mapMutations("user",["ユーザー モジュールからのメソッド 1","メソッド 2"])
    }
}

// または、次のように this.$store.state.xxx を取得することもできます
this.$store.state.user.xxx

11. $ルート

$root App.vue内のデータとメソッドを取得できる

12. スロット

子コンポーネントのデータをスロットを介して親コンポーネントに渡し、それを元に戻す

// 子.vue
<テンプレート>
    <div>
        <スロット:user="ユーザー"></スロット>
    </div>
</テンプレート>
エクスポートデフォルト{
    データ(){
        戻る {
            ユーザー:{ 名前:"Muhua" }
        }
    }
}

// 親.vue
<テンプレート>
    <div>
        <子 v-slot="スロットプロパティ">
            {{ slotProps.user.name }}
        </子>
    </div>
</テンプレート>

以上で、Vue2.x の 12 種類のコンポーネント通信についての説明は終了です。Vue2.x のコンポーネント通信に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue2とVue3の兄弟コンポーネント通信バスの違いと使い方
  • Vue.js 親子コンポーネント通信開発例
  • Vue での親子コンポーネント通信と、sync を使用して親子コンポーネント データを同期する
  • Vue での親子コンポーネント通信における todolist コンポーネント機能の開発
  • Vue3 の 10 個のコンポーネント通信方法の概要

<<:  Intelli Idea で Tomcat 設定が見つからない問題の解決方法

>>:  2列のデータをSQLの新しい列として操作する

推薦する

SQLのさまざまな結合サマリーの詳細な説明

SQL 左結合、右結合、内部結合、自然結合 さまざまな結合の概要SQL には、左結合、右結合、内部結...

Docker Desktop で rocketmq をインストールするための非常に詳細なチュートリアル

Dockerデスクトップをインストールするダウンロード先: Docker Desktop for M...

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...

Vue のローカルコンポーネントの紹介

Vueでは、ローカルコンポーネントを自分で定義(登録)することができます。コンポーネント名を定義する...

VMWare14.0.0のUbuntu仮想マシンで共有フォルダを設定する

これは私の最初のブログ投稿です。時間の制約があるため、どのようにフォーマットすればよいかわかりません...

JavaScript による Web ページ カルーセルの超詳細な実装

目次HTML ページの作成js部分の機能を実装する1. 左ボタンと右ボタン2. 小さな円を動的に生成...

ポータルサイト再設計のユーザーエクスペリエンス

<br />2006年10月12日のNetEaseの新ホームページの公開から、2008年...

jQuery をベースにリスト ループ スクロールを実装するためのヒント (超簡単)

良いアイデアを見つけたので記録しました。私は以前、スクロール効果を実現するためにjQueryを使用し...

MySQL クラスター化インデックスのページ分割原理の分析例

この記事では、MySQL クラスター化インデックスのページ分割を例を使って説明します。ご参考までに、...

デザイン理論:人間中心のデザインコンセプト

<br />思想が東西に分かれていた時代、東洋の叡智を代表するものの一つとして「禅」は多...

MySQL 5.6 圧縮パッケージのインストール方法

MySQL には、msi インストールと zip 解凍の 2 つのインストール方法があります。 zi...

docker-compose を使用して Apollo カスタム環境をデプロイする詳細なチュートリアル

目次アポロ コンフィギュレーション センターとは何ですか?アポロの特徴クライアントアーキテクチャアー...

Unicode の数学記号の概要

数学、物理学、および一部の科学技術分野で使用される特殊記号は多数あります。Unicode コードには...

Nginx サービス クイック スタート チュートリアル

目次1. Nginx の紹介1. Nginx とは何ですか? 2. Nginx を使用する理由3. ...

CSS の vertical-align プロパティとベースラインの問題に関する深い理解

vertical-align属性は、主にインライン要素の配置を変更するために使用されます。インライン...