Vue がコンポーネント通信を実装する 8 つの例

Vue がコンポーネント通信を実装する 8 つの例

Vue では、コンポーネント間のメッセージ パッシングが非常に重要です。コンポーネント間のメッセージ パッシングの一般的な方法を以下にまとめます。

1. Props 親コンポーネント ---> 子コンポーネント通信

親コンポーネント---子コンポーネントへのプロパティの転送

サブコンポーネント---propsモードでデータを受信する

<息子:datas="fData"></息子>

<スクリプト>
'@/components/son' から Son をインポートします。
  エクスポートデフォルト{
    名前:「父」
    コンポーネント:{Son},
    データ(){
      戻る {
        fData:'親コンポーネントから子コンポーネントに渡される値 - props メソッド'
      }
    }
  }
</スクリプト>

子コンポーネントのプロパティで受け入れられるパラメータ名は、親コンポーネントが渡されるときに定義されたプロパティ名と一致している必要があります。

<テンプレート>
  <div>私は親コンポーネントのデータです: {{fData}}</div>
  <div @click=changeData>私は変更されたデータを渡す親コンポーネントです: {{mydata}}</div>
</テンプレート>
<スクリプト>
  エクスポートデフォルト{
    名前:「息子」
    小道具:{
      データ:{
        タイプ:文字列、
        デフォルト:''
      }
    }
    データ(){
      mydata:this.fatherData
    },
    方法:{
     データの変更(){
        this.mydata += 'データの変更'
      }
    },
  }
</スクリプト>

知らせ:

  • 子コンポーネントは親コンポーネントから渡された値を直接変更できません。Vue の一方向データフロー メカニズムのため、親コンポーネントの値を直接変更すると「汚染」されます。 (props は一方向バインディング (読み取り専用プロパティ) です。親コンポーネントのプロパティが変更されると、子コンポーネントに伝達されますが、その逆は行われません)
    エラーメッセージはおそらく次のようになります: Vueはprop通信エラーを使用します: 親がpropを変更するたびに値が上書きされるため、propを直接変更しないでください。
  • 解決策: サブコンポーネントに変数mydataを定義してfDataデータを受け取ることができます。
  • パラメータ渡しの型が不明な場合は、次のように記述できます。
小道具:{
    データ:{
        タイプ:[文字列,数値],
        デフォルト:''
    }
}

2. $emit 子コンポーネント ---> 親コンポーネント転送

  • サブコンポーネントバインディングカスタムイベント
  • $emit() の最初のパラメータはカスタムイベント名、2番目のパラメータは渡されるデータです。
  • $emit() を使用してデータの変更をトリガーする

サブコンポーネント

<el-button @click="handleEmit">親コンポーネントを変更する</el-button>

<スクリプト>
 エクスポートデフォルト{
   名前:「息子」
   方法:{
     ハンドルエミット(){
       this.$emit('triggerEmit','サブコンポーネントデータ')
     }
   }
 }
</スクリプト>

親コンポーネント (子コンポーネントによって送信されるイベント名は、親コンポーネントによって受け入れられるイベント名と一致している必要があります)

<Son @triggerEmit="changeData"></Son>

<スクリプト>
 '@/components/son' から Son をインポートします。
 エクスポートデフォルト{
   名前:「父」
   コンポーネント:{Son},
   方法:{
     changeData(名前){
       console.log(name) // => 子コンポーネントからのデータです}
   }
 }
</スクリプト>

$emitとpropsを兄弟コンポーネントと組み合わせて値を渡す

  • 親コンポーネントは2つの子コンポーネントを導入します
  • 親コンポーネントはブリッジとして機能する

親コンポーネント

<childA :myName="名前"></ChildA>
<ChildB :myName="名前" @changeName="名前を編集"></ChildB>  
    
エクスポートデフォルト{
  データ() {
    戻る {
      名前: 'Hello Data'
    }
  },
  メソッド: {
    編集名前(名前){
      this.name = 名前
    }
  }
}

サブコンポーネントBはデータを変更して受信する

<p>名前: {{ myName }}</p>

<button @click="changeName">名前を変更</button>
    
<スクリプト>
エクスポートデフォルト{
  小道具: {
    myName:文字列
  },
  メソッド: {
    名前を変更する() {
      this.$emit('changeName', '新しいデータ名')
    }
}
}
</スクリプト>

サブコンポーネントAはデータを受信

<p>名前: {{ newName }}</p>
    
<スクリプト>
エクスポートデフォルト{
  小道具: {
    myName:文字列
  }
}
</スクリプト>

3. バス(イベントバス)ブラザーコンポーネント通信

親子コンポーネント以外のコンポーネント間、またはそれ以上のレベルのコンポーネント間で値を転送します。Vue では、コンポーネント間の値の転送を管理するために、別のイベント センターが使用されます。

  1. パブリックbus.jsファイルを作成する
  2. Vueインスタンスの公開
  3. データ送信側はイベントを通じてbus.$emit(メソッド名、送信データ)をトリガーする
  4. データ レシーバーは、ライフ サイクル関数内の bus.$on(メソッド名、[params]) を通じてデータをリッスンします。
  5. 破棄イベント。受信側では、bus.$off(メソッド名)によってデータが破棄された後、データを監視できなくなります。
「vue」からVueをインポートします
定数バス = 新しい Vue()
デフォルトバスをエクスポート

データを変更する必要があるコンポーネント内の呼び出しを定義する

<テンプレート>
  <div>
    <div>私はコミュニケーションコンポーネントAです</div>
    <button @click="changeName">名前を変更</button>
  </div>
</テンプレート>

<スクリプト>
「@/utils/Bus.js」からバスをインポートします。
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    戻る {};
  },
  マウント() {
    コンソールログ(バス);
  },
  メソッド: {
    名前を変更する() {
      bus.$emit("editName", "dataset!");
    },
  },
};
</スクリプト>

<style lang='scss' スコープ>
</スタイル>

bus.jsファイルも別のコンポーネントに導入されており、イベントコールバックは$onを通じて監視されます。

<テンプレート>
  <div>
  <span>名前: {{name}}</span>
    <div>私はコミュニケーションコンポーネントBです</div>
  </div>
</テンプレート>

<スクリプト>
「@/utils/Bus.js」からバスをインポートします。
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    {名前} を返します。
  },
  マウント() {
    bus.$on("editName", (name) => {
        this.name=名前
      console.log(名前); // 
    });
  },
  メソッド: {},
};
</スクリプト>

<style lang='scss' スコープ>
</スタイル>

4. $parent、$childrenはコンポーネントインスタンスに直接アクセスします

  • 子コンポーネントは---> $parentを通じて親コンポーネントのインスタンスを取得します。
  • 親コンポーネントは、---> $childrenを通じて子コンポーネントのインスタンス配列を取得します。

子コンポーネント --- this.$parent は親コンポーネントのメソッドやデータなどを取得でき、直接使用して実行することができます。

<テンプレート>
  <div>私は子コンポーネントです</div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前:"息子",
  データ(){
    戻る {
      sonTitle: '私は子コンポーネントのデータです'
    }
  },
  方法:{
    息子ハンドル(){
      console.log('私はサブコンポーネントのメソッドです')
    }
  },
  作成された(){
    console.log(this.$parent)
    console.log(this.$parent.fatherTitle) // => 親コンポーネントのデータです this.$parent.fantherHandle() // => 親コンポーネントのメソッドです }
}
</スクリプト>

親コンポーネント --- 子コンポーネントのインスタンスを取得します。取得したインスタンスは配列の形式です。This.$children[0] はコンポーネントインスタンスを取得し、コンポーネントメソッドとデータを呼び出すことができます。

<テンプレート>
  <div>
    <Son>私は親コンポーネントです</Son>
  </div>
</テンプレート>

<スクリプト>
'./son.vue' から Son をインポートします。

エクスポートデフォルト{
  名前: 「父」
  コンポーネント:{
    息子
  },
  データ(){
    戻る {
      fatherTitle: 「私は親コンポーネントのデータです」
    }
  },
  方法:{
    ファンサーハンドル(){
      console.log('私は親コンポーネントのメソッドです')
    }
  },
  マウントされた(){
    console.log(this.$children)
    console.log(this.$children[0].sonTitle) // => 子コンポーネントのデータです this.$children[0].sonHandle() // => 子コンポーネントのメソッドです }
}
</スクリプト>

5. $参照

ref は、要素またはサブコンポーネントの参照情報を登録するために使用されます。参照情報は親コンポーネントの $refs オブジェクトに登録されます。

親コンポーネントは$refsを使用してコンポーネントインスタンスを取得します。

<テンプレート>
  <div>
    <息子ref="息子"></息子>
  </div>
</テンプレート>

<スクリプト>
'./son.vue' から Son をインポートします。

エクスポートデフォルト{
  名前: 「父」
  コンポーネント:{
    息子
  },
  マウントされた(){
    console.log(this.$refs.son) /*コンポーネントインスタンス*/
  }
}
</スクリプト>

6. マルチコンポーネントまたはディープコンポーネント通信を提供する/注入する

提供/注入の詳細な説明

  • 親コンポーネントはprovideを使用してデータを挿入します
  • サブコンポーネントはデータを使用するために注入を使用する
/* 親コンポーネント */
エクスポートデフォルト{
 提供する:
   戻る {
     provideName: 'フロントエンドの販売'
   }
 }
}

この時点で、変数provideNameは、曾孫、孫などを含むすべての子コンポーネントに提供され、injectを使用するだけでデータを取得できます。

/*サブコンポーネント*/
エクスポートデフォルト{
  挿入: ['provideName'],
  作成された(){
    console.log(this.provideName) // => "フロントエンドの販売"
  }
}
  • 親コンポーネントは、提供したデータをどのコンポーネントが使用するかを知る必要はありません。
  • サブ添付ファイルはデータの出所を知る必要がない

7. スロット(スロットスコープスコープスロット)子要素 --> 親要素(通信と同様)

  • レンダリングされた要素を置き換えるための再利用可能なテンプレート(データを渡すことができる)として使用されます。
  • 子コンポーネントでは、コンポーネントにプロパティを渡すのと同じように、スロットにデータを渡すだけです。
  • 注: 親スロットはコンテンツを最も外側の要素として受け取り、スロットスコープ属性を持つ必要があります。

子要素

<テンプレート>
  <div>
    <div class="isSon">
        <スロット:info='arrList'></スロット>
    </div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    return {arrList:[1,'aa','张三']};
  },
  マウント() {
  },
  メソッド: {
    
  },
};
</スクリプト>

親要素

<テンプレート>
<div>
    <ソンG>
        <span スロットスコープ="props">
            <ul>
                ああ
                <li v-for="props.info 内の項目" :key="項目">
                    {{アイテム}}
                </li>
            </ul>
        </span>
    </SonG>
</div>
</テンプレート>

<スクリプト>

'../components/SonG.vue' から SonG をインポートします。
エクスポートデフォルト{
   コンポーネント:{
       歌
   },
   データ () {
       戻る {
       }
   }
}
</スクリプト>

8. Vuex 状態管理

パブリックデータウェアハウスと同等

倉庫データを管理するためのいくつかの方法を提供する

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします

Vue.use(Vuex)

デフォルトの新しいVuex.Storeをエクスポートします({
  州: {
  },
  突然変異:
  },
  アクション: {
  },
  モジュール:
  }
})

要約する

これで、Vue でコンポーネント通信を実装する 8 つの方法についての記事は終了です。Vue でコンポーネント通信を実装することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3の7つのコンポーネント通信方式の詳細説明
  • 親子コンポーネントの通信を解決するための3つのVueスロット
  • Vue3における7種類のコンポーネント通信の詳細
  • Vueコンポーネント通信方法事例まとめ
  • Vue におけるコンポーネント通信の詳細説明 (父子コンポーネント、祖父孫コンポーネント、兄弟コンポーネント)
  • Vueコンポーネント間の通信方法はいくつかある

<<:  MySQL で大文字と小文字を区別しないように設定する方法

>>:  LINUX でプロセスを表示する 4 つの方法 (要約)

推薦する

Vue3 + TypeScript 開発の概要

目次Vue3 + TypeScript 学習1. 環境設定1.1 最新のVue scaffoldin...

TypescriptとAxiosに基づくインターフェースリクエスト管理の詳細な説明

目次アイデア傍受を要求するレスポンスインターセプションhttpClient.tsを使用してリクエスト...

CentOS7にPostgreSQL11をインストールする方法

CentOS 7にPostgreSQL 11をインストールする PostgreSQL: 世界で最も先...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

1. 遭遇したいくつかの問題2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テ...

CSSの記述形式、モバイルページの基本構造の詳細な説明

1. CSSの記述形式1. インラインスタイルCSSコードを開始タグに直接記述することができます&l...

ネイティブJSは非常に見栄えの良いカウンターを実装します

今日は、ネイティブ JS で実装された見栄えの良いカウンターを紹介します。効果は次のとおりです。 以...

クリーンで美しいウェブデザインのための4つの原則

この記事では、 Webデザインに関連するこれら4 つの原則について説明します。これら4 つの原則を念...

アニメーション効果のようなVueトランジションの例

目次結果を一目で見るハート効果デジタルスクロールアニメーションアニメーションのように結果を一目で見る...

WindowsでのNginxの起動や停止などの基本操作コマンドの詳しい説明

Windows で Nginx を使用するには、Nginx サービスの起動、停止、Nginx のリロ...

Ubuntu ターミナル マルチウィンドウ 分割画面 ターミネーター

1. インストールターミネーターの最大の特徴は、1つのウィンドウで複数のターミナルを開くことができる...

MySQL での limit の使用方法は何ですか (推奨)

SELECT * FROM テーブル名制限m,n; SELECT * FROM テーブル LIMI...

ファイル書き込みを使用して Linux アプリケーションをデバッグする方法

Linux ではすべてがファイルなので、Android システム自体は Linux + Java だ...

SSMプロジェクトは、ホットデプロイメント構成を実装するためにTomcatとMavenを使用してWARパッケージとしてデプロイされることが多い。

背景ご存知のとおり、JavaEE プロジェクトを開発した後は、そのプロジェクトをサーバーの Tomc...

MySQL の NOT IN 充填ピットの NULL 列の問題の解決方法

以前、会社で小さな機能に取り組んでいたとき、特定の状況でデータがいくつあるかを数えてから問題を修正し...