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の新しい列として操作する

推薦する

Linux suse11でルートパスワードを忘れた場合に変更する方法の簡単な分析

SUSE Linuxでルートパスワードを忘れた場合の解決方法SUSE (Linux オペレーティング...

新しい ECMAscript オブジェクト機能の紹介

目次1. オブジェクトのプロパティ1.1 属性表記2. プロパティ名を計算する3.オブジェクトメソッ...

VMware15 仮想マシン ブリッジ モードでインターネットにアクセスできない問題の解決方法

説明 ソリューションVMware 15 仮想マシン ブリッジ モードではインターネットにアクセスでき...

リモートDockerを使用した統合テスト環境の構築手順

需要背景チームには統合テストが必要であり、そのためには、mysql や rabbitmq などのミド...

InnoDB ロック (レコード、ギャップ、Next-Key ロック) の詳細な説明

レコード ロックは、単一のインデックス レコードをロックします。レコード ロックは常にインデックスを...

VUE のコンパイル スコープとスロット スコープのスロットの問題について

スロットとは何ですか?スロット ディレクティブは v-slot であり、現在 slot と slot...

メタを使用してトラフィックキャッシュをキャンセルし、ページにアクセスするたびにページを更新して簡単にデバッグできるようにします。

コードをコピーコードは次のとおりです。 <!-- ブラウザがローカル キャッシュからページにア...

Linux で Bash 環境変数を設定する方法

Shell は C 言語で書かれたプログラムであり、ユーザーが Linux を使用するための橋渡しと...

CSS で適応型ディバイダーを巧みに実装する N 通りの方法

分割線はウェブページでよく使われるデザインです。例えば、Zhihuのその他の回答をご覧ください。 こ...

ネイティブ js はカスタム スクロール バー コンポーネントを実装します

この記事の例では、カスタムスクロールバーコンポーネントを実装するためのjsの具体的なコードを参考まで...

Windows 上で Nginx+Tomcat クラスタを実装するプロセスの分析

導入: Nginx (エンジン エックスと同じ発音) は、BSD のようなプロトコルに基づいてリリー...

HTML フォーム_PowerNode Java アカデミー

1. フォーム1. フォームの役割HTML フォームは、さまざまな種類のユーザー入力を受け取り、ユー...

一般的な Linux ディストリビューションのミラーソース構成の概要

最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...

VMware 15 仮想マシンに Ubuntu 18.04 をインストールするグラフィック チュートリアル

ここ数年、私は自動化とコンピューターを行ったり来たりしてきました。最近は、機械学習に関連するプロジェ...