Vue3における7種類のコンポーネント通信の詳細

Vue3における7種類のコンポーネント通信の詳細

1. Vue3コンポーネント通信方式

  • props
  • $emit
  • expose / ref
  • $attrs
  • v-model
  • provide / inject
  • Vuex

2. Vue3通信の使い方

2.1 小道具

propsを使用して子コンポーネントにデータを渡すには、次の 2 つの方法があります。

方法1: 混合書き込み

// Parent.vue は <child :msg1="msg1" :msg2="msg2"></child> を送信します。
<スクリプト>
「./child.vue」から子をインポートします。
「vue」から{ref、reactive}をインポートします。
エクスポートデフォルト{
    データ(){
        戻る {
            メッセージ1: 「これはサブコンポーネント1の情報です」
        }
    },
    設定(){
        // レスポンシブデータを作成する // 記述方法 1 は基本型 ref に適用でき、他の用途もあります。次の章では、const msg2 = ref("これはサブコンポーネント 2 の情報です") を紹介します。
        
        // メソッド 2 は、配列やオブジェクトなどの複雑な型に適しています。const msg2 = reactive(["これはサブコンポーネント 2 の情報です"])
        
        戻る {
            メッセージ2
        }
    }
}
</スクリプト>

// Child.vue は <script> を受け取ります
エクスポートデフォルト{
  props: ["msg1", "msg2"], // この行が書かれていない場合、次の行は受け取られません setup(props) {
    console.log(props) // { msg1: "これは子コンポーネントに渡された情報 1 です", msg2: "これは子コンポーネントに渡された情報 2 です" }
  },
}
</スクリプト>

方法2: 純粋なVue3の記述

// Parent.vue は <child :msg2="msg2"></child> を送信します。
<スクリプトの設定>
    「./child.vue」から子をインポートします。
    「vue」から{ref、reactive}をインポートします。
    const msg2 = ref("これは子コンポーネント2に渡される情報です")
    // または複合型 const msg2 = reactive(["これはサブコンポーネント 2 の情報です"])
</スクリプト>

// Child.vue は <script setup> を受け取ります
    // 直接インポートする必要はありません // import { defineProps } from "vue"
    const props = defineProps({
        //書き込み方法1 msg2: 文字列
        // 書き込み方法 2 msg2:{
            タイプ:文字列、
            デフォルト:""
        }
    })
    console.log(props) // { msg2: "これはサブコンポーネント 2 の情報です" }
</スクリプト>

知らせ:

親コンポーネントが混合スタイルで記述され、子コンポーネントが純粋なVue3スタイルで記述されている場合、子コンポーネントは親コンポーネントのdataの属性を受け取ることができず、親コンポーネントのセットアップ関数で渡された属性のみを受け取ることができます。

親コンポーネントが純粋なVue3で記述され、子コンポーネントが混合スタイルで記述されている場合、 dataおよびsetup関数内のプロパティはpropsを通じて受け取ることができます。ただし、子コンポーネントが setup で受け取る場合、親コンポーネントのsetup関数内のプロパティしか受け取ることができず、 data 内のプロパティを受け取ることはできません。

担当者は「3が使われているので2は書かないように」とも言っており、混在した書き方は推奨されていない。以下の例では、純粋な Vue3 のみが使用され、混合記述は使用されていません。

2.2 $エミット

// Child.vue ディスパッチ
<テンプレート>
//書き方1
<button @click="emit('myClick')">ボタン</button>
//書き方2
<button @click="handleClick">ボタン</buttom>
</テンプレート>
<スクリプトの設定>

// 方法 1 は Vue 3.2 バージョンに適用可能であり、導入する必要はありません
// "vue" から {defineEmits } をインポートします
// 対応する書き方1
const エミット = defineEmits(["myClick","myClick2"])
// 対応する書き方2
const ハンドルクリック = ()=>{
emitting("myClick", "これは親コンポーネントに送信される情報です")
}

// メソッド 2 は Vue 3.2 には適用できません。useContext() は非推奨です。
「vue」から {useContext} をインポートします。
const { 出力 } = useContext()
const ハンドルクリック = ()=>{
emitting("myClick", "これは親コンポーネントに送信される情報です")
}
</スクリプト>

// Parent.vue は <template> に応答します
    <child @myClick="onMyClick"></child>
</テンプレート>
<スクリプトの設定>
    「./child.vue」から子をインポートします。
    定数 onMyClick = (メッセージ) => {
        console.log(msg) // これは親コンポーネントが受信した情報です}
</スクリプト>

2.3 公開 / 参照

親コンポーネントは子コンポーネントのプロパティを取得するか、子コンポーネントメソッドを呼び出します。

// 子.vue
<スクリプトの設定>
    // 方法 1 は、useContext() が非推奨となった Vue 3.2 には適用できません。import { useContext } from "vue"
    定数ctx = useContext()
    // 外部に公開されるプロパティとメソッドはctx.expose({
        childName: "これは子コンポーネントのプロパティです",
        いくつかのメソッド(){
            console.log("これは子コンポーネントのメソッドです")
        }
    })
    
    // 方法 2 は Vue 3.2 バージョンに適用可能で、インポートする必要はありません // import { defineExpose } from "vue"
    定義公開({
        childName: "これは子コンポーネントのプロパティです",
        いくつかのメソッド(){
            console.log("これは子コンポーネントのメソッドです")
        }
    })
</スクリプト>

// Parent.vue 注記 ref="comp"
<テンプレート>
    <child ref="comp"></child>
    <button @click="handlerClick">ボタン</button>
</テンプレート>
<スクリプトの設定>
    「./child.vue」から子をインポートします。
    「vue」から{ref}をインポートします
    定数comp = ref(null)
    const ハンドラクリック = () => {
        console.log(comp.value.childName) // 子コンポーネントによって公開されているプロパティを取得します。 comp.value.someMethod() // 子コンポーネントによって公開されているメソッドを呼び出します。 }
</スクリプト>

2.4 属性

attrs : classstyleを除く親スコープ内の非props属性のコレクションが含まれます。

// Parent.vue は <child :msg1="msg1" :msg2="msg2" title="3333"></child> を送信します。
<スクリプトの設定>
    「./child.vue」から子をインポートします。
    「vue」から{ref、reactive}をインポートします。
    定数msg1 = ref("1111")
    定数msg2 = ref("2222")
</スクリプト>

// Child.vue は <script setup> を受け取ります
    「vue」から{defineProps、useContext、useAttrs}をインポートします。
    // バージョン 3.2 では defineProps を導入する必要はありません。const props = defineProps({ を使用するだけです。
        メッセージ1: 文字列
    })
    // メソッド 1 は、useContext() が非推奨となった Vue 3.2 には適用できません。const ctx = useContext()
    // msg1 が props を使用して受信されない場合は、次のようになります { msg1: "1111", msg2: "2222", title: "3333" }
    console.log(ctx.attrs) // { msg2:"2222", タイトル: "3333" }
    
    // 方法 2 は Vue 3.2 バージョンに適用可能 const attrs = useAttrs()
    console.log(attrs) // { msg2:"2222", タイトル: "3333" }
</スクリプト>

2.5Vモデル

複数のデータの双方向バインディングをサポートできます

// 親.vue
<child v-model:key="キー" v-model:value="値"></child>
<スクリプトの設定>
    「./child.vue」から子をインポートします。
    「vue」から{ref、reactive}をインポートします。
    定数キー = ref("1111")
    定数値 = ref("2222")
</スクリプト>

// 子.vue
<テンプレート>
    <button @click="handlerClick">ボタン</button>
</テンプレート>
<スクリプトの設定>
    
    // 方法 1 は、useContext() が非推奨となった Vue 3.2 には適用できません。import { useContext } from "vue"
    const { 出力 } = useContext()
    
    // 方法 2 は Vue 3.2 バージョンに適用可能であり、導入する必要はありません // import { defineEmits } from "vue"
    const 出力 = defineEmits(["キー","値"])
    
    // 使用法 const handlerClick = () => {
        出力("update:key", "新しいキー")
        出力("update:value", "新しい値")
    }
</スクリプト>

2.6 提供/注入

依存性注入のためのprovide / inject

  • provide : 子孫コンポーネントに提供したいデータを指定することができます。
  • inject : このコンポーネントに追加するデータを任意の子孫コンポーネントで受け取ります。コンポーネントがどれだけ深くネストされていても、直接使用できます。
// 親.vue
<スクリプトの設定>
    「vue」から{provide}をインポートします
    provide("name", "Muhua")
</スクリプト>

// 子.vue
<スクリプトの設定>
    「vue」からインポートします。
    const name = inject("name")
    console.log(name) // ムー・フア</script>

2.7 ヴュークス

// ストア/index.js
「vuex」から{createStore}をインポートします
エクスポートデフォルトcreateStore({
    状態:{ カウント: 1 },
    ゲッター:{
        getCount: 状態 => 状態.count
    },
    突然変異:
        追加(状態){
            状態.count++
        }
    }
})

// メイン.js
「vue」から{createApp}をインポートします
「./App.vue」からアプリをインポートします。
「./store」からストアをインポートします。
createApp(App).use(store).mount("#app")

// ページ.vue
// 方法 1: <template> を直接使用する
    <div>{{ $store.state.count }}</div>
    <button @click="$store.commit('add')">ボタン</button>
</テンプレート>

// <スクリプト設定> を取得する方法 2
    「vuex」から useStore, computed をインポートします。
    定数ストア = useStore()
    コンソールログ(ストアの状態カウント) // 1

    const count = computed(()=>store.state.count) // レスポンシブ、vuex データの変更に応じて変化します console.log(count) // 1 
</スクリプト>

Vue3の 7 種類のコンポーネント通信の詳細についての記事はこれで終わりです。Vue3 の 7 種類のコンポーネント通信の詳細については、 Vue3の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue.jsはコンポーネント間の通信を毎日学習する必要がある
  • Vuejs 第10章: Vuejs 親子コンポーネント通信
  • Vue でのコンポーネント通信の 8 つの方法 (収集する価値があります!)
  • Vue コンポーネント間の通信: 子コンポーネントが親コンポーネントに値を渡す方法
  • 祖父母コンポーネントと通信する Vue 孫コンポーネントの実装
  • Vue のクロスコンポーネント通信のいくつかの方法についての詳細な説明
  • Vue.js コンポーネントとコンポーネント通信の詳細
  • Vueコンポーネント通信の3つの方法の詳細な説明
  • Vueコンポーネントがコンポーネント通信を実現する仕組みについて詳しく説明します。

<<:  MySQL のバックアップとリカバリの設計アイデア

>>:  Linux コマンドラインで他のユーザーと通信する方法

推薦する

JavaScript でプライベート変数を宣言する 2 つの方法

序文JavaScript は、キーワードを使用してプライベート変数を宣言できる他の言語とは異なります...

シンプルなID生成戦略: MySQLテーブルからグローバルに一意のIDを生成する実装

グローバル ID を生成する方法は多数あります。ここでは簡単な解決策を紹介します。MySQL の自動...

Vueコンポーネント化の基本的な使用方法の詳細

目次1. コンポーネント化とは何ですか? 2. 基本的な使い方序文:場合によっては、HTML 構造化...

MySQL 5.7.9 バージョンの sql_mode=only_full_group_by 問題を解決する

MySQL 5.7.9 バージョンの sql_mode=only_full_group_by の問題...

MySQLストレージフィールドタイプのクエリ効率についての簡単な理解

検索パフォーマンスは最速から最遅まで次のとおりです (私が聞いたところによると)。 1 番目: ti...

MySQLからOracleへのリアルタイム同期ソリューションの詳細な説明

1 要件の概要MySQL5.6本番データベースの複数のテーブルのデータは、Oracle11gデータウ...

Vue-router ネストルーティングの詳細な説明

目次ステップ1. ルーティング ルールを設定し、子構成項目を使用します。 2. ジャンプ(フルパスを...

Linux 上の MySQL 5.7 でパスワードを忘れる問題を解決する

1. 問題Linux 上の mysql5.7 のパスワードを忘れました2. 解決策• ステップ 1:...

Web デザインのヒント: ページ レイアウトの簡単なルール

繰り返し: サイト全体で特定のページ デザイン スタイルを繰り返します。繰り返し要素としては、特定の...

H5でクリックされたときにaタグの背景色をキャンセルする方法

1. モバイル端末でクリックされたときにタグの青色を解除する { -webkit-tap-highl...

Linux CentOS でスクリプトを定期的に実行するように設定する方法

多くの場合、サーバーでスクリプトを定期的に実行して操作をトリガーする必要があります。たとえば、Qin...

ウェブサイトのコンテンツが検索エンジンに含まれないようにする方法

通常、Web サイトを構築する目的は、検索エンジンにインデックス登録してもらい、プロモーションを拡大...

レスポンシブWebデザイン学習(1) - 画面サイズと使用率の決定

最近では、モバイルデバイスがますます普及しており、ユーザーがスマートフォンやタブレットを使用して W...

HTML のタイトル、段落、改行、水平線、特殊文字についての簡単な説明

タイトルXML/HTML コードコンテンツをクリップボードにコピー< h1 >第 1 レ...

1 行または複数行のテキストがオーバーフローしたときに省略記号を表示する CSS を実装する方法

1. 単一行オーバーフロー1. 1 行がオーバーフローした場合、超過部分は表示されます...または、...