2019-06-03 React(JSX芍阎、組件樹世曾、事件監(jiān)聽、state)

1谴咸、DOM 事件的 API 只有 DOM 結(jié)構(gòu)才能用轮听。
我們需要 DOM 結(jié)構(gòu),準(zhǔn)確地來說:我們需要這個(gè)點(diǎn)贊功能的 HTML 字符串表示的 DOM 結(jié)構(gòu)岭佳。

JSX描述UI信息

2血巍、要記住幾個(gè)點(diǎn):
1)JSX 是 JavaScript 語言的一種語法擴(kuò)展,長得像 HTML珊随,但并不是 HTML述寡。
2)React.js 可以用 JSX 來描述你的組件長什么樣的。
3)JSX 在編譯的時(shí)候會(huì)變成相應(yīng)的 JavaScript 對(duì)象描述叶洞。
4)react-dom 負(fù)責(zé)把這個(gè)用來描述 UI 信息的 JavaScript 對(duì)象變成 DOM 元素鲫凶,并且渲染到頁面上。

3京办、在 JSX 當(dāng)中你可以插入 JavaScript 的表達(dá)式掀序,表達(dá)式返回的結(jié)果會(huì)相應(yīng)地渲染到頁面上。表達(dá)式用 {} 包裹惭婿。{} 內(nèi)可以放任何 JavaScript 的代碼不恭,包括變量、表達(dá)式計(jì)算财饥、函數(shù)執(zhí)行等等换吧。 render 會(huì)把這些代碼返回的內(nèi)容如實(shí)地渲染到頁面上,非常的靈活钥星。

組件的組合沾瓦、嵌套和組件樹

4、我們可以把組件的內(nèi)容封裝好谦炒,然后靈活在使用在任何組件內(nèi)贯莺。另外這里要注意的是,自定義的組件都必須要用大寫字母開頭宁改,普通的 HTML 標(biāo)簽都用小寫字母開頭缕探。

組件可以和組件組合在一起,組件內(nèi)部可以使用別的組件还蹲。就像普通的 HTML 標(biāo)簽一樣使用就可以爹耗。這樣的組合嵌套耙考,最后構(gòu)成一個(gè)所謂的組件樹,就正如上面的例子那樣潭兽,Index 用了 Header倦始、Main、Footer山卦,Header 又使用了 Title 鞋邑。這樣用這樣的樹狀結(jié)構(gòu)表示它們之間的關(guān)系:


image.png

事件監(jiān)聽

5、在 React.js 不需要手動(dòng)調(diào)用瀏覽器原生的 addEventListener 進(jìn)行事件監(jiān)聽账蓉。React.js 幫我們封裝好了一系列的 on* 的屬性炫狱,當(dāng)你需要為某個(gè)元素監(jiān)聽某個(gè)事件的時(shí)候,只需要簡單地給它加上 on* 就可以了药薯。而且你不需要考慮不同瀏覽器兼容性的問題见芹,React.js 都幫我們封裝好這些細(xì)節(jié)了。
沒有經(jīng)過特殊處理的話,這些 on* 的事件監(jiān)聽只能用在普通的 HTML 的標(biāo)簽上涤躲,而不能用在組件標(biāo)簽上。也就是說撬腾,<Header onClick={…} /> 這樣的寫法不會(huì)有什么效果的枫甲。

6、和普通瀏覽器一樣限番,事件監(jiān)聽函數(shù)會(huì)被自動(dòng)傳入一個(gè) event 對(duì)象舱污,這個(gè)對(duì)象和普通的瀏覽器 event 對(duì)象所包含的方法和屬性都基本一致。不同的是 React.js 中的 event 對(duì)象并不是瀏覽器提供的弥虐,而是它自己內(nèi)部所構(gòu)建的扩灯。React.js 將瀏覽器原生的 event 對(duì)象封裝了一下,對(duì)外提供統(tǒng)一的 API 和屬性霜瘪,這樣你就不用考慮不同瀏覽器的兼容性問題珠插。

7、一般在某個(gè)類的實(shí)例方法里面的 this 指的是這個(gè)實(shí)例本身颖对。但是你在上面的 handleClickOnTitle 中把 this 打印出來捻撑,你會(huì)看到 this 是 null 或者 undefined。這是因?yàn)?React.js 調(diào)用你所傳給它的方法的時(shí)候缤底,并不是通過對(duì)象方法的方式調(diào)用(this.handleClickOnTitle)顾患,而是直接通過函數(shù)調(diào)用 (handleClickOnTitle),所以事件監(jiān)聽函數(shù)內(nèi)并不能通過 this 獲取到實(shí)例个唧。如果你想在事件函數(shù)當(dāng)中使用當(dāng)前的實(shí)例江解,你需要手動(dòng)地將實(shí)例方法 bind 到當(dāng)前實(shí)例上再傳入給 React.js。
<h1 onClick={this.handleClickOnTitle.bind(this)}>React 小書</h1>
bind還可以同時(shí)傳遞參數(shù)坑鱼。
這種 bind 模式在 React.js 的事件監(jiān)聽當(dāng)中非常常見膘流,bind 不僅可以幫我們把事件監(jiān)聽方法中的 this 綁定到當(dāng)前組件實(shí)例上絮缅;還可以幫助我們?cè)谠阡秩玖斜碓氐臅r(shí)候,把列表元素傳入事件監(jiān)聽函數(shù)當(dāng)中

state和setState

8呼股、setState 方法由父類 Component 所提供耕魄。當(dāng)我們調(diào)用這個(gè)函數(shù)的時(shí)候,React.js 會(huì)更新組件的狀態(tài) state 彭谁,并且重新調(diào)用 render 方法吸奴,然后再把 render 方法所渲染的最新的內(nèi)容顯示到頁面上。
注意缠局,當(dāng)我們要改變組件的狀態(tài)的時(shí)候则奥,不能直接用 this.state = xxx 這種方式來修改,如果這樣做 React.js 就沒辦法知道你修改了組件的狀態(tài)狭园,它也就沒有辦法更新頁面读处。所以,一定要使用 React.js 提供的 setState 方法唱矛,它接受一個(gè)對(duì)象或者函數(shù)作為參數(shù)罚舱。
傳入一個(gè)對(duì)象的時(shí)候,這個(gè)對(duì)象表示該組件的新狀態(tài)绎谦。但你只需要傳入需要更新的部分就可以了管闷,而不需要傳入整個(gè)對(duì)象。

9窃肠、這里還有要注意的是包个,當(dāng)你調(diào)用 setState 的時(shí)候,React.js 并不會(huì)馬上修改 state冤留。而是把這個(gè)對(duì)象放到一個(gè)更新隊(duì)列里面碧囊,稍后才會(huì)從隊(duì)列當(dāng)中把新的狀態(tài)提取出來合并到 state 當(dāng)中,然后再觸發(fā)組件更新纤怒。
在使用 React.js 的時(shí)候呕臂,并不需要擔(dān)心多次進(jìn)行 setState 會(huì)帶來性能問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肪跋,一起剝皮案震驚了整個(gè)濱河市歧蒋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌州既,老刑警劉巖谜洽,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吴叶,居然都是意外死亡阐虚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蚌卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实束,“玉大人奥秆,你說我怎么就攤上這事∠滩樱” “怎么了构订?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長避矢。 經(jīng)常有香客問我悼瘾,道長,這世上最難降的妖魔是什么审胸? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任亥宿,我火速辦了婚禮,結(jié)果婚禮上砂沛,老公的妹妹穿的比我還像新娘烫扼。我一直安慰自己,他們只是感情好碍庵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布材蛛。 她就那樣靜靜地躺著,像睡著了一般怎抛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芽淡,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天马绝,我揣著相機(jī)與錄音,去河邊找鬼挣菲。 笑死富稻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的白胀。 我是一名探鬼主播椭赋,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼或杠!你這毒婦竟也來了哪怔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤向抢,失蹤者是張志新(化名)和其女友劉穎认境,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挟鸠,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叉信,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艘希。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硼身。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硅急,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佳遂,到底是詐尸還是另有隱情营袜,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布讶迁,位于F島的核電站连茧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巍糯。R本人自食惡果不足惜啸驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祟峦。 院中可真熱鬧罚斗,春花似錦、人聲如沸宅楞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厌衙。三九已至距淫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婶希,已是汗流浹背榕暇。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喻杈,地道東北人彤枢。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像筒饰,于是被迫代替她去往敵國和親缴啡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 1瓷们、什么是react React.js 是一個(gè)幫助你構(gòu)建頁面 UI 的庫业栅。React.js 將幫助我們將界面分成了...
    谷子多閱讀 2,555評(píng)論 1 13
  • 說在前面 關(guān)于 react 的總結(jié)過去半年就一直碎碎念著要搞起來,各(wo)種(tai)原(lan)因(le)谬晕。心...
    陳嘻嘻啊閱讀 6,846評(píng)論 7 41
  • 作為一個(gè)合格的開發(fā)者式镐,不要只滿足于編寫了可以運(yùn)行的代碼。而要了解代碼背后的工作原理固蚤;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,422評(píng)論 1 33
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南娘汞,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個(gè)人覺得該教程講解深入淺出夕玩,比目前大...
    leonaxiong閱讀 2,810評(píng)論 1 18
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中你弦。 1. Hello world 這段代碼將一個(gè)一級(jí)標(biāo)題插入到指...
    ryanho84閱讀 6,221評(píng)論 0 9