淺聊一下Vue2中的functional組件
前言
最近組內(nèi)有一個(gè)分享提到了 Vue2 的 functional 組件,大致上是說這個(gè)東西沒有生命周期,在渲染層面上,會(huì)減少很多的消耗,一番處理之后,首屏?xí)r間和內(nèi)存都能減少不少。
由此,我打算來好好學(xué)一下挖一下這個(gè)知識(shí)點(diǎn)。
functional 組件是什么?
Vue.js 中的 functional 函數(shù)化組件是一種特殊類型的無(wú)狀態(tài)組件,它不依賴于內(nèi)部狀態(tài),只依賴于傳入的 props。這種組件沒有實(shí)例,也就是說它們沒有 this 上下文。函數(shù)化組件的主要特點(diǎn)如下:
- 無(wú)狀態(tài):函數(shù)化組件不包含響應(yīng)式數(shù)據(jù)或內(nèi)部狀態(tài),它們只依賴于傳入的 props。
- 無(wú)實(shí)例:函數(shù)化組件沒有實(shí)例,因此沒有
this上下文。 - 更高的性能:由于沒有實(shí)例和響應(yīng)式數(shù)據(jù),函數(shù)化組件的渲染性能更高,適用于頻繁更新的場(chǎng)景。
- 簡(jiǎn)潔的定義:函數(shù)化組件使用
render函數(shù)定義,不需要完整的 Vue 組件選項(xiàng)對(duì)象。
函數(shù)化組件的定義示例:
Vue.component('my-functional-component', {
functional: true,
props: {
message: {
type: String,
required: true
}
},
render: function (createElement, context) {
return createElement('div', context.props.message);
}
});functional函數(shù)化組件做比對(duì)是深度比對(duì),會(huì)對(duì)對(duì)象深入的做對(duì)比,不是淺比較:
如果 props 對(duì)象外部不變,但內(nèi)部的參數(shù)發(fā)生變化,函數(shù)化組件會(huì)重新渲染。因?yàn)楹瘮?shù)化組件是無(wú)狀態(tài)的,它們只依賴于傳入的 props。當(dāng) props 的內(nèi)部參數(shù)發(fā)生變化時(shí),Vue 會(huì)檢測(cè)到這些變化并重新渲染函數(shù)化組件。
Vue.component('my-functional-component', {
functional: true,
props: {
userInfo: {
type: Object,
required: true
}
},
render: function (createElement, context) {
return createElement('div', context.props.userInfo.name);
}
});特點(diǎn)
1.functional 函數(shù)化組件本身無(wú) watch/computed,這就導(dǎo)致我們不能像在普通 Vue 組件中那樣使用 watch 或 computed 屬性來監(jiān)聽參數(shù)變化。因?yàn)楹瘮?shù)化組件沒有實(shí)例和響應(yīng)式數(shù)據(jù),它們只依賴于傳入的 props。當(dāng) props 發(fā)生變化時(shí),函數(shù)化組件會(huì)自動(dòng)重新渲染。
如果我們想要監(jiān)聽怎么辦?
比較可行的辦法是:在父組件中監(jiān)聽 props 變化,并在適當(dāng)?shù)臅r(shí)機(jī)傳遞新的 props 給函數(shù)化組件。這樣,函數(shù)化組件會(huì)在接收到新的 props 時(shí)自動(dòng)重新渲染。
2.functional 函數(shù)化組件本身無(wú)實(shí)例,這會(huì)導(dǎo)致如下后果:
- 在函數(shù)化組件中,無(wú)法使用
this訪問組件實(shí)例,因?yàn)樗鼈儧]有實(shí)例。 - 由于沒有實(shí)例,函數(shù)化組件無(wú)法使用 Vue 實(shí)例的方法和屬性,例如
$emit、$watch、$refs等。 - 函數(shù)化組件沒有實(shí)例,因此無(wú)法使用生命周期鉤子函數(shù),如
created、mounted、updated等。 - 函數(shù)化組件沒有響應(yīng)式數(shù)據(jù)和內(nèi)部狀態(tài),它們只依賴于傳入的 props。這意味著我們無(wú)法在函數(shù)化組件中使用
data、computed和watch等選項(xiàng)。 - 在函數(shù)化組件中,我們需要通過
context對(duì)象訪問插槽(slots)和作用域插槽(scoped slots),而不是使用this.$slots和this.$scopedSlots。
使用如下:
Vue.component('my-functional-component', {
functional: true,
props: {
message: {
type: String,
required: true
}
},
render: function (createElement, context) {
// 訪問 props
const message = context.props.message;
// 訪問插槽
const slots = context.slots();
const defaultSlot = slots.default;
// 訪問作用域插槽
const scopedSlots = context.scopedSlots;
const customSlot = scopedSlots.customSlot;
// 訪問事件監(jiān)聽器
const listeners = context.listeners;
const clickListener = listeners.click;
});到此這篇關(guān)于淺聊一下Vue2中的functional組件的文章就介紹到這了,更多相關(guān)Vue2 functional組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue純前端使用exceljs導(dǎo)出excel文件的完整圖文教程
這篇文章將一步一步為大家詳細(xì)介紹一下exceljs插件中的使用,以及如何使用exceljs導(dǎo)出excel文件,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
Vue使用screenfull實(shí)現(xiàn)全屏效果
這篇文章主要為大家詳細(xì)介紹了Vue使用screenfull實(shí)現(xiàn)全屏,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
vue.js+elementUI實(shí)現(xiàn)點(diǎn)擊左右箭頭切換頭像功能(類似輪播圖效果)
這篇文章主要介紹了vue.js+elementUI實(shí)現(xiàn)點(diǎn)擊左右箭頭切換頭像功能(類似輪播圖),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
vue.js中關(guān)于點(diǎn)擊事件方法的使用(click)
這篇文章主要介紹了vue.js中關(guān)于點(diǎn)擊事件方法的使用(click),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
vue實(shí)現(xiàn)短信驗(yàn)證碼登錄功能(流程詳解)
無(wú)論是移動(dòng)端還是pc端登錄或者注冊(cè)界面都會(huì)見到手機(jī)驗(yàn)證碼登錄這個(gè)功能,輸入手機(jī)號(hào),得到驗(yàn)證碼,這篇文章主要介紹了基于vue實(shí)現(xiàn)短信驗(yàn)證碼登錄功能,需要的朋友可以參考下2019-12-12
關(guān)于vue3.0中的this.$router.replace({ path: ''/''})刷新無(wú)效果問題
這篇文章主要介紹了關(guān)于vue3.0中的this.$router.replace({ path: '/'})刷新無(wú)效果問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
關(guān)于vue v-for循環(huán)解決img標(biāo)簽的src動(dòng)態(tài)綁定問題
今天小編就為大家分享一篇關(guān)于vue v-for循環(huán)解決img標(biāo)簽的src動(dòng)態(tài)綁定問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09

