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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CentOS で LibreOffice を使用してドキュメント形式を変換する方法
>>: MySQL 8.0.11 圧縮バージョンを Windows 10 にインストールするための詳細なチュートリアル
1. 設置環境Windows7 で MySQL5.6 データベースの解凍バージョンをアンインストー...
MySQL をインストールする必要があるため、インストール手順を以下のように記録します。 自分なり...
データベースの変更または削除操作によってデータ エラーが発生したり、データベースがクラッシュしたりす...
目次1. Dockerはリモートアクセスを可能にする2. Intellij IDEAにDockerプ...
iOS 1. URLスキームこのソリューションは基本的に、WeChat、QQ 組み込みブラウザ、QQ...
方法1: グローバル general_log を 'OFF' に設定します。 テーブ...
文章のスタイルでは、このような状況がよく見られます コードは次のとおりです <div styl...
目次必要:機能ポイントレンダリング実装のアイデア具体的なコード(react\taro3.0)特定のコ...
目次序文困難クロスドメイン定義nginxの機能リバースプロキシ静的と動的の分離達成しようとする最終結...
Windows 10 は Linux サブシステムをサポートするようになり、面倒なデュアル システ...
序文実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共...
解決 関数 mergeImgs(リスト) { const imgDom = document.cre...
今日仕事中に、ビジネス側から次のような質問をされました。テーブルがあり、一意のフィールドを追加する必...
目次序文RMの後には希望はあるのでしょうか?最前線を使ってファイルを取得するextundeleteを...
症状Centos7 ホストに crontab タスクを設定しましたが、時間が来るとメールを実行して「...