2022-04-11——vue組件傳值(8種方法)----props、$emit()祠够、手動(dòng)封裝事件訂閱observer压汪、事件總線(Eventbus)、vuex古瓤、親兄弟傳值止剖、provide/inj...

1、父?jìng)髯?/h2>

傳遞:當(dāng)子組件中在父組件中當(dāng)做標(biāo)簽使用的時(shí)候落君,給子組件綁定一個(gè)自定義屬性穿香,值為需要傳遞的數(shù)據(jù)
接收:在子組件內(nèi)部通過props進(jìn)行接收,props接收的方式有2種:
①通過數(shù)組進(jìn)行接收 props:["屬性"]
②通過對(duì)象進(jìn)行接收
props:{
(1)type:限制數(shù)據(jù)的類型
(2)default:默認(rèn)值
(3)required:布爾值绎速,和default二選一
}
步驟:
①在父組件中給子組件標(biāo)簽上添加自定義屬性:<son :custom="100"></son>
②子組件中通過props接收:props:["custom"]
③接收到的custom可以直接在標(biāo)簽中使用 {{custom}}
注意:今后只要看到props就要想到這個(gè)屬性是用來接收外部數(shù)據(jù)的皮获。

2、子傳父

①接收:當(dāng)子組件在父組件中當(dāng)做標(biāo)簽使用的時(shí)候纹冤,給當(dāng)前子組件綁定一個(gè)自定義事件洒宝,值為需要接收值的函數(shù),這個(gè)函數(shù)不允許加 ()
②傳遞的過程:在子組件內(nèi)部通過this.$emit("自定義事件名稱",需要傳遞的參數(shù))來進(jìn)行數(shù)據(jù)的傳遞

步驟:
①父組件中給需要接收參數(shù)的子組件綁定自定義事件萌京,值為需要接收值的函數(shù):

<son @handler="handlerMsg"></son>


methods:{
   handlerMsg(value){
       console.log(value)// 這個(gè)值是通過this.$emit()觸發(fā)傳來的
   }
}

3雁歌、非父子傳遞

第一種方法:通過給vue原型上添加一個(gè)公共的vue實(shí)例對(duì)象(vue實(shí)例對(duì)象上有on()和emit()),需要傳遞的一方調(diào)用emit()知残,需要接收的一方調(diào)用on()将宪。

步驟:
①main.js中:Vue.prototype.$observer=new Vue();

②需要傳遞的組件中:this.observer.emit("handler",100);

③需要接收的組件中:
this.observer.on("handler",(value)=>{
console.log(value)
});

注意:在掛載前(created)進(jìn)行$on()綁定,先綁定好橡庞,再觸發(fā)较坛。

第二種方法:手動(dòng)封裝事件訂閱observer

步驟:
①src下新建observer.js:

const eventList = {};

const $on = function(eventName, callback) {
    if (!eventList[eventName]) {
        eventList[eventName] = [];
    }
    eventList[eventName].push(callback);
}

const $emit = function(eventName, params) {
    if (eventList[eventName]) {
        let arr = eventList[eventName];
        arr.forEach((cb) => {
            cb(params);
        });
    }
}

const $off = function(eventName, callback) {
    if (eventList[eventName]) {
        if (callback) {
            let index = eventList[eventName].indexOf(callback);
            eventList[eventName].splice(index, 1);
        } else {
            eventList[eventName].length = 0;
        }
    }
}

export default {
    $on,
    $emit,
    $off
}

②main.js中用手動(dòng)封裝的observer替代new Vue()
import observer from "./observer.js";
Vue.prototype.observer=observer; ③在需要傳遞的組件中用this.observer.emit()觸發(fā)自定義事件: this.observer.emit("customHandler","需要傳遞的值"); ④在需要接收的組件中用this.observer.on()綁定自定義事件: this.observer.$on("customHandler",this.toggle);
⑤清除自定義事件

beforeDestroy() {
    this.$observer.$off('customHandler')
},

第三種方法:事件總線(Eventbus)

步驟:
①先創(chuàng)建一個(gè)空實(shí)例:
let bus=new Vue();
②通過bus.on()綁定自定義事件: bus.on("customHandler",要觸發(fā)的函數(shù));
③通過bus.emit()來觸發(fā)自定義事件: bus.emit("customHandler");

第四種方法:vuex

注:如果是親兄弟:(父?jìng)髯雍妥觽鞲福?/h3>

步驟:
①父組件中聲明data數(shù)據(jù) state:true ,將state通過props傳給其中一個(gè)子組件:

<two :show="state"></two>
props:show

此時(shí)show的值隨著state的變化而變化

②再通過另一個(gè)子組件去改變父組件的state:
標(biāo)簽上綁定自定義事件:
<one @customHandler="toggle"></one>
再在子組件內(nèi)部通過emit()觸發(fā)customHandler事件: this.emit("customHandler");

provide / inject(提供/注入)跨組件傳值扒最,其實(shí)就是父?jìng)髯?/h3>

provide / inject:依賴注入丑勤。可以實(shí)現(xiàn)跨組件傳值吧趣,數(shù)據(jù)的流向只能是向下傳遞法竞,就是大范圍有效的props
provide:這個(gè)配置項(xiàng)必須要在父級(jí)進(jìn)行使用,用來定義后代組件所需要的一些屬性和方法强挫。

provide(){
    return{
    
    }
}

inject:這個(gè)配置項(xiàng)必須在后代組件中使用岔霸,用來獲取根組件定義的跨組件傳值的數(shù)據(jù)。

 inject:{
    key:{
        from:"父組件名稱",
        default:默認(rèn)值
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俯渤,一起剝皮案震驚了整個(gè)濱河市呆细,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌八匠,老刑警劉巖絮爷,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趴酣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坑夯,警方通過查閱死者的電腦和手機(jī)岖寞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柜蜈,“玉大人仗谆,你說我怎么就攤上這事∈缏模” “怎么了隶垮?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳖谈。 經(jīng)常有香客問我,道長(zhǎng)阔涉,這世上最難降的妖魔是什么缆娃? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瑰排,結(jié)果婚禮上贯要,老公的妹妹穿的比我還像新娘。我一直安慰自己椭住,他們只是感情好崇渗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著京郑,像睡著了一般宅广。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上些举,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天跟狱,我揣著相機(jī)與錄音,去河邊找鬼户魏。 笑死驶臊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叼丑。 我是一名探鬼主播关翎,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鸠信!你這毒婦竟也來了纵寝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤星立,失蹤者是張志新(化名)和其女友劉穎店雅,沒想到半個(gè)月后政基,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闹啦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年沮明,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍奋。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荐健,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琳袄,到底是詐尸還是另有隱情江场,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布窖逗,位于F島的核電站址否,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碎紊。R本人自食惡果不足惜佑附,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仗考。 院中可真熱鬧音同,春花似錦、人聲如沸秃嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锅锨。三九已至叽赊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間必搞,已是汗流浹背蛇尚。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顾画,地道東北人取劫。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像研侣,于是被迫代替她去往敵國和親谱邪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容