Vueで親子コンポーネント通信を実装する方法

Vueで親子コンポーネント通信を実装する方法

1. 親コンポーネントと子コンポーネントの関係

この記事では、Vue における親コンポーネントと子コンポーネント間の通信方法についてまとめます。

では、Vue では親コンポーネントと子コンポーネントの関係はどのように構築されるのでしょうか。また、どのコンポーネントを親コンポーネントと呼び、どのコンポーネントを子コンポーネントと呼ぶことができるのでしょうか。

私の理解では、親コンポーネントと子コンポーネントの関係も比較的単純です。

vue-cli ツールを使用して構築されたプロジェクトでは、1 つのコンポーネントに別のコンポーネントへの参照を登録することがよくあります。

ホーム.vue

<テンプレート>
  <div class="home">
    <p>これはホームコンポーネントです</p>
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: 'ホーム'
}
</スクリプト>
<スタイルスコープ>
    。家{
        境界線:1px 実線 #4488ff;
        表示: インラインブロック;
        パディング: 10px;
    }
</スタイル>

アプリ.vue

<テンプレート>
  <div id="アプリ">
    <p>これがアプリコンポーネントです</p>
    <!-- stpe3: 使用 -->
    <ホーム></ホーム>
  </div>
</テンプレート>

<スクリプト>
// ステップ1: './components/Home' から Home をインポートします
エクスポートデフォルト{
  名前: 'アプリ'、
  // ステップ2: コンポーネントを登録する: { ホーム }   
}
</スクリプト>

<スタイル>
#アプリ {
  フォントファミリ: 'Avenir'、Helvetica、Arial、sans-serif;
  -webkit-font-smoothing: アンチエイリアス;
  -moz-osx-font-smoothing: グレースケール;
  色: #2c3e50;
  表示: インラインブロック;
  border:1px オレンジ一色;
  パディング: 10px;
}
</スタイル>

上記 2 つのコンポーネントでは、App コンポーネントに Home コンポーネントを導入し、登録して使用しました。

Vue では、App コンポーネントを親コンポーネント、Home コンポーネントを子コンポーネントと呼ぶことができます。これら 2 つのコンポーネントは親子関係を形成します。

ここで注目すべきは、導入、登録、利用という3つのステップが不可欠であるということです。

そうしないと、2 つのコンポーネントは親子関係を形成できず、後述するいくつかの通信方法を使用して通信することもできません。

Vue における親子コンポーネントの構成関係を理解し​​た後、親子コンポーネントが相互に通信する方法について説明します。

2. 小道具

Vue で親子コンポーネントが通信する最初の方法は props 属性を使用することで、親コンポーネントが子コンポーネントと通信します。

実践してみましょう。

まず、親コンポーネント内で子コンポーネントが使用されている場所を見つけ、親コンポーネントが子コンポーネントに渡す必要があるデータを追加します。

App.vue (変更されていないコードの一部は省略)

<テンプレート>
  <div id="アプリ">
    <p>これがアプリコンポーネントです</p>
    <ホーム
        タイトル="Vue における親コンポーネントと子コンポーネント間の通信方法"
        2020/03/05 14:25 更新
    </ホーム>
  </div>
</テンプレート>

ご覧のとおり、このステップでは、サブコンポーネントが使用されるサブコンポーネントに渡す必要がある 2 つのデータ (タイトルと日付) を追加しました。

<ホーム
     タイトル="Vue における親コンポーネントと子コンポーネント間の通信方法"
     2020/03/05 14:25 更新
</ホーム>

次のステップでは、子コンポーネントで props を使用して、これら 2 つのパラメータを受け取ります。

Home.vue (変更されていないコードの一部は省略)

<スクリプト>
エクスポートデフォルト{
  名前: 'ホーム'、
  プロパティ: ['タイトル', '日付']
}
</スクリプト>

最後のステップでは、vue データを使用する場合と同じように、子コンポーネントでタイトルと日付を使用できます。

Home.vue (変更されていないコードの一部は省略)

<テンプレート>
  <div class="home">
    <p>これがホームコンポーネントです</p>
    <p>タイトル:{{タイトル}}</p>
    <p>日付:{{date}}</p>
  </div>
</テンプレート>

プロジェクトを開始したら、ブラウザで効果を確認します。

3. $エミット

Vue における親子コンポーネント通信の 2 番目の方法は、子コンポーネントと親コンポーネント間の通信である $emit メソッドを使用することです。

$emit メソッドは Vue のインスタンス メソッドであり、その使用方法は次のとおりです。

最初のパラメータ eventName はイベント名と呼ばれます。

イベント名に対応するイベントは、親コンポーネントの v-on がリッスンするネイティブ DOM イベントです (クリックのようなカスタム イベントとして理解できます)。

子コンポーネントで $emit(eventName) を実行すると、親コンポーネントの対応するイベントがトリガーされます。

したがって、最初に子コンポーネントの $emit メソッドを使用して、親コンポーネントでイベントをトリガーするコードを記述します (2 番目のパラメーターを渡さずに)。

ホーム.vue

<テンプレート>
  <div class="home">
    <p>これはホームコンポーネントです</p>
    <el-button type="primary" v-on:click='btnClickHandler("Yes")'>はい</el-button>
    <el-button type="primary" v-on:click='btnClickHandler("No")'>いいえ</el-button>
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: 'ホーム'、
  メソッド: {
    btnClickHandler: 関数(パラメータ){
        if(パラメータ == "はい"){
            これを$emit('sayYes');
        }それ以外の場合(パラメータ == "いいえ"){
            this.$emit('sayNo');
        }
    }
  }
}
</スクリプト>

ご覧のとおり、Home サブコンポーネントには 2 つのボタンがあります。

[はい] ボタンをクリックすると、 this.$emit('sayYes') が実行され、親コンポーネントで sayYes イベントがトリガーされます。

[いいえ] ボタンをクリックすると、this.$emit('sayNo') が実行され、親コンポーネントで sayNo イベントがトリガーされます。

次に、親コンポーネントに対応するネイティブ DOM イベントを実装します。

アプリ.vue

<テンプレート>
  <div id="アプリ">
    <p>これがアプリコンポーネントです</p>
    <ホーム
        v-on:sayYes='val="はい"'
        v-on:sayNo='val="no"'>
    </ホーム>
    <p>値: {{val}}</p>
  </div>
</テンプレート>

<スクリプト>
'./components/Home' から Home をインポートします。
エクスポートデフォルト{
  名前: 'アプリ'、
  データ() {
    戻る {
      値: "デフォルト",
    }
  },
  コンポーネント: { ホーム },
}
</スクリプト>

このうち、 sayYes と sayNo は親コンポーネントで定義されたネイティブ DOM イベントです。

<ホーム
        v-on:sayYes='val="はい"'
        v-on:sayNo='val="no"'>
</ホーム>

val は親コンポーネントで定義されたデータであり、そのデフォルト値は 'default' です。

次に、サブコンポーネントのコード ロジックと組み合わせると、次の結果が得られることがわかります。

[はい] ボタンをクリックすると、 this.$emit('sayYes') が実行され、親コンポーネントで sayYes イベントがトリガーされます。 sayYes イベントでは、vue データ内の val 値が yes に変更されます。

[No] ボタンをクリックすると、this.$emit('sayNo') が実行され、親コンポーネントで sayNo イベントがトリガーされます。sayNo イベントでは、vue データ内の val 値が no に変更されます。

ブラウザで当社の声明を確認してください。

IV. $親

$parent は Vue のインスタンス プロパティであり、現在のコンポーネントの親インスタンスを表します。

親コンポーネントに sayYes というメソッドがある場合は、子コンポーネントで this.$parent.sayYes を直接使用して、親コンポーネント メソッドを呼び出すことができます。

アプリ.vue

<テンプレート>
  <div id="アプリ">
    <p>これがアプリコンポーネントです</p>
    <ホーム></ホーム>
    <p>値: {{val}}</p>
  </div>
</テンプレート>

<スクリプト>
'./components/Home' から Home をインポートします。
エクスポートデフォルト{
  名前: 'アプリ'、
  データ() {
    戻る {
      値: "デフォルト",
    }
  },
  コンポーネント: { ホーム },
  メソッド: {
    言うはい: 関数() {
      this.val = "はい";
    },
    いいえと言う: 関数() {
      this.val = "いいえ";
    }
  }
}
</スクリプト>

親コンポーネントに sayYes と sayNo という 2 つのメソッドを定義しました。それぞれのロジックは、val の値を yes に変更し、val の値を no に変更します。

次に、子コンポーネントで this.$parent.sayYes と this.$parent.sayNo を使用して、親コンポーネントの対応する sayYes メソッドと sayNo メソッドを呼び出すことができます。

ホーム.vue

<テンプレート>
  <div class="home">
    <p>これはホームコンポーネントです</p>
    <el-button type="primary" v-on:click='btnClickHandler("Yes")'>はい</el-button>
    <el-button type="primary" v-on:click='btnClickHandler("No")'>いいえ</el-button>
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: 'ホーム'、
  メソッド: {
    btnClickHandler: 関数(パラメータ){
        if(パラメータ == "はい"){
            this.$parent.sayYes();
        }それ以外の場合(パラメータ == "いいえ"){
            this.$parent.sayNo();
        }
    }
  }
}
</スクリプト>

子コンポーネントの btnClickHandler メソッドのコードが this.$parent に変更されました。

それでは結果を見てみましょう。

V. 結論

ここまでで、Vue における親子コンポーネントの通信方式がまとめられ、それぞれ以下の方式がまとめられました。

1つ目: 親コンポーネントが子コンポーネントと通信する - props属性

2番目の方法: 子コンポーネントが親コンポーネントと通信する - $emit メソッド

3番目のタイプ: 子コンポーネントは親コンポーネントと通信します - $parent属性

以上が、Vue を使って親子コンポーネント通信を実現する方法の詳細です。Vue 親子コンポーネント通信の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 親子コンポーネントの通信を解決するための3つのVueスロット
  • Vue におけるコンポーネント通信の詳細説明 (父子コンポーネント、祖父孫コンポーネント、兄弟コンポーネント)
  • Vue.jsはv-modelを使用して親コンポーネントと子コンポーネント間の双方向通信を実装します。
  • Vuejs の親コンポーネントと子コンポーネント間の通信方法の詳細な例
  • Vue コンポーネント通信における非親子コンポーネント値転送の知識ポイントのまとめ
  • Vueの親子コンポーネントの通信方法は次のとおりです

<<:  CentOS で LibreOffice を使用してドキュメント形式を変換する方法

>>:  MySQL 8.0.11 圧縮バージョンを Windows 10 にインストールするための詳細なチュートリアル

推薦する

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

Web ベースの電子メール コンテンツの HTML フォーマット標準の概要

1. ページ要件1) 標準のヘッダーとフッターを使用するXML/HTML コードコンテンツをクリップ...

IntelliJ IDEA に Docker プラグインをインストールする詳細な手順 (2018 バージョン)

目次1. 開発環境2. dockerプラグインをインストールする1. アイデアのインストール2. イ...

IE8は優れたエクスペリエンスを提供します: アクティビティ

今日は IE8 ベータ 1 (以下、IE8 と略します) をチラ見しました。IE8 は素晴らしい体験...

検証コード干渉を実装する js (静的)

この記事では、検証コード干渉を実装するためのjsの具体的なコードを参考までに共有します。具体的な内容...

デザイン理論: なぜ私たちは間違った場所を見ているのでしょうか?

数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...

Vue.jsクラウドストレージで画像アップロード機能を実現

序文ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。 1. オブジェクトスト...

MySQL でよく使われる連結文のまとめ

はじめに: MySQL では、CONCAT() 関数を使用して複数の文字列を 1 つの文字列に連結し...

CentOS 7 で yum を使用して MySQL 5.7.20 をインストールする最も簡単な方法

CentOS7 のデフォルトのデータベースは mariadb ですが、mysql を使っている人も多...

データベースマルチテーブル接続クエリの実装方法の詳細説明

データベースマルチテーブル接続クエリの実装方法の詳細説明結合演算子を使用して複数のテーブルクエリを実...

Vue cli開発に基づく外部コンポーネントVantのデフォルトスタイルの変更の詳細な説明

目次序文1. 少ない2. コンポーネントをインポートする3. 設定ファイルを変更するステップ1: l...

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

1. mpstatコマンド1.1 コマンド形式 mpstat [ -A ] [ -u ] [ -V ...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

CSS 属性セレクタを使用して HTML DNA を接合する方法

CSS 属性セレクターは素晴らしいです。大量のクラス名を追加することを回避し、コード内の問題を指摘す...