學習JSX,先了解一下createElement
提到JSX,不可避免的就要提到createElement,當你看完本節,你會發現,奇怪的知識又增多了,ok,我們接著上一部分繼續講,這一次的準備作業是了解createElement,
從Vue編譯后的代碼看createElement
你是否看過寫的Vue代碼經過編譯之后的樣子,比如下面這段代碼
<template> <div>我喜歡<span >前端</span></div> </template>
小編對這段代碼進行編譯之后,得到下面這段代碼
function () { var e = this, // e._self._c 對應原始碼里面的createElement t = e._self._c; // 回傳了一個 createElement('div',[]) return t("div", [ // e._v 對應原始碼里面的createTextVNode e._v("my"), t("span", { staticClass: "emphasize" }, [e._v("前端")]), ]); }
通過對上面的代碼進行分析,不難發現,Vue模板中的每一個元素編譯之后都會對應一個createElement,那么這個createElement到底是什么,嗯,這個你面試的時候也許已經提到過了,
那么什么是createElement
無論是Vue還是React,都存在createElement,而且作用基本一致,可能你對createElement不是很了解,函式名翻譯過來就是增加一個元素,但他的回傳值你一定知道,createElement函式回傳的值稱之為虛擬節點,即VNode,而由VNode扎堆組成的樹便是大名鼎鼎,面試必問的虛擬DOM,
createElement函式的引數,在這里小編偷個懶抄一下Vue官方檔案
// @returns {VNode} createElement( // {String | Object | Function} // 一個 HTML 標簽名、組件選項物件,或者 // resolve 了上述任何一種的一個 async 函式,必填項, 'div', ? // {Object} // 一個與模板中 attribute 對應的資料物件,可選, { // (詳情見下一節) }, ? // {String | Array} // 子級虛擬節點 (VNodes),由 `createElement()` 構建而成, // 也可以使用字串來生成“文本虛擬節點”,可選, [ '先寫一些文字', createElement('h1', '一則頭條'), createElement(MyComponent, { props: { someProp: 'foobar' } }) ] )
從上面可以看出createElement一共有三個引數,三個引數分別是
-
第一個引數是需要渲染的組件,可以是組件的標簽,比如
div;或者是一個組件物件,也就是你天天寫的export default {};亦或者可以是一個異步函式, -
第二個引數是這個組件的屬性,是一個物件,如果組件沒有引數,可以傳null(關于組件的屬性,下文將依次介紹)
-
第三個引數是這個組件的子組件,可以是一個字串(textContent)或者一個由VNodes組成的陣列
用createElement寫一個組件吧
表單示例
假設我們需要開發一個下面這樣的表格(element-ui的)

用模板代碼去開發
如果我們用模板代碼去開發這個表單,那么代碼大概就長這樣
<el-form :inline="true" :model="formInline" >
<el-form-item label="審批人">
<el-input v-model="formInline.user" placeholder="審批人"></el-input>
</el-form-item>
<el-form-item label="活動區域">
<el-select v-model="formInline.region" placeholder="活動區域">
<el-option label="區域一" value="https://www.cnblogs.com/coderhf/p/shanghai"></el-option>
<el-option label="區域二" value="https://www.cnblogs.com/coderhf/p/beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查詢</el-button>
</el-form-item>
</el-form>
用createElement去實作
如果我們直接將上面的代碼轉換為用createElement去實作,那么代碼將會是這樣的
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: '活動區域' } }, [ createElement( 'ElSelect', { props: { value: this.formInline.region, placeholder: '活動區域' } }, [ createElement('ElOption', { props: { label: '區域一', value: 'shanghai' } }), createElement('ElOption', { props: { label: '區域二', value: 'beijing' } }) ] ) ] ), createElement('ElFormItem', null, [ createElement( 'ElButton', { props: { type: 'primary' }, on: { click: this.$_handleSubmit } }, '查詢' ) ]) ] ) } }
看到上面的代碼,你可能會驚呼,代碼好多啊,好痛苦,想當年發明JSX的人剛開始天天也是寫createElement,寫的直掉頭發,太痛苦了,然后就使勁撓頭,當額頭锃光發亮的時候,終于想到了一種新的語法,就是JSX,從此之后,頭發呼呼的又長回來了,
看到上面代碼,你會發現有一個render函式,這個函式叫做渲染函式,相當于通過createElement或JSX去實作功能的主入口方法,而且你熟悉的v-model也沒見了,而是用value + input代替了,
ok,這一部分先寫到這里,下一篇文章寫下一部分:是時候使用JSX代替createElement了,喜歡的朋友可以繼續看哦,我更新非常快哦,也會一直出優秀的文章給大家分享,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/45614.html
標籤:JavaScript
上一篇:JavaScript圖形實體:像雪花一樣的Hexaflake分形
下一篇:6.使用定位,制作彈出框界面
