Vue組件通信之父?jìng)髯优c子傳父詳細(xì)講解
父組件傳遞給子組件
- 父組件傳遞給子組件:通過(guò)props屬性;
- 子組件傳遞給父組件:通過(guò)$emit觸發(fā)事件;

這里我們知道,父組件有一些數(shù)據(jù)需要子組件來(lái)進(jìn)行展示,那我們可以通過(guò)props來(lái)完成組件之間的通信
通過(guò)props來(lái)完成組件之間的通信


淺談Props
那么什么是Props呢?
- 作用:接受父組件傳遞過(guò)來(lái)的屬性
Props是你可以在組件上注冊(cè)一些自定義的attribute(屬性);- 父組件給這些attribute(屬性)賦值,子組件通過(guò)attribute的名稱獲取到對(duì)應(yīng)的值;
在使用 script setup的單文件組件中,props 可以使用 defineProps() 宏來(lái)聲明:
<script setup> const props = defineProps(['foo']) console.log(props.foo) </script>
數(shù)組類型
在沒(méi)有使用 script setup 的組件中,prop 可以使用 props 選項(xiàng)來(lái)聲明:
export default {
props: ['foo'],
setup(props) {
// setup() 接收 props 作為第一個(gè)參數(shù)
console.log(props.foo)
}
}
例子,對(duì)象語(yǔ)法的使用
App.vue里面使用組件,屬性整數(shù)props所定義的
<template> <show-info name="kk" age="18" height="1.7" /> </template>
showInfo.vue子組件
export default {
props:{
name :{
type:String,
default:"我是默認(rèn)值name"
},
height:{
type:Number,
default:2
}
}
}
另外:
那么type的類型都可以是哪些呢?
- String
- Number
- Boolean
- Array
- Object
- Date
- Function
- Symbol
對(duì)象類型
用對(duì)象的形式聲明props(這個(gè)還挺常用的)
使用 script setup
defineProps({
title: String,
likes: Number
})非 script setup
export default {
props: {
title: String,
likes: Number
}
}子組件傳遞給父組件
子組件傳遞給父組件通過(guò)$emit觸發(fā)事件

子組件傳遞內(nèi)容到父組件:
- 當(dāng)子組件有一些事件發(fā)生的時(shí)候,比如在組件中發(fā)生了點(diǎn)擊,父組件需要切換內(nèi)容;
- 子組件有一些內(nèi)容想要傳遞給父組件的時(shí)候;
$emit(“add”, count)
第一個(gè)參數(shù)自定義的事件名稱,第二個(gè)參數(shù)是傳遞的參數(shù)
舉一個(gè)計(jì)數(shù)器案例
- 這里我們有兩個(gè)子組件,一個(gè)父組件
- 子組件中定義好在某些情況下觸發(fā)的事件名稱
- 在父組件中以v-on(語(yǔ)法糖@)的方式傳入要監(jiān)聽(tīng)的事件名稱,并且綁定到對(duì)應(yīng)的方法中;
- 最后,在子組件中發(fā)生某個(gè)事件的時(shí)候,根據(jù)事件名稱觸發(fā)對(duì)應(yīng)的事件
父組件App.vue
- 父組件監(jiān)聽(tīng)子組件加或減的事件,通過(guò)子組件發(fā)生事件給父組件監(jiān)聽(tīng)
- 父組件監(jiān)聽(tīng)子組件發(fā)出的自定義事件,然后執(zhí)行相應(yīng)的操作
<template>
<div class="app">
<h2>當(dāng)前計(jì)數(shù):{{counter}}</h2>
<!-- 1.自定義add-counter 并且監(jiān)聽(tīng)內(nèi)部的add事件 -->
<add-counter @add="addBtnClick"></add-counter>
<!-- 2.自定義su-counter組件,監(jiān)聽(tīng)內(nèi)部的sub事件 -->
<sub-counter @sub="subBtnClick"></sub-counter>
</div>
</template>
<script>
import AddCounter from './AddCounter.vue'
import SubCounter from './SubCounter.vue'
export default {
components: {
AddCounter,
SubCounter
},
data() {
return {
counter:0
}
},
methods:{
addBtnClick(count) {
this.counter += count
},
subBtnClick(count) {
this.counter -= count
}
}
}
</script>
子組件1AddCounter.vue
這里定義的是計(jì)數(shù)器的加操作 子組件事件觸發(fā)之后,通過(guò)this.$emit的方式進(jìn)行發(fā)出事件
<template>
<div class="add">
<button @click="btnClick(1)">+1</button>
<button @click="btnClick(5)">+5</button>
<button @click="btnClick(10)">+10</button>
</div>
</template>
<script>
export default {
methods:{
btnClick(count) {
// 讓子組件發(fā)出去一個(gè)自定義事件
// 第一個(gè)參數(shù)自定義的事件名稱,第二個(gè)參數(shù)是傳遞的參數(shù)
this.$emit("add",count)
}
}
}
</script>3. 子組件2SubCounter.vue
這里定義的是計(jì)數(shù)器的減操作
子組件事件觸發(fā)之后,通過(guò)this.$emit的方式進(jìn)行發(fā)出事件
<template>
<div class="sub">
<button @click="btnClick(1)">-1</button>
<button @click="btnClick(5)">-5</button>
<button @click="btnClick(10)">-10</button>
</div>
</template>
<script>
export default {
// 1.emits數(shù)組語(yǔ)法
emits:["addd"],
methods:{
btnClick(count) {
this.$emit("sub",count)
}
}
}
</script>
這個(gè)案例非常經(jīng)典,可以反復(fù)琢磨一下~
到此這篇關(guān)于Vue組件通信之父?jìng)髯优c子傳父詳細(xì)講解的文章就介紹到這了,更多相關(guān)Vue組件通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue中使用v-if,v-else來(lái)設(shè)置css樣式的步驟
我們?cè)谑褂胿ue項(xiàng)目開(kāi)發(fā)時(shí),v-if是使用的非常多的,在這里我們談?wù)勅绾问褂胿-i來(lái)綁定修改css樣式,使用的主要是雙向數(shù)據(jù)綁定,即通過(guò)改變他的狀態(tài)來(lái)改變他的樣式,這篇文章主要介紹了vue中如何使用v-if,v-else來(lái)設(shè)置css樣式,需要的朋友可以參考下2023-03-03
關(guān)于vue組件的更新機(jī)制?resize()?callResize()
這篇文章主要介紹了關(guān)于vue組件的更新機(jī)制?resize()?callResize(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue3-print-nb實(shí)現(xiàn)頁(yè)面打印(含分頁(yè)打印)示例代碼
大多數(shù)后臺(tái)系統(tǒng)中都存在打印的需求,在有打印需求時(shí),對(duì)前端來(lái)說(shuō)當(dāng)然是直接打印頁(yè)面更容易,下面這篇文章主要給大家介紹了關(guān)于vue3-print-nb實(shí)現(xiàn)頁(yè)面打印(含分頁(yè)打印)的相關(guān)資料,需要的朋友可以參考下2024-01-01
Vue中使用this.$set()如何新增數(shù)據(jù),更新視圖
這篇文章主要介紹了Vue中使用this.$set()實(shí)現(xiàn)新增數(shù)據(jù),更新視圖方式。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Vue用Export2Excel導(dǎo)出excel,多級(jí)表頭數(shù)據(jù)方式
這篇文章主要介紹了Vue用Export2Excel導(dǎo)出excel,多級(jí)表頭數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue-router路由參數(shù)刷新消失的問(wèn)題解決方法
本篇文章主要介紹了vue-router路由參數(shù)刷新消失的問(wèn)題解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Vue封裝Swiper實(shí)現(xiàn)圖片輪播效果
圖片輪播是前端中經(jīng)常需要實(shí)現(xiàn)的一個(gè)功能。最近學(xué)習(xí)Vue.js,就針對(duì)Swiper進(jìn)行封裝,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片輪播組件。感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-02-02

