Vue.js 2函數(shù)式組件學習

什么是函數(shù)式組件傍衡?

函數(shù)式組件就是函數(shù)是組件,組件是函數(shù)负蠕,它的特征是沒有內(nèi)部狀態(tài)聪舒、沒有生命周期鉤子函數(shù)、沒有this(不需要實例化的組件)虐急。

在日常開發(fā)中箱残,我們經(jīng)常會開發(fā)一些純展示性的業(yè)務組件,比如一些詳情頁面,列表界面等被辑,它們有一個共同的特點是:

  • 只要你傳入數(shù)據(jù)燎悍,我就進行展現(xiàn)。

  • 不需要有內(nèi)部狀態(tài)盼理,不需要在生命周期鉤子函數(shù)里面做處理谈山。

這時候你就可以用函數(shù)式組件。

本文只以2.6版本為例說明宏怔。

官方文檔

https://cn.vuejs.org/v2/guide/render-function.html#函數(shù)式組件

官方手冊寫的跟屎一樣奏路。網(wǎng)上的大部分相關(guān)教程只是把手冊抄一遍,也跟屎一樣臊诊。所以我要寫下這篇鸽粉。

為什么要用它

  • 函數(shù)式組件不需要實例化,無狀態(tài)抓艳,沒有生命周期触机,所以渲染性能要好于普通組件

  • 函數(shù)式組件結(jié)構(gòu)更簡單,代碼結(jié)構(gòu)更清晰

函數(shù)式組件與普通組件的區(qū)別

  1. 函數(shù)式組件需要在聲明組件是指定functional玷或。

  2. 函數(shù)式組件不需要實例化儡首,所以沒有thisthis通過render函數(shù)的第二個參數(shù)來代替偏友。

  3. 函數(shù)式組件沒有生命周期鉤子函數(shù)蔬胯,不能使用計算屬性,watch等等位他。

  4. 函數(shù)式組件不能通過$emit對外暴露事件笔宿,調(diào)用事件只能通過context.listeners.click的方式調(diào)用外部傳入的事件。

  5. 因為函數(shù)式組件是沒有實例化的棱诱,所以在外部通過ref去引用組件時,實際引用的是HTMLElement涝动。

  6. 函數(shù)式組件的props可以只聲明一部分或者全都不聲明迈勋,所有沒有在props里面聲明的屬性都會被自動隱式解析為prop,而普通組件所有未聲明的屬性都被解析到$attrs里面醋粟,并自動掛載到組件根元素上面(可以通過inheritAttrs屬性禁止)靡菇。

使用場景

上面已經(jīng)反復強調(diào),凡是不需要實例化米愿,無狀態(tài)厦凤,沒有生命周期的組件,除了props之外沒有別的配置項育苟,都可以改寫成函數(shù)式組件较鼓。

函數(shù)式組件寫法一:模板語法寫法

父組件:

<template>
  <div>
    <func text="aaaaaaaa" />
  </div>
</template>
<script>
import func from '@/components/func.vue';
export default {
  components: {
    func
  }
};
</script>

func.vue:

<template functional>
  <p>{{props.text ? props.text : '哈哈'}}</p>
</template>

注意,沒有<script>...</script>部分。是不是很簡單博烂?

函數(shù)式組件寫法二:JSX寫法

<script>
export default {
  functional: true,
  props: {
    text: {
      type: String
    }
  },
  /**
   * 渲染函數(shù)
   * @param {*} h
   * @param {*} context 函數(shù)式組件沒有this, props, slots等都在context上面掛著
   */
  render(h, context) {
    console.log(context);
    const { props } = context
    if (props.text) {
      return <p>{props.text}</p>
    }
    return <p>哈哈嗝</p>
  }
}
</script>

注意事項:

  1. 無需寫<template functional>...</template>部分香椎,直接缺省。

  2. render函數(shù)中遵守JSX寫法禽篱,<p>{props.text}</p>畜伐、<p>哈哈嗝</p>是JS一樣的短路關(guān)系,不是代碼疊加關(guān)系躺率。

  3. 不要給<p>{props.text}</p>玛界、<p>哈哈嗝</p>加引號!

由于函數(shù)式組件沒有this悼吱,所以props慎框、slots等都在context上面掛著,可以打印一下context看看舆绎。

JSX需要另外的學習成本鲤脏,如果你愿意的話可以搜索相關(guān)資料學習一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吕朵,一起剝皮案震驚了整個濱河市猎醇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌努溃,老刑警劉巖硫嘶,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梧税,居然都是意外死亡沦疾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門第队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哮塞,“玉大人,你說我怎么就攤上這事凳谦∫涑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵尸执,是天一觀的道長家凯。 經(jīng)常有香客問我,道長如失,這世上最難降的妖魔是什么绊诲? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮褪贵,結(jié)果婚禮上掂之,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好板惑,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布橄镜。 她就那樣靜靜地躺著,像睡著了一般冯乘。 火紅的嫁衣襯著肌膚如雪洽胶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天裆馒,我揣著相機與錄音姊氓,去河邊找鬼。 笑死喷好,一個胖子當著我的面吹牛翔横,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梗搅,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼禾唁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了无切?” 一聲冷哼從身側(cè)響起荡短,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哆键,沒想到半個月后掘托,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡籍嘹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年闪盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辱士。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泪掀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颂碘,到底是詐尸還是另有隱情异赫,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布凭涂,位于F島的核電站,受9級特大地震影響贴妻,放射性物質(zhì)發(fā)生泄漏切油。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一名惩、第九天 我趴在偏房一處隱蔽的房頂上張望澎胡。 院中可真熱鬧,春花似錦、人聲如沸攻谁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戚宦。三九已至个曙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間受楼,已是汗流浹背垦搬。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艳汽,地道東北人猴贰。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像河狐,于是被迫代替她去往敵國和親米绕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353