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

推薦する

Windows で nginx を素早くインストールし、自動的に起動するように設定する

目次1. Windows システムでの Nginx のインストールと起動プロセス: 2. 起動時にN...

Reactコンポーネントのライフサイクル機能についての簡単な説明

React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...

ウェブページのドロップダウンリストとdivレイヤーのカバーの問題を選択する

HTML の select 要素に関する質問は、さまざまな場所で提起されています。最近のプロジェクト...

ウェブサイトを黒、白、グレーにする4つのコードの詳細な説明

2008年5月12日に四川省汶川市で発生した地震により、多くの命が失われ、遺憾なことと存じます。国務...

独自の Docker イメージを作成して Dockerhub にアップロードする方法

1. まず、自分のdockerhubアカウントを登録します。登録アドレス: https://hub....

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

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

JavaScript配列の一般的なメソッドの詳細な説明

目次一般的な配列メソッドポップ()シフト解除()シフト()スライス()スプライス()配列から重複した...

MySQL でのインデックスの追加と削除に関連する操作

目次1. インデックスの役割2. インデックスの作成と削除(1)ALTER TABLE文を使用して、...

HTML_PowerNode 入門 Java アカデミー

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 HTML ...

大量のデータをMySQLにインポートする際に発生する問題と解決策の分析

プロジェクトでは、SQL を使用してデータ分析を実行するために、大量のデータをデータベースにインポー...

カスタム変数を使用した MySQL クエリの最適化

目次並べ替えクエリの最適化変更されたばかりのデータ行を繰り返し取得しないようにする遅延ロードされた結...

MySQLでユーザーを作成し、権限を管理する方法

1. ユーザーとパスワードの作成方法1. MySQLデータベースに入る mysql> mysq...

CSS スタイルを使用して表のフォントを垂直中央に配置する方法

CSS スタイルを使用して表内のフォントを垂直方向に中央揃えする方法は次のとおりです。下図のようなカ...

Nginx ログ管理の概要

Nginx ログの説明アクセス ログを通じて、ユーザーの地理的起源、ジャンプ元、使用端末、特定の U...

linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する問題を解決する

いくつかの Qt インターフェース プログラムを作成しましたが、Qt 環境がインストールされていない...