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 にインストールするための詳細なチュートリアル

推薦する

複数の画像を切り替えるJavaScript

この記事では、複数の画像を切り替えるJavaScriptの具体的なコードを参考までに紹介します。具体...

MySQL mysqladmin クライアントの使用の概要

目次1. サーバーの状態を確認します。 2. ルートパスワードを変更します。 3. mysqlser...

Nginx 構成 SSL および WSS 手順の紹介

目次序文1. Nginxのインストール1. Nginxをダウンロードする2. 依存関係をインストール...

要素 el-button ボタンコンポーネントの使用の詳細な説明

1. 背景ボタンは非常によく使われており、Element のボタン機能は非常に包括的です。この記事で...

iframeを指すaタグのターゲットの名前とIDの違い

コードをコピーコードは次のとおりです。 <iframe id="myFrameId&...

フロントエンドパフォーマンス最適化に関する補足記事

序文私は、Web サイトのフロントエンド パフォーマンス最適化のための JavaScript と C...

MySQLデータをOracleに移行する正しい方法

mysql データベースには student テーブルがあり、その構造は次のとおりです。 Oracl...

ファイルの種類を検出するJavaScriptメソッド

目次1. 画像のバイナリデータを表示する方法2. 絵の種類の見分け方3. 画像の種類を検出する方法3...

MySQL Innodb ストレージ構造と Null 値の保存の詳細な説明

背景:テーブルスペース: すべての INNODB データはテーブルスペース (共有テーブルスペース)...

HTTP ヘッダー情報の解釈と分析 (詳細概要)

HTTP ヘッダーの説明1. Accept: Web サーバーに受け入れるメディア タイプを通知しま...

Nginx インストールの詳細なチュートリアル

1. Nginxの簡単な紹介Nginx は、無料のオープンソースの高性能 HTTP サーバーおよびリ...

Iframe の使用を減らすべきいくつかの理由の分析

次のグラフは、100 個の異なる要素で iframe を作成するのにどれくらいの時間がかかるかを示し...

Centos に PHP7.4 と Nginx をインストールする方法

準備する1. 必要なインストールパッケージをダウンロードするhttps://www.php.net/...

MySQLのバージョンアップ方法を超詳しく解説

目次1. はじめに2. データベースをバックアップする3. オリジナルのMysqlをアンインストール...

jquery-multiselect を使用した IE6 のバグの解決方法

jquery-multiselect (ドロップダウン ボックスをチェックボックス付きの複数選択コン...