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

推薦する

MySQL 5.7.15 のインストールと設定方法のグラフィック チュートリアル (Windows)

MySQL をインストールする必要があるため、インストール手順を以下のように記録します。 自分なり...

Navicat for MySQLのスケジュールされたデータベースバックアップとデータ復旧の詳細

データベースの変更または削除操作によってデータ エラーが発生したり、データベースがクラッシュしたりす...

Intellij IDEA による Docker イメージの展開方法の手順の迅速な実装

目次1. Dockerはリモートアクセスを可能にする2. Intellij IDEAにDockerプ...

APP (IOS、Android) を呼び出すモバイル H5 の記述例

iOS 1. URLスキームこのソリューションは基本的に、WeChat、QQ 組み込みブラウザ、QQ...

Mysql general_log をクリーンアップする方法の概要

方法1: グローバル general_log を 'OFF' に設定します。 テーブ...

純粋なCSSでは、子要素が親要素の幅制限を突破できる。

文章のスタイルでは、このような状況がよく見られます コードは次のとおりです <div styl...

WeChatアプレットは固定ヘッダーとリストテーブルコンポーネントを実装します

目次必要:機能ポイントレンダリング実装のアイデア具体的なコード(react\taro3.0)特定のコ...

Nginxはクロスドメインの問題を解決し、サードパーティのページを埋め込む

目次序文困難クロスドメイン定義nginxの機能リバースプロキシ静的と動的の分離達成しようとする最終結...

Windows 10 に Linux サブシステムをインストールする 2 つの方法 (画像とテキスト付き)

Windows 10 は Linux サブシステムをサポートするようになり、面倒なデュアル システ...

Dockerコンテナとホスト間のデータ相互作用の概要

序文実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共...

jsはCanvasを使用して複数の画像を1つの実装コードにマージします

解決 関数 mergeImgs(リスト) { const imgDom = document.cre...

MySQL alter ignore構文の詳細な説明

今日仕事中に、ビジネス側から次のような質問をされました。テーブルがあり、一意のフィールドを追加する必...

Linux環境でrmによって誤って削除されたファイルを回復する方法

目次序文RMの後には希望はあるのでしょうか?最前線を使ってファイルを取得するextundeleteを...

crontab の実行結果を電子メールでユーザーに通知する方法

症状Centos7 ホストに crontab タスクを設定しましたが、時間が来るとメールを実行して「...