你有沒有用過Vue.js的渲染函數(shù)和JSX?

前言

真的拜轨,一定會有一些小伙伴直到完整了幾個項目都做完了抽减,卻從未用過渲染函數(shù)和JSX,所以一旦遇到需要復(fù)雜處理的模板元素橄碾,其中就會夾雜大量的v-if卵沉、v-elsev-else-if……以及各種三元操作符法牲。是時候了解一下渲染函數(shù)和JSX了史汗,即便Vue 3在幾個月后就要問世,學(xué)習(xí)一下JSX絕對沒有壞處拒垃,也不會過時停撞,JSX是React一直推崇的描述模板的方法,算是業(yè)界通用的一項技術(shù)悼瓮。

官網(wǎng)

https://cn.vuejs.org/v2/guide/render-function.html

為什么有官網(wǎng)介紹戈毒,還要來個教程

官網(wǎng)教程是基于運行時版本的Vue.js,按照全局組件的模式為例横堡,而我們通常是使用完整版的Vue.js埋市,且使用單文件組件,所以本文以單文件組件為例說明命贴。

渲染函數(shù)和JSX適用場景

當(dāng)你模板中存在大量條件判斷時道宅,就適用渲染函數(shù)和JSX。比如在class中胸蛛、style中污茵、文本中、屬性中存在條件判斷時葬项,會將模板搞得很冗長泞当,而且不容易閱讀,這時候適用渲染函數(shù)和JSX會讓代碼變得很清晰玷室。

Hello World

  1. 在components文件夾創(chuàng)建HelloWorld.vue零蓉,內(nèi)容是:
export default {
  props: {
    msg: {
      type: String,
      default: ""
    },
    type: {
      type: String,
      default: ""
    }
  },
  render(createElement) {
    return createElement("button", {
      class: {
        btn: true,
        success: this.type === "success",
        danger: this.type === "danger"
      },
      domProps: {
        innerText: this.msg || "默認(rèn)"
      },
      on: {
        click: this.handleClick
      }
    });
  },
  methods: {
    handleClick() {
      console.log(11);
    }
  }
};
<style scoped lang="scss">
.success {
  color: green;
}
.danger {
  color: red;
}
</style>
  1. 父組件按照常規(guī)的子組件調(diào)用方法調(diào)用即可:
<hello-world type="success" msg="abc">xyz</hello-world>

JS代碼從略。

  1. 效果是渲染出一段DOM:<button data-v-469af010="" class="btn success">abc</button>穷缤。

  2. 講一下HelloWorld.vue敌蜂。其中props和methods不解釋,只說render津肛。render負(fù)責(zé)渲染一段DOM章喉,前提是要給它傳入VDOM,而createElement就是負(fù)責(zé)構(gòu)建VDOM,我們只需要關(guān)心createElement的參數(shù)就行了秸脱。這里官網(wǎng)都有介紹落包,簡單說:

    第一個參數(shù)負(fù)責(zé)聲明頂級元素的標(biāo)簽名,也就是說摊唇,標(biāo)簽名到底是button還是div還是h2還是span還是其他什么咐蝇。

    第二個參數(shù)就是對頂級元素的所有修飾,官網(wǎng)都有解釋巷查,這里只列一下:

    • class
    • style
    • attrs
    • props
    • domProps
    • on
    • nativeOn
    • directives
    • scopedSlots
    • slot
    • key
    • ref
    • refInFor

    第三個參數(shù)是可選的有序,是一個數(shù)組,每一個數(shù)組元素也就是一個子元素岛请,如果是文本旭寿,直接寫字符串,如果是元素崇败,就要繼續(xù)寫create('標(biāo)簽名', {修飾對象})盅称,這樣一層一層寫下去。從實踐說后室,如果層數(shù)太多缩膝,反而不如單文件的<template>標(biāo)簽直觀,所以盡量保持2層即可咧擂。

循環(huán)創(chuàng)建元素

使用v-for可以在模板中循環(huán)創(chuàng)建元素逞盆,在createElement里當(dāng)然也可以。

官方舉了一個例子松申,但實踐中一般用不到,因為實踐中往往將一個數(shù)組映射成一系列元素:

官網(wǎng)例子:

render: function (createElement) {
  return createElement('div',
    Array.apply(null, { length: 20 }).map(function () {
      return createElement('p', 'hi')
    })
  )
}

更貼近實踐的例子俯逾,dataList靠父組件傳入贸桶,然后利用map返回一系列相似的子元素:

render: function (createElement) {
  return createElement('div',
    this.dataList.map(function () {
      return createElement('p', {
        // ...
      })
    })
  )
}

如何對應(yīng)<template>里的v-for/v-model/v-if/v-else指令

如何對應(yīng)v-for上面已經(jīng)說了,就用map就可以了桌肴。

如何對應(yīng)v-model略復(fù)雜皇筛,官網(wǎng)有專門介紹,不說了坠七。

v-if這類條件指令水醋,用JS的原生if...else...即可。這里不介紹用法彪置,但是強調(diào)一點拄踪,這就是渲染函數(shù)最有優(yōu)勢的地方。比如拳魁,一套條件語句如下所示惶桐,想象一下,如果將這套判斷邏輯實現(xiàn)到<template>標(biāo)簽里,會是多么的恐怖姚糊,多么難以理解贿衍,某個else是哪個if的else?看的眼花救恨。而在JS中贸辈,if...else...就會直觀得多。

if () {
  if () {
    if () {
    }
  } else {
  }
} else {
}

事件和插槽

很容易肠槽,閱讀官網(wǎng)即可裙椭。

JSX

終于到JSX了,官網(wǎng)的介紹比較簡單署浩。JSX說白了就是將<template>里的標(biāo)簽直接寫到JS里揉燃,這本身在JS里是行不通的,只能依靠插件來編譯筋栋。比如官方的示例:

  render: function (h) {
    return (
      <AnchoredHeading level={1}>
        <span>Hello</span> world!
      </AnchoredHeading>
    )
  }

在JS里用括號包裹一段像DOM的東西炊汤,而且還不是字符串,這在JS里是絕對行不通的弊攘,因此想用JSX就必須用插件編譯成正常的模板抢腐,https://github.com/vuejs/jsx有介紹。

注意幾點:

  1. JSX的一個原則是從簡襟交、小片段原則迈倍,所以不要將計算過程寫入JSX中,如果寫入的話捣域,又跟<template>一樣了啼染,比如你要計算class的值,你需要在return之前焕梅,先聲明一個變量比如叫classVal迹鹅,然后通過一系列的JS運算算出classVal的值,然后JSX里面只能寫上像上文那樣比較簡單的內(nèi)容贞言,比如<button class={classVal}></button>斜棚。

  2. JSX默認(rèn)不支持v-if等v-*指令,只支持非常少的幾個指令该窗,需要再額外裝插件來彌補弟蚀。

  3. JSX支持三元操作符,在{}里使用即可酗失。

總之义钉,vue沒有主打JSX,而且JSX本身也比較弱级零,至少在Vue 2.0里断医,不是良藥滞乙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鉴嗤,隨后出現(xiàn)的幾起案子斩启,更是在濱河造成了極大的恐慌,老刑警劉巖醉锅,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔簇,死亡現(xiàn)場離奇詭異,居然都是意外死亡硬耍,警方通過查閱死者的電腦和手機垄琐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來经柴,“玉大人狸窘,你說我怎么就攤上這事∨魅希” “怎么了翻擒?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牛哺。 經(jīng)常有香客問我陋气,道長,這世上最難降的妖魔是什么引润? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任巩趁,我火速辦了婚禮,結(jié)果婚禮上淳附,老公的妹妹穿的比我還像新娘议慰。我一直安慰自己,他們只是感情好燃观,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布褒脯。 她就那樣靜靜地躺著,像睡著了一般缆毁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上到涂,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天脊框,我揣著相機與錄音,去河邊找鬼践啄。 笑死浇雹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屿讽。 我是一名探鬼主播昭灵,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吠裆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烂完?” 一聲冷哼從身側(cè)響起试疙,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抠蚣,沒想到半個月后祝旷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嘶窄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年怀跛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柄冲。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吻谋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出现横,到底是詐尸還是另有隱情漓拾,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布长赞,位于F島的核電站晦攒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏得哆。R本人自食惡果不足惜脯颜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贩据。 院中可真熱鬧栋操,春花似錦、人聲如沸饱亮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽近上。三九已至剔宪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壹无,已是汗流浹背葱绒。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斗锭,地道東北人地淀。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像岖是,于是被迫代替她去往敵國和親帮毁。 傳聞我的和親對象是個殘疾皇子实苞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • 遇到南墻有的人迷途知返,有的人卻固步自封不知悔改烈疚,不是所有人都有義務(wù)施舍給你同情黔牵,該自己走的路還是得自己走。解鈴還...
    SEVEN_24閱讀 419評論 0 2
  • 從我受教育以來胞得,我的角色一直是不溫不火荧止,態(tài)度認(rèn)真,資質(zhì)平庸阶剑,學(xué)業(yè)中上的學(xué)生跃巡。我從來沒有質(zhì)疑過我所受的教育,也沒有質(zhì)...
    活動策劃女青年閱讀 585評論 0 6
  • 如何獲得新時代的幸福牧愁? 所謂新幸福素邪,就是擺脫金錢、時間猪半、場所等外物的束縛兔朦,讓我們重新?lián)碛凶杂伞?1.從“厲行節(jié)約”...
    牛奶tiger閱讀 175評論 0 0
  • 畢業(yè)答辯的deadline臨近,大家的答辯幻燈片做的怎樣了磨确? 相信大家制作幻燈片的第一步是找到一個自己喜歡的模版沽甥,...
    曹奇_edfa閱讀 905評論 0 1