學(xué)會vue JSX(二)

<template>

? <div>我喜歡<span class="emphasize">前端</span></div>

</template>

小編對這段代碼進行編譯之后蔼囊,得到下面這段代碼

復(fù)制代碼

function () {

? var e = this,

? // e._self._c 對應(yīng)源碼里面的createElement

? t = e._self._c;

? // 返回了一個 createElement('div',[])

? return t("div", [

? ? // e._v 對應(yīng)源碼里面的createTextVNode

? ? e._v("my"),

? ? t("span", { staticClass: "emphasize" }, [e._v("前端")]),

? ]);

}

復(fù)制代碼

通過對上面的代碼進行分析恨闪,不難發(fā)現(xiàn)雁竞,Vue模板中的每一個元素編譯之后都會對應(yīng)一個createElement,那么這個createElement到底是什么柠衅,嗯成翩,這個你面試的時候也許已經(jīng)提到過了败去。

那么什么是createElement

無論是Vue還是React暴构,都存在createElement,而且作用基本一致览爵≈帽牵可能你對createElement不是很了解,函數(shù)名翻譯過來就是增加一個元素蜓竹,但他的返回值你一定知道箕母。createElement函數(shù)返回的值稱之為虛擬節(jié)點,即VNode俱济,而由VNode扎堆組成的樹便是大名鼎鼎嘶是,面試必問的虛擬DOM。

createElement函數(shù)的參數(shù)蛛碌,在這里小編偷個懶抄一下Vue官方文檔

復(fù)制代碼

// @returns {VNode}

createElement(

? // {String | Object | Function}

? // 一個 HTML 標(biāo)簽名聂喇、組件選項對象,或者

? // resolve 了上述任何一種的一個 async 函數(shù)蔚携。必填項授帕。

? 'div',

?

? // {Object}

? // 一個與模板中 attribute 對應(yīng)的數(shù)據(jù)對象「∩遥可選跛十。

? {

? ? // (詳情見下一節(jié))

? },

?

? // {String | Array}

? // 子級虛擬節(jié)點 (VNodes),由 `createElement()` 構(gòu)建而成秕硝,

? // 也可以使用字符串來生成“文本虛擬節(jié)點”芥映。可選远豺。

? [

? ? '先寫一些文字',

? ? createElement('h1', '一則頭條'),

? ? createElement(MyComponent, {

? ? ? props: {

? ? ? ? someProp: 'foobar'

? ? ? }

? ? })

? ]

)

復(fù)制代碼

從上面可以看出createElement一共有三個參數(shù)奈偏,三個參數(shù)分別是

第一個參數(shù)是需要渲染的組件,可以是組件的標(biāo)簽躯护,比如div惊来;或者是一個組件對象,也就是你天天寫的export default {}棺滞;亦或者可以是一個異步函數(shù)裁蚁。

第二個參數(shù)是這個組件的屬性,是一個對象继准,如果組件沒有參數(shù)枉证,可以傳null(關(guān)于組件的屬性,下文將依次介紹)

第三個參數(shù)是這個組件的子組件移必,可以是一個字符串(textContent)或者一個由VNodes組成的數(shù)組

用createElement寫一個組件吧

表單示例

假設(shè)我們需要開發(fā)一個下面這樣的表格(element-ui的)

img

用模板代碼去開發(fā)

如果我們用模板代碼去開發(fā)這個表單室谚,那么代碼大概就長這樣

復(fù)制代碼

<el-form :inline="true" :model="formInline" class="demo-form-inline">

? <el-form-item label="審批人">

? ? <el-input v-model="formInline.user" placeholder="審批人"></el-input>

? </el-form-item>

? <el-form-item label="活動區(qū)域">

? ? <el-select v-model="formInline.region" placeholder="活動區(qū)域">

? ? ? <el-option label="區(qū)域一" value="shanghai"></el-option>

? ? ? <el-option label="區(qū)域二" value="beijing"></el-option>

? ? </el-select>

? </el-form-item>

? <el-form-item>

? ? <el-button type="primary" @click="onSubmit">查詢</el-button>

? </el-form-item>

</el-form>

復(fù)制代碼

用createElement去實現(xiàn)

如果我們直接將上面的代碼轉(zhuǎn)換為用createElement去實現(xiàn),那么代碼將會是這樣的

復(fù)制代碼

export default {

? methods: {

? ? $_handleChangeUser(value) {

? ? ? this.formInline.user = value

? ? }

? },

? render(createElement) {

? ? return createElement(

? ? ? 'ElForm',

? ? ? {

? ? ? ? props: {

? ? ? ? ? inline: true,

? ? ? ? ? model: this.formInline

? ? ? ? },

? ? ? ? staticClass: 'demo-form-inline'

? ? ? },

? ? ? [

? ? ? ? createElement(

? ? ? ? ? 'ElFormItem',

? ? ? ? ? {

? ? ? ? ? ? props: {

? ? ? ? ? ? ? label: '審批人'

? ? ? ? ? ? }

? ? ? ? ? },

? ? ? ? ? [

? ? ? ? ? ? createElement('ElInput', {

? ? ? ? ? ? ? props: {

? ? ? ? ? ? ? ? value: this.formInline.user

? ? ? ? ? ? ? },

? ? ? ? ? ? ? attrs: {

? ? ? ? ? ? ? ? placeholder: '審批人'

? ? ? ? ? ? ? },

? ? ? ? ? ? ? on: {

? ? ? ? ? ? ? ? input: this.$_handleChangeUser

? ? ? ? ? ? ? }

? ? ? ? ? ? })

? ? ? ? ? ]

? ? ? ? ),

? ? ? ? createElement(

? ? ? ? ? 'ElFormItem',

? ? ? ? ? {

? ? ? ? ? ? props: {

? ? ? ? ? ? ? label: '活動區(qū)域'

? ? ? ? ? ? }

? ? ? ? ? },

? ? ? ? ? [

? ? ? ? ? ? createElement(

? ? ? ? ? ? ? 'ElSelect',

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? props: {

? ? ? ? ? ? ? ? ? value: this.formInline.region,

? ? ? ? ? ? ? ? ? placeholder: '活動區(qū)域'

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? },

? ? ? ? ? ? ? [

? ? ? ? ? ? ? ? createElement('ElOption', {

? ? ? ? ? ? ? ? ? props: {

? ? ? ? ? ? ? ? ? ? label: '區(qū)域一',

? ? ? ? ? ? ? ? ? ? value: 'shanghai'

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }),

? ? ? ? ? ? ? ? createElement('ElOption', {

? ? ? ? ? ? ? ? ? props: {

? ? ? ? ? ? ? ? ? ? label: '區(qū)域二',

? ? ? ? ? ? ? ? ? ? value: 'beijing'

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ]

? ? ? ? ? ? )

? ? ? ? ? ]

? ? ? ? ),

? ? ? ? createElement('ElFormItem', null, [

? ? ? ? ? createElement(

? ? ? ? ? ? 'ElButton',

? ? ? ? ? ? {

? ? ? ? ? ? ? props: {

? ? ? ? ? ? ? ? type: 'primary'

? ? ? ? ? ? ? },

? ? ? ? ? ? ? on: {

? ? ? ? ? ? ? ? click: this.$_handleSubmit

? ? ? ? ? ? ? }

? ? ? ? ? ? },

? ? ? ? ? ? '查詢'

? ? ? ? ? )

? ? ? ? ])

? ? ? ]

? ? )

? }

}

復(fù)制代碼

深圳網(wǎng)站建設(shè)www.sz886.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秒赤,隨后出現(xiàn)的幾起案子猪瞬,更是在濱河造成了極大的恐慌,老刑警劉巖入篮,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陈瘦,死亡現(xiàn)場離奇詭異,居然都是意外死亡崎弃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門含潘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饲做,“玉大人,你說我怎么就攤上這事遏弱∨杈” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵漱逸,是天一觀的道長泪姨。 經(jīng)常有香客問我,道長饰抒,這世上最難降的妖魔是什么肮砾? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮袋坑,結(jié)果婚禮上仗处,老公的妹妹穿的比我還像新娘。我一直安慰自己枣宫,他們只是感情好婆誓,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著也颤,像睡著了一般洋幻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翅娶,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天文留,我揣著相機與錄音,去河邊找鬼竭沫。 笑死厂庇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的输吏。 我是一名探鬼主播权旷,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拄氯?” 一聲冷哼從身側(cè)響起躲查,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎译柏,沒想到半個月后镣煮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年珊泳,在試婚紗的時候發(fā)現(xiàn)自己被綠了捶闸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡介衔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骂因,到底是詐尸還是另有隱情炎咖,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布寒波,位于F島的核電站乘盼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俄烁。R本人自食惡果不足惜绸栅,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望页屠。 院中可真熱鬧阴幌,春花似錦、人聲如沸卷中。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟆豫。三九已至议忽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間十减,已是汗流浹背栈幸。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帮辟,地道東北人速址。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像由驹,于是被迫代替她去往敵國和親芍锚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359