国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue3父子組件間傳參通信

這篇具有很好參考價(jià)值的文章主要介紹了Vue3父子組件間傳參通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

本文主要是記錄Vue3在setup語法糖下的父子組件間傳參的四種方式

Vue3+TypeScript

一、父?jìng)髯?defineProps

父組件傳值給子組件主要是由父組件為子組件通過v-bind綁定數(shù)值,而后傳給子組件;子組件則通過defineProps接收使用。

如下為父組件Father.vue

<template>
  <div class="fa">
    <div style="margin: 10px;">我是父組件</div>
    <Son :fatherMessage="fatherMessage"></Son>
  </div>
</template>

<script setup lang="ts">
import Son from './Son.vue'
import {ref} from "vue";

const fatherMessage = ref<string>("我是父組件傳過來的值")

</script>

<style scoped>
.fa{
  border: 3px solid cornflowerblue;
  width: 400px;
  text-align: center;
}
</style>

如下為子組件Son.vue

<template>
  <div style="margin: 10px;border: 2px solid red">
    我是子組件
    <div style="margin: 5px;border: 2px solid gold">
      父組件傳值接收區(qū):{{fatherMessage}}
    </div>
  </div>
</template>

<script setup lang="ts">
interface Props {
  fatherMessage?: string,
}
defineProps<Props>()

</script>

父組件Father.vue中在調(diào)用Son.vue這個(gè)子組件時(shí),使用v-bind綁定參數(shù)fatherMessage,并傳給Son.vue

子組件Son.vue使用defineProps接收fatherMessage這個(gè)參數(shù),而后就可以正常使用該參數(shù)。

二、子傳父 defineEmits

子組件傳值給父組件主要是子組件通過defineEmits注冊(cè)一個(gè)自定義事件,而后觸發(fā)emit去調(diào)用該自定義事件,并傳遞參數(shù)給父組件。

在父組件中調(diào)用子組件時(shí),通過v-on綁定一個(gè)函數(shù),通過該函數(shù)獲取傳過來的值。

如下為子組件Son.vue

<template>
  <div style="margin: 10px;border: 2px solid red">
    我是子組件
    <button @click="transValue" style="margin: 5px">傳值給父組件</button>
  </div>
</template>

<script setup lang="ts">
import {ref} from "vue";

// 定義所要傳給父組件的值
const value = ref<String>("我是子組件傳給父組件的值")

// 使用defineEmits注冊(cè)一個(gè)自定義事件
const emit = defineEmits(["getValue"])

// 點(diǎn)擊事件觸發(fā)emit,去調(diào)用我們注冊(cè)的自定義事件getValue,并傳遞value參數(shù)至父組件
const transValue = () => {
  emit("getValue", value.value)
}

</script>

如下為父組件Father.vue

<template>
  <div class="fa">
    <div style="margin: 10px;">我是父組件</div>
    父組件接收子組件傳的值:{{sonMessage}}
    <Son @getValue="getSonValue"></Son>
  </div>
</template>

<script setup lang="ts">
import Son from './Son.vue'
import {ref} from "vue";

const sonMessage = ref<string>("")
const getSonValue = (value: string) => {
  sonMessage.value = value
}
</script>

<style scoped>
.fa{
  border: 3px solid cornflowerblue;
  width: 400px;
  text-align: center;
}
</style>

父組件Father.vue中在調(diào)用Son.vue這個(gè)子組件時(shí),當(dāng)子組件Son.vue需要傳參給父組件Father.vue時(shí),使用defineEmits注冊(cè)一個(gè)事件getValue,而后設(shè)置點(diǎn)擊事件transValue去觸發(fā)emit,去調(diào)用我們注冊(cè)的自定義事件getValue,并傳遞value參數(shù)至父組件。

父組件Father.vue在獲取子組件Son.vue傳過來的值時(shí),通過在子組件上使用v-on設(shè)置響應(yīng)函數(shù)getValue(該函數(shù)與子組件中的注冊(cè)自定義事件getValue名稱需一致),并綁定一個(gè)函數(shù)getSonValue來獲取傳過來的值。

三、子組件暴露屬性給父組件 defineExpose

當(dāng)父組件想直接調(diào)用父組件的屬性或者方法時(shí),子組件可以使用defineExpose暴露自身的屬性或者方法,父組件中使用ref調(diào)用子組件暴露的屬性或方法。
如下為子組件Son.vue

<template>
  <div style="margin: 10px;border: 2px solid red">
    我是子組件

  </div>
</template>

<script setup lang="ts">
import {ref, defineExpose} from "vue";

// 暴露給父組件的值
const toFatherValue = ref<string>("我是要暴露給父組件的值")

// 暴露給父組件的方法
const toFatherMethod = () => {
  console.log("我是要暴露給父組件的方法")
}
// 暴露方法和屬性給父組件
defineExpose({toFatherMethod, toFatherValue})

</script>

如下為父組件Father.vue

<template>
  <div class="fa">
    <div style="margin: 10px;">我是父組件</div>
    <button @click="getSonMethod">獲取子組件的方法</button>
    <Son ref="sonMethodRef"></Son>
  </div>
</template>

<script setup lang="ts">
import Son from './Son.vue'
import {ref} from "vue";

const sonMethodRef = ref()

const getSonMethod = () => {
  sonMethodRef.value.toFatherMethod()
  console.log(sonMethodRef.value.toFatherValue)
}

</script>

<style scoped>
.fa{
  border: 3px solid cornflowerblue;
  width: 400px;
  text-align: center;
}
</style>

在子組件中定義屬性toFatherValue和方法toFatherMethod,而后通過defineExpose暴露出來。
父組件調(diào)用時(shí),為子組件綁定一個(gè)ref,并定義一個(gè)ref變量sonMethodRef,通過調(diào)用sonMethodRef,來獲取子組件暴露出來的屬性和方法。

四、依賴注入Provide / Inject

從上面的介紹里我們可以了解到父子組件之間的通信,但是卻存在這樣的情況:有一些多層級(jí)嵌套的組件,形成了一顆巨大的組件樹,而某個(gè)深層的子組件需要一個(gè)較遠(yuǎn)的祖先組件中的部分?jǐn)?shù)據(jù)。在這種情況下,如果僅使用 props 則必須將其沿著組件鏈逐級(jí)傳遞下去,這會(huì)非常麻煩:
vue3父子組件傳參,TypeScript,Vue3,javascript,vue.js,前端

雖然這里的 Footer 組件可能根本不關(guān)心這些 props,但為了使 DeepChild 能訪問到它們,仍然需要定義并向下傳遞。如果組件鏈路非常長(zhǎng),可能會(huì)影響到更多這條路上的組件。這一問題被稱為“prop 逐級(jí)透?jìng)鳌?/font>,顯然是我們希望盡量避免的情況。
provideinject 可以幫助我們解決這一問題。 一個(gè)父組件相對(duì)于其所有的后代組件,會(huì)作為依賴提供者。任何后代的組件樹,無論層級(jí)有多深,都可以注入由父組件提供給整條鏈路的依賴。
vue3父子組件傳參,TypeScript,Vue3,javascript,vue.js,前端
如下為父組件Root.vue

<template>
  <div>
    我是root組件
    <Footer></Footer>
  </div>
</template>

<script setup lang="ts">
import { provide, ref } from 'vue'
import Footer from './Footer.vue'

const toChildValue= ref<string>("我是給所有子組件的值")

// 將toChildValue注入到所有子組件中
provide(/* 注入名 */ 'toChildValue', /* 值 */ toChildValue)

</script>

如下為子組件Footer.vue

<template>
  <div>
    我是footer組件
    <div>
      接收父組件的值:{{getFatherValue}}
    </div>
    <DeepChild></DeepChild>
  </div>
</template>

<script setup lang="ts">
import DeepChild from "./DeepChild.vue"
import {ref,inject,Ref} from "vue";

// 獲取父組件提供的值
// 如果沒有祖先組件提供 "toChildValue"
// ref("") 會(huì)是 "這是默認(rèn)值"
const getFatherValue = inject<Ref<string>>(/* 注入名 */"toChildValue",/* 默認(rèn)值 */ ref(""))

</script>

如下為孫子組件DeepChild.vue

<template>
  <div>
    我是deepChild組件
    <div>
      接收爺爺組件的值:{{getGrandFatherValue}}
    </div>
  </div>
</template>

<script setup lang="ts">
import {inject, ref, Ref} from "vue";

// 獲取爺爺組件提供的值
// 如果沒有爺爺組件提供 "toChildValue"
// value 會(huì)是 ""
const getGrandFatherValue = inject<Ref<string>>(/* 注入名 */"toChildValue",/* 默認(rèn)值 */ ref(""))
</script>

當(dāng)最頂層的組件Root.vue傳值給所有子組件時(shí),使用provide進(jìn)行注入

provide(/* 注入名 */ 'toChildValue', /* 值 */ toChildValue)

而后無論哪個(gè)子組件想要獲取toChildValue的值,只需使用inject即可

inject<Ref<string>>(/* 注入名 */"toChildValue",/* 默認(rèn)值 */ ref(""))

當(dāng)提供 / 注入響應(yīng)式的數(shù)據(jù)時(shí),如果想改變數(shù)據(jù)時(shí),建議盡可能將任何對(duì)響應(yīng)式狀態(tài)的變更都保持在供給方組件中,即根組件Root.vue。這樣可以確保所提供狀態(tài)的聲明和變更操作都內(nèi)聚在同一個(gè)組件內(nèi),使其更容易維護(hù)。

有的時(shí)候,我們可能需要在注入方組件中更改數(shù)據(jù)。在這種情況下,我們推薦在供給方組件內(nèi)聲明并提供一個(gè)更改數(shù)據(jù)的方法函數(shù):
如下為父組件Root.vue

<template>
  <div>
    我是root組件
    <Footer></Footer>
  </div>
</template>

<script setup lang="ts">
import {InjectionKey, provide, Ref, ref} from 'vue'
import Footer from './Footer.vue'

const toChildValue= ref<string>("我是給所有子組件的值")
/**
 * 修改父組件值的方法
 */
const changeValue = () => {
  toChildValue.value = "我是父組件修改的值"
}
// 定義一個(gè)注入key的類型(建議將注入 key 的類型放在一個(gè)單獨(dú)的文件中,這樣它就可以被多個(gè)組件導(dǎo)入)
interface ProvideType {
  toChildValue: Ref<string>;
  changeValue: () => void;
}
// 為注入值標(biāo)記類型
const toValue = Symbol() as InjectionKey<ProvideType>
// 將toChildValue和changeValue注入到所有子組件中
provide(/* 注入名 */ 'toValue', /* 值 */{
  toChildValue,
  changeValue
})
</script>

provideinject 通常會(huì)在不同的組件中運(yùn)行。要正確地為注入的值標(biāo)記類型,Vue 提供了一個(gè) InjectionKey 接口,它是一個(gè)繼承自 Symbol 的泛型類型,可以用來在提供者和消費(fèi)者之間同步注入值的類型。
建議將注入 key 的類型放在一個(gè)單獨(dú)的文件中,這樣它就可以被多個(gè)組件導(dǎo)入。

// 定義一個(gè)注入key的類型
//(建議將注入 key 的類型放在一個(gè)單獨(dú)的文件中,這樣它就可以被多個(gè)組件導(dǎo)入)
interface ProvideType {
  toChildValue: Ref<string>;
  changeValue: () => void;
}
// 為注入值標(biāo)記類型
const toValue = Symbol() as InjectionKey<ProvideType>

如下為孫子組件DeepChild.vue

<template>
  <div>
    我是deepChild組件
    <div>
      <button @click="changeValue">改變祖先組件的值</button>
      {{toChildValue}}
    </div>
  </div>
</template>

<script setup lang="ts">
import {inject, ref, Ref} from "vue";

// 定義注入值的類型
interface ProvideType {
  toChildValue: Ref<string>;
  changeValue: () => void;
}
// 解構(gòu)獲取父組件傳的值,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換
const {toChildValue, changeValue} = inject(/* 注入名 */"toValue") as ProvideType
// 不解構(gòu)時(shí),只需指定類型即可
// const value = inject<ProvideType>(/* 注入名 */"toValue")
</script>

當(dāng)祖先組件提供參數(shù)與方法時(shí),子組件在解構(gòu)時(shí)需要強(qiáng)制轉(zhuǎn)換該值的類型

// 解構(gòu)獲取父組件傳的值
const {toChildValue, changeValue} = inject(/* 注入名 */"toValue") as ProvideType

如果子組件在使用時(shí)不進(jìn)行解構(gòu),則直接指明類型即可

// 不解構(gòu)時(shí),直接指定類型即可
const value = inject<ProvideType>(/* 注入名 */"toValue")

參考

1、小滿ZS 學(xué)習(xí)Vue3 第二十三章(依賴注入Provide / Inject) https://blog.csdn.net/qq1195566313/article/details/123143981?spm=1001.2014.3001.5501
2、Vue3官網(wǎng) 依賴注入
https://cn.vuejs.org/guide/components/provide-inject.html文章來源地址http://www.zghlxwxcb.cn/news/detail-802882.html

到了這里,關(guān)于Vue3父子組件間傳參通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3 常用的組件互相通信(父子、兄弟、爺孫、任意組件)

    目錄 前言:目前組件通信方法有好多種,我這挑選一部分來講 1、父?jìng)髯?2、子傳父 3、兄弟之間通信 3.1、父組件充當(dāng)中間件 3.2、全局事件總線—EventBus 4、爺孫之間通信 5、任意組件、全局 方案 父?jìng)髯?子傳父 props / emits props emits v-model / emits v-model emits ref / emits ref emits provi

    2024年02月15日
    瀏覽(51)
  • vue3探索——組件通信之v-model父子組件數(shù)據(jù)同步

    再很多場(chǎng)景中,我們可能想在子組件中修改父組件的數(shù)據(jù),但事實(shí)上,vue不推薦我們這么做,因?yàn)閿?shù)據(jù)的修改不容易溯源。 在vue2中,我們使用 .sync 修飾符+自定義事件 \\\'update:xxx\\\' ,來使父子組件數(shù)據(jù)同步。 這里不作過多說明,有需要請(qǐng)自行了解。 vue3的寫法與vue2基本一致。最

    2024年02月11日
    瀏覽(22)
  • vue3探索——使用ref與$parent實(shí)現(xiàn)父子組件間通信

    在vue3中,可以使用vue3的API defineExpose() 函數(shù)結(jié)合 ref 或者 $parent ,實(shí)現(xiàn)父子組件數(shù)據(jù)的傳遞。 子組件:通過 defineExpose() 函數(shù),向外暴露響應(yīng)式數(shù)據(jù)或者方法 父組件:通過 ref 獲取子組件實(shí)例,進(jìn)而獲取子組件暴露的響應(yīng)式數(shù)據(jù)或方法 ?? 你沒看錯(cuò)!這里的 ref 就是經(jīng)常用來定

    2024年02月10日
    瀏覽(25)
  • vue3中監(jiān)聽,組件通信如父子傳值、Vuex、Event Bus的使用

    目錄 一、監(jiān)聽 二、父子傳值: 1、父?jìng)髯樱?2、子傳父 三、全局狀態(tài)管理(Vuex): 四、事件總線(Event Bus): 我們有一個(gè)父組件ParentComponent和一個(gè)子組件ChildComponent。在父組件中,我們使用:childProp=\\\"parentData\\\"將數(shù)據(jù)傳遞給子組件。在子組件中,我們使用defineProps來接收父組件

    2024年02月13日
    瀏覽(32)
  • Vue3的手腳架使用和組件父子間通信-插槽(Options API)學(xué)習(xí)筆記

    全局安裝最新vue3 升級(jí)Vue CLI: 如果是比較舊的版本,可以通過下面命令來升級(jí) 通過腳手架創(chuàng)建項(xiàng)目 父組件 子組件 UserComponent.vue 父組件 **子組件1 JiaComponent.vue ** ** 子組件2 JianComponent.vue ** 父組件 子組件 TitleComponents.vue 父組件 **子組件 NavComponent.vue ** 父組件 子組件 NavCompone

    2024年02月05日
    瀏覽(50)
  • Vue3父子組件相互調(diào)用方法

    Vue3父子組件相互調(diào)用方法

    下面演示均為使用 setup 語法糖的情況! 參考網(wǎng)址:https://cn.vuejs.org/api/sfc-script-setup.html#defineexpose 子組件需要使用defineExpose對(duì)外暴露方法,父組件才可以調(diào)用! 1.子組件 2.父組件 3.測(cè)試結(jié)果 1.父組件 2.子組件 3.測(cè)試結(jié)果 今天的分享就到這里啦~~ 如有錯(cuò)誤,歡迎隨時(shí)雅正。

    2024年02月11日
    瀏覽(24)
  • vue3 父子組件傳值 記錄

    vue3 父子組件傳值 記錄

    最近這個(gè)組件之間傳值用的較多,我這該死的記性,總給忘記寫法,特此記錄下 補(bǔ)充:LeftView.vue 是父組件; Video.vue 是子組件 Video.vue 子組件 LeftView.vue 父組件 第一步 創(chuàng)建bus.js文件 第二步 分別在需要相互傳參的組件中引入bus.js文件,并相互傳參

    2024年02月11日
    瀏覽(22)
  • vue3父子組件相互調(diào)用方法詳解

    在vue3項(xiàng)目開發(fā)中,我們常常會(huì)遇到父子組件相互調(diào)用的場(chǎng)景,下面以setup語法糖格式詳細(xì)聊聊父子組件那些事兒。

    2024年02月11日
    瀏覽(23)
  • vue3 組件傳參

    vue3 組件傳參

    原理: 通過第三個(gè)“東西”,一個(gè)往里寫,一個(gè)讀取。 方案:Mitt.js Mitt.js 安裝及使用方法 安裝 包的官網(wǎng): https://www.npmjs.com/package/mitt 封裝: 在項(xiàng)目src目錄下新建一個(gè) bus文件夾,里面再建一個(gè)bus.ts文件,用來存放咱們的EventBusa事件總線。在 bus.ts 文件中,封裝代碼。 簡(jiǎn)單: 復(fù)雜點(diǎn)

    2024年04月26日
    瀏覽(20)
  • vue父子組件之間雙向數(shù)據(jù)綁定的(vue2/vue3)

    vue父子組件之間雙向數(shù)據(jù)綁定的四種方法(vue2/vue3) vue考慮到組件的可維護(hù)性,是不允許子組件改變父組件傳的props值的。父組件通過綁定屬性的方式向子組件傳值,而在子組件中可以通過$emit向父組件通信(第一種方式),通過這種間接的方式改變父組件的data,從而實(shí)現(xiàn)子組

    2024年02月08日
    瀏覽(89)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包