React Component流济、Element锐锣、Instance

首先一句話概括區(qū)別:

  • React Element就是一個Virtual DOM

    • Virtual DOM 是一個JS對象
  • React Component其實(shí)就是一個Class或者一個function (一個定義)

  • React Component render方法以及stateless函數(shù)的返回值就是一個React Element。

React 組件(Component)

React通過組件的思想绳瘟,將界面拆分成一個個可以復(fù)用的模塊刺下,每一個模塊就是一個React 組件。一個React 應(yīng)用由若干組件組合而成稽荧,一個復(fù)雜組件也可以由若干簡單組件組合而成橘茉。

我們通常使用Class方式以及function兩種方式創(chuàng)建React組件。

Element

在React中Element通常指代的是render函數(shù)或者stateless函數(shù)返回的Object對象,類似于下面的結(jié)構(gòu)

const element = {
    type: String,
    props: {
        children: [Array,String....],
        ...
    }    
}

這個對象通常作為虛擬DOM姨丈,用來該React組件的結(jié)構(gòu)和渲染方式畅卓,React通過調(diào)用ReactDOM.render將這些虛擬DOM在瀏覽器上渲染成真實(shí)DOM。

在React中Element根據(jù)其type屬性的不同蟋恬,分成兩類: 以原生的DOM元素作為return值的組件翁潘,以及以React組件作為return值的組件

React組件返回原生DOM

這類Element的特點(diǎn)是其type屬性是原生DOM,舉個例子:

//React組件的定義
const Hello = (props) => <div>hello world! <span>{props.name}</span></div>

//該函數(shù)被調(diào)用歼争,產(chǎn)生的React Element
{
    type: 'div',
    props: {
        children: [
            'hello world!', 
            {
                type: 'span',
                children: '***'
             }],
         name: ***
    }
}

此類Element由于和真實(shí)DOM類似拜马,React會直接根據(jù)這個virtual DOM渲染真實(shí)DOM。

React組件返回React組件

這類Element的type首字母大寫

class Home extends React.Component {
  render() {
    return (
      <div>
        <Welcome name='老干部' />
        <p>Anything you like</p>
      </div>
    )
  }
}

{
  type: 'div',
  props: {
    children: [
      {
        type: 'Welcome',
        props: {
          name: '老干部'
        }
      },
      {
        type: 'p',
        props: {
          children: 'Anything you like'
        }
      }沐绒,
    ]
  }
}

React 知道如何渲染type = 'div' 和 type = 'p' 的節(jié)點(diǎn)俩莽,但不知道如何渲染type='Welcome'的節(jié)點(diǎn)

當(dāng)React 發(fā)現(xiàn)Welcome 是一個React 組件時,會調(diào)用該組件的render方法乔遮,產(chǎn)生該組件的Element扮超,如果該組件的element中有首字母大寫開頭的Element的type,繼續(xù)找下去蹋肮,直到?jīng)]有首字母大寫的type弹灭。

因此榕暇,所有的React組件必須首字母大寫,原因是生成React Element的時候嫂丙,type屬性會直接使用該組件的實(shí)例化時使用的名字(<InstanceName />)如果沒大寫React將不能判斷是否需要繼續(xù)調(diào)用該組件的render方法創(chuàng)建Element

實(shí)例

只有使用Class定義的組件缠诅,才有實(shí)例原在。

class Home extends React.Component {
  render() {
    return (
      <div>
        <Welcome name='老干部' />
        <p>Anything you like</p>
      </div>
    )
  }
}
//如果Welcome是使用Class定義的硝全,那么Home中對他的調(diào)用就是創(chuàng)建Welcome的實(shí)例

//如果Welcome是function定義的农猬,那么Home中就是對這個function的調(diào)用

在React中,組件是一種定義有送,而真正發(fā)揮作用的是實(shí)例淌喻。

  • 使用function定義的組件:沒有實(shí)例
    • 不能ref: ref回調(diào)函數(shù)作用于React組件時僧家,是將組件的實(shí)例作為參數(shù)傳入的雀摘,因?yàn)閒unction沒有實(shí)例,因此ref作用于functional component是永遠(yuǎn)不會被調(diào)用的
    • 使用class定義的組件:有實(shí)例
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末八拱,一起剝皮案震驚了整個濱河市阵赠,隨后出現(xiàn)的幾起案子涯塔,更是在濱河造成了極大的恐慌,老刑警劉巖清蚀,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匕荸,死亡現(xiàn)場離奇詭異,居然都是意外死亡枷邪,警方通過查閱死者的電腦和手機(jī)榛搔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來东揣,“玉大人践惑,你說我怎么就攤上這事∷晃裕” “怎么了尔觉?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芥吟。 經(jīng)常有香客問我侦铜,道長,這世上最難降的妖魔是什么钟鸵? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任钉稍,我火速辦了婚禮,結(jié)果婚禮上棺耍,老公的妹妹穿的比我還像新娘嫁盲。我一直安慰自己,他們只是感情好烈掠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布羞秤。 她就那樣靜靜地躺著,像睡著了一般左敌。 火紅的嫁衣襯著肌膚如雪瘾蛋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天矫限,我揣著相機(jī)與錄音哺哼,去河邊找鬼。 笑死叼风,一個胖子當(dāng)著我的面吹牛取董,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播无宿,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼茵汰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孽鸡?” 一聲冷哼從身側(cè)響起蹂午,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤栏豺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后豆胸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奥洼,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年晚胡,在試婚紗的時候發(fā)現(xiàn)自己被綠了灵奖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡估盘,死狀恐怖桑寨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忿檩,我是刑警寧澤尉尾,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站燥透,受9級特大地震影響沙咏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜班套,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一肢藐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吱韭,春花似錦吆豹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猿规,卻和暖如春衷快,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姨俩。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工蘸拔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人环葵。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓调窍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親张遭。 傳聞我的和親對象是個殘疾皇子邓萨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個人覺得該教程講解深入淺出先誉,比目前大...
    leonaxiong閱讀 2,813評論 1 18
  • 3. JSX JSX是對JavaScript語言的一個擴(kuò)展語法, 用于生產(chǎn)React“元素”的烁,建議在描述UI的時候...
    pixels閱讀 2,810評論 0 24
  • 個人筆記, 轉(zhuǎn)載請注明轉(zhuǎn)載自 szhshp的第三邊境研究所 Refs and the DOM In the t...
    szhielelp閱讀 1,465評論 0 1
  • 但其實(shí)我們都明白褐耳,你無法叫醒一個裝睡的人,或者說是當(dāng)一個人的認(rèn)知和意識還沒有達(dá)到的時候渴庆,你是無法去啟動铃芦,你無法去改...
    樹子丨ageLOC閱讀 138評論 0 0
  • 1.首先我們需要安裝Homebrew(這是廢話用mac沒有這個東西你還玩什么?)一條命令完美安裝:http://b...
    茶藝瑤閱讀 1,169評論 0 0