第一節(jié):React認(rèn)識和JSX語法的了解

1.React 是什么

是用于構(gòu)建用戶界面的JavaScript庫

如何理解:

  1. React核心本身就是一個JS的第三方庫弄息,從宏觀角度看其實(shí)和其他JS庫沒什么區(qū)別
  2. 用于構(gòu)建用戶界面椰于,意思就是這個庫的目的主要負(fù)責(zé)處理用戶界面-幫助渲染HTML視圖的梭姓。


2.React的特點(diǎn)

  1. 聲明式: 聲明式相對于以前命令式簡單高效
  2. 組件化: 創(chuàng)建各種狀態(tài)各異的組件,由組件來組成復(fù)雜的UI
  3. JSX : 使用獨(dú)特JSX語法(后面會說)來創(chuàng)建組件屠升,使用函數(shù)式編程思想來進(jìn)行UI更新
  4. 虛擬DOM: 基于內(nèi)部虛擬DOM和Diff算法來有選擇性的進(jìn)行視圖更新
  5. 單向數(shù)據(jù)流: 子組件本身不會改變接受到的數(shù)據(jù)潮改,只會監(jiān)聽數(shù)據(jù)變化,根據(jù)新值重新渲染


2.1 單項(xiàng)數(shù)據(jù)流

單項(xiàng)數(shù)據(jù)流的理解:

  1. 單向數(shù)據(jù)流是指數(shù)據(jù)的流向只能由父組件通過props將數(shù)據(jù)傳遞給子組件腹暖,
  2. 不能由子組件向父組件傳遞數(shù)據(jù)汇在,
  3. 要想實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,只能由子組件接收父組件props傳過來的方法去改變父組件的數(shù)據(jù)而不是直接將子組件的數(shù)據(jù)傳遞給父組件脏答。


3. 虛擬DOM的理解

3.1 什么是虛擬DOM

虛擬DOM本身就是JS對象, 使用JS對象模擬DOM樹的結(jié)構(gòu)

虛擬DOM在最后會轉(zhuǎn)換位真實(shí)的DOM渲染到頁面上

因此在React開發(fā)中還需要操作虛擬DOM, 已經(jīng)相關(guān)的數(shù)據(jù), React會自動的將虛擬DOM轉(zhuǎn)為真實(shí)的DOM

虛擬DOM示例:

var vDOM = React.creatElement("h2",{id:"title"}, "hello")

虛擬DOM的理解

  1. 虛擬DOM是模擬真實(shí)的DOM, 真實(shí)的DOM會有標(biāo)簽,屬性,標(biāo)簽嵌套的值
  2. 示例中第一個參數(shù)h2字符串轉(zhuǎn)為真實(shí)的DOM就是h2標(biāo)簽
  3. 示例中第二個參數(shù)對象轉(zhuǎn)為真實(shí)的DOM, 屬性為標(biāo)簽的屬性, 值為標(biāo)簽屬性值
  4. 示例中第三個參數(shù)是標(biāo)簽嵌套的內(nèi)容,


3.2 React中如何創(chuàng)建虛擬DOM

在React中創(chuàng)建虛擬DOM的方式有兩種,

  1. 純JS的方式創(chuàng)建虛擬DOM
  2. JSX語法創(chuàng)建虛擬DOM
3.2.1 純JS的方式創(chuàng)建虛擬DOM

使用純JS方式創(chuàng)建虛擬DOM說明:

  1. React提供了一個createElement用來當(dāng)創(chuàng)建虛擬DOM
  2. 用點(diǎn)類似于document.createElement,創(chuàng)建真實(shí)在虛擬DOM
  3. 虛擬DOM相較于真實(shí)的DOM會非常輕, 輕就是屬性會比較少,只有一些核心的屬性

示例如下:

// 虛擬DOM
let vDOM = React.createElement("h2",{id:"title"},"Hello World")

// 真實(shí)的DOM
let h3 = document.createElement("h3")

// 打印虛擬DOM和真實(shí)的DOM對比就理解輕重的概念
console.log(vDOM);
console.dir(h3);


// 將虛擬DOM渲染到頁面上
ReactDOM.render((vDOM), document.getElementById("app"))


3.2.2 JSX語法創(chuàng)建虛擬DOM

說明

  1. 所謂JSX語法就是在JS中可以像HTML中一樣創(chuàng)建標(biāo)簽
  2. JSX語法創(chuàng)建虛擬DOM相對于純JS語法比較簡單
  3. JSX語法最終還是會被React轉(zhuǎn)為JS方式的虛擬DOM
  4. 開發(fā)過程中一般會選擇JSX語法創(chuàng)建虛擬DOM

示例代碼:


// JSX語法創(chuàng)建虛擬DOM
let vDOM = <h2 id="title">Hello World</h2>

// 將虛擬DOM渲染到頁面上
ReactDOM.render((vDOM), document.getElementById("app"))


3.3 虛擬DOM的優(yōu)點(diǎn)
3.3.1 虛擬DOM的優(yōu)勢

虛擬DOM的本質(zhì)就是內(nèi)存中的JavaScript對象

  1. 虛擬(virtual)DOM, 不總是直接操作DOM(最小化重繪DOM次數(shù))
  2. DOM Diff 算法 最小化頁面重繪(最小化重繪區(qū)域)


3.3.2 傳統(tǒng)操作DOM的理解
  1. 瀏覽器的渲染機(jī)制首先會解析HTML構(gòu)建DOM樹
  2. 瀏覽器解析CSS構(gòu)建CSS規(guī)則樹
  3. 將DOM樹和CSS規(guī)則樹合并形成Render渲染樹
  4. 對Reader渲染樹的各個節(jié)點(diǎn)進(jìn)行布局計算
  5. 根據(jù)計算的結(jié)果將內(nèi)容繪制在屏幕上


3.3.3 操作虛擬DOM理解
  1. 傳統(tǒng)的直接操作DOM,每一次的改變都會出發(fā)重構(gòu)或重繪糕殉,每次的重構(gòu)重繪都是從根節(jié)點(diǎn)開始分析處理
  2. 操作虛擬DOM,只會更新虛擬DOM殖告,每一次的變化都會和上一次虛擬DOM進(jìn)行對比阿蝶, 找到變化的部分,
  3. 最終React會將包含所有變化的虛擬DOM和真實(shí)DOM進(jìn)行對比, 找到變化的部分一次渲染, 提升渲染速度和性能
虛擬DOM_圖1.png


4. JSX語法

4.1 JSX語法的理解
  1. 語法全稱 JavaScript XML
  2. React 定義的 一種類似于XML 的JS 擴(kuò)展語法 XML + JS
  3. 作用: 就是用來創(chuàng)建react虛擬DOM(元素)對象


4.2 JSX示例
var vDOM = <div>wuwei</div>

示例理解:

  1. 處理中是有通過JSX語法創(chuàng)建的虛擬DOM
  2. 值不是字符串 ,也不是一個HTML 或者XML,就是一個虛擬DOM,
  3. 它最終會被轉(zhuǎn)行為一個JS對象(虛擬DOM)
  4. 標(biāo)簽名可以是任意合法的HTML標(biāo)簽名或自定義標(biāo)簽名,
  5. 屬性也可以是合法的標(biāo)簽屬性,也可以是自定義屬性


4.3 JSX語法解析規(guī)則

JSX語法解析有一個基本的規(guī)則:

  1. 碰到<開頭的代碼,以標(biāo)簽的語法解析:

    合法的標(biāo)簽名會被當(dāng)做正常標(biāo)簽解析,如果碰到不合法的標(biāo)簽名,會當(dāng)成自定義標(biāo)簽, 通常是組件

  2. 碰到{開頭的代碼, {} 里面會以js語法解析, 被當(dāng)成js表達(dá)式

示例代碼:

// JS中普通的變量
let content = "你好 React"

// 虛擬DOM
let vDOM = <h2 id="title">{ content }</h2>

// 將虛擬DOM渲染到頁面上
ReactDOM.render((vDOM), document.getElementById("app"))

示例說明:

  1. 示例中JSX語法中嵌套的{}外會被當(dāng)做HTML解析
  2. {}里面會被作為JS表達(dá)式解析, 因此content會被解析為變量
  3. 故而{content}的值為"你好 React"


4.4 渲染虛擬DOM語法

將虛擬DOM渲染到頁面上的語法

語法方式: ReactDOM.render(virtualDOM, containerDOM)

?

作用: 就是將虛擬DOM的元素渲染到真實(shí)的DOM容器中

參數(shù)說明

  1. 參數(shù)一: 純JS 或者 JSX 創(chuàng)建的虛擬DOM對象
  2. 參數(shù)二: 用來包含虛擬DOM的真實(shí)DOM元素對象(一般用div)


5. 模塊與組件和模塊化與組件化的理解

5.1 模塊
  1. 理解: 模塊就是向外提供特定功能的JS程序,一般就是一個JS文件
  2. 為什么: 因?yàn)樗械膉s代碼寫在一起,就會太多太復(fù)雜了
  3. 作用: 復(fù)用js,簡化js的編寫,提高js運(yùn)行效率
5.2 組件
  1. 理解: 用來實(shí)現(xiàn)特定(局部)功能效果的代碼集合(html/css/js)
  2. 為什么: 一個界面的功能太復(fù)雜了,
  3. 作用: 復(fù)用編碼,簡化項(xiàng)目編碼,提高運(yùn)行效率
5.3 模塊化

當(dāng)應(yīng)用的js都是以模塊來編寫的時候,這個應(yīng)用就是一個模塊化的應(yīng)用

5.4 組件化

當(dāng)應(yīng)用都是以組件的方式來實(shí)現(xiàn)的時候,這個應(yīng)用就是一個組件化的應(yīng)用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黄绩,一起剝皮案震驚了整個濱河市赡磅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宝与,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冶匹,死亡現(xiàn)場離奇詭異习劫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嚼隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門诽里,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飞蛹,你說我怎么就攤上這事谤狡【难郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵墓懂,是天一觀的道長焰宣。 經(jīng)常有香客問我,道長捕仔,這世上最難降的妖魔是什么匕积? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮榜跌,結(jié)果婚禮上闪唆,老公的妹妹穿的比我還像新娘。我一直安慰自己钓葫,他們只是感情好悄蕾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著础浮,像睡著了一般帆调。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霸旗,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天贷帮,我揣著相機(jī)與錄音,去河邊找鬼诱告。 笑死撵枢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的精居。 我是一名探鬼主播锄禽,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼靴姿!你這毒婦竟也來了沃但?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佛吓,失蹤者是張志新(化名)和其女友劉穎宵晚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體维雇,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淤刃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吱型。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逸贾。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铝侵,到底是詐尸還是另有隱情灼伤,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布咪鲜,位于F島的核電站狐赡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗜诀。R本人自食惡果不足惜猾警,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隆敢。 院中可真熱鬧发皿,春花似錦、人聲如沸拂蝎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽温自。三九已至玄货,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悼泌,已是汗流浹背松捉。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馆里,地道東北人隘世。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像鸠踪,于是被迫代替她去往敵國和親丙者。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354