React源碼解析之React.createElement()

在第一次學習react的時候,我們總會帶著許多疑問玄柠。比如我們看到下面的代碼就會想:為什么我們只是引入了React,但是并沒有明顯的看到我們在其他地方用,這時我們就會想著既然沒有用到,那如果刪除之后會不會受到影響呢?答案當然是不行的堪藐。

import React from 'react';
import ReactDOM from 'react-dom';

let element = (
    <h1 id="title" className="bg" style={{color: 'red'}}>
        hello
        <span>world</span>
    </h1>
)

console.log({type: element.type, props:element.props})

ReactDOM.render(element,document.getElementById('root'));

當我們帶著這個問題去研究的時候會發(fā)現其實在渲染element的時候調了React.createElement(),所以上面的問題就在這里找到了答案挑围。

那么React.createElement()到底干了些什么事情呢庶橱?

  1. 我們看一看下面的代碼
<h1 id="title" className="bg" style={{color: 'red'}}>
        hello
        <span>world</span>
</h1>

//上面的這段代碼很簡單,但是我們都知道react是所謂的虛擬dom,當然不可能就是我們看到的這樣贪惹。當我們將上面的代碼經過babel轉譯后,我們再看看

React.createElement("h1", {
  id: "title",
  className: "bg",
  style: {
    color: 'red'
  }
}, "hello", React.createElement("span", null, "world"));

  1. 那到底React.createElement干了些什么呢寂嘉?
//方法接受三個參數奏瞬,第一個參數是組件類型枫绅,第二個參數是要傳遞給組件的屬性,第三個參數是children硼端。方法最終會返回一個具有以下屬性的對象

function createElement(type,config,children){
    let propName;
    const props = {};
    for(propName in config){
        props[propName] = config[propName]
    }
    const childrenLength = arguments.length - 2;   //減掉type config  看看后面還有幾個兒子
    if(childrenLength === 1){
        props.children = children;
    }else if(childrenLength > 1){  //如果說兒子的數量大于1的話并淋,props.children就是一個數組
        props.children = Array.from(arguments).slice(2)
    }
    return {type,props}
}

export default {
    createElement
}


/**
React.createElement("h1", {
  id: "title",
  className: "bg",
  style: {
    color: 'red'
  }
}, "hello", React.createElement("span", null, "world"));
 */

最后我們看到React通過createElement方法將組件或者元素轉成ReactElement,并最終通過一系列操作渲染到頁面成為HTMLElement珍昨。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末县耽,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子镣典,更是在濱河造成了極大的恐慌兔毙,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄春,死亡現場離奇詭異澎剥,居然都是意外死亡,警方通過查閱死者的電腦和手機赶舆,發(fā)現死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門哑姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芜茵,你說我怎么就攤上這事叙量。” “怎么了九串?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵绞佩,是天一觀的道長。 經常有香客問我蒸辆,道長征炼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任躬贡,我火速辦了婚禮谆奥,結果婚禮上,老公的妹妹穿的比我還像新娘拂玻。我一直安慰自己酸些,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布檐蚜。 她就那樣靜靜地躺著魄懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闯第。 梳的紋絲不亂的頭發(fā)上市栗,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼填帽。 笑死蛛淋,一個胖子當著我的面吹牛,可吹牛的內容都是我干的篡腌。 我是一名探鬼主播褐荷,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘹悼!你這毒婦竟也來了叛甫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤杨伙,失蹤者是張志新(化名)和其女友劉穎其监,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體缀台,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡棠赛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了膛腐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛约。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哲身,靈堂內的尸體忽然破棺而出辩涝,到底是詐尸還是另有隱情,我是刑警寧澤勘天,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布怔揩,位于F島的核電站,受9級特大地震影響脯丝,放射性物質發(fā)生泄漏商膊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一宠进、第九天 我趴在偏房一處隱蔽的房頂上張望晕拆。 院中可真熱鬧,春花似錦材蹬、人聲如沸实幕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆庇。三九已至,卻和暖如春闸溃,著一層夾襖步出監(jiān)牢的瞬間整吆,已是汗流浹背拱撵。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掂为,地道東北人裕膀。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像勇哗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寸齐,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容