【筆記】2React Native工作原理

1. RN是如何工作的

React的關(guān)鍵特點(diǎn):Virtual DOM(虛擬DOM)俯萌。

Virtual DOM完美中間人的角色
Diff算法計(jì)算差異棠枉,對(duì)差異部分渲染

為了更好地理解RN的工作原理,先需要了解一下Virtual DOM (虛擬DOM)。

執(zhí)行Virtual DOM計(jì)算牵啦,減少瀏覽器實(shí)際DOM的重復(fù)渲染。

Virtual DOM的功能:

  • 減少了重復(fù)渲染妄痪,提升了性能哈雏。
  • 提供了強(qiáng)大的抽象能力。


    強(qiáng)大的抽象能力

RN調(diào)用Objective-C的API去渲染iOS組件

調(diào)用Java接口去渲染Android組件

而不是渲染到瀏覽器DOM上拌夏。

“橋接”令一切成為可能僧著,它使得React可調(diào)用宿主平臺(tái)開(kāi)放UI組件。

React組件通過(guò)render方法返回了描述界面的標(biāo)記代碼障簿。

  • Web平臺(tái):將標(biāo)記代碼解析成瀏覽器的DOM盹愚;
  • RN平臺(tái)上:將標(biāo)記代碼解析成特定平臺(tái)的組件。

2. 渲染周期

生命周期基本與React相同站故,但渲染過(guò)程有些區(qū)別皆怕。


image.png

渲染周期始于React組件掛載之后,然后React進(jìn)入渲染周期西篓,根據(jù)需要渲染組件愈腾。


image.png

在渲染階段,React將開(kāi)發(fā)者在render方法中返回的HTML標(biāo)記直接按需渲染在頁(yè)面上岂津。
RN與React不同的是虱黄,JavaScript依賴(lài)于“橋接”,通過(guò)橋接的解析吮成,間接調(diào)用宿主平臺(tái)的基礎(chǔ)接口和UI元素(也發(fā)就是Objective-C和Java)橱乱。由于RN不是在UI主線(xiàn)程運(yùn)行,他可以在不影響用戶(hù)體驗(yàn)的前提下執(zhí)行異步調(diào)用粱甫。

3. 在RN中創(chuàng)建組件

3.1 編寫(xiě)視圖

在使用每一個(gè)組件之前泳叠,都需要明確的進(jìn)行導(dǎo)入。

React RN
< div > < View >
< span > < Text >
< ui >, < ul > < ListView >
< img > < Image >

3.2 使用JSX

RN通過(guò)編寫(xiě)JSX來(lái)設(shè)計(jì)視圖茶宵,并將視圖標(biāo)記和控制邏輯組合在一起成為一個(gè)文件危纫。

使用JSX語(yǔ)法來(lái)編寫(xiě)RN項(xiàng)目,JSX認(rèn)為減少心智負(fù)擔(dān)比文件分離更有用。

RN中.js文件實(shí)際上就是JSX文件种蝶。

使用JS和JSX有啥區(qū)別契耿,如下例子所示:

var HelloMessage=React.createClass({
   displayName:"HelloMessage",
   render: function render(){
     return React.createElement(
     "div",
       null,
       "Hello",
       this.props.name
     );
   }
});

React.render(React.createElement(HelloMessage,{name:"Bonnie"}),mountNode);

//----------------------------------

//通過(guò)使用JSX使其更為簡(jiǎn)潔,使用類(lèi)XML標(biāo)記來(lái)代替調(diào)用React.createElement方法并傳入一組HTML屬性的做法蛤吓。
var HelloMessage=React.createClass({
render:function(){
  // 返回標(biāo)記而不是調(diào)用createElement方法
  return <div> Hello {this.props.name}</div>;
}
});
//我們不再需要調(diào)用createElement方法
React.render(<HelloMessage name="Bonnie"/>,mountNode)

//------------------------------------

 以上的兩段代碼最終被渲染成以下的HTML
 <div> Hello Bonnie </div>

3.3 原生組件的樣式

React和宿主平臺(tái)之間的“橋接”包含了一個(gè)縮減版的CSS子集的實(shí)現(xiàn)宵喂。

這個(gè)CSS子集主要通過(guò)flexbox進(jìn)行布局,做到了盡量簡(jiǎn)單化会傲,而不是去實(shí)現(xiàn)所有的CSS規(guī)則锅棕。

RN做到了樣式規(guī)范的一致(因?yàn)橹恍枰m配安卓和iOS兩種類(lèi)型設(shè)備)。

RN也堅(jiān)持使用內(nèi)聯(lián)樣式淌山,通過(guò)JavaScript對(duì)象進(jìn)行樣式組織裸燎。

例子:

//定義一個(gè)樣式
var style={
  backgroundColor:'white',
  fontSize:'16px'
}
//然后使用它
var tv=(<Text style={style}> A styled Text </Text>);

4. 宿主平臺(tái)接口

使用Web環(huán)境的React與RN'''最大的不同'''應(yīng)該就在宿主平臺(tái)的接口了。

React Native的橋接不可能暴露宿主平臺(tái)全部的接口泼疑,如果你需要使用一個(gè)未支持的特性德绿,完全可以自己動(dòng)手添加到RN中。

RN中退渗,平臺(tái)特定的接口在提供優(yōu)秀原生的用戶(hù)體驗(yàn)方面發(fā)揮了巨大作用移稳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市会油,隨后出現(xiàn)的幾起案子个粱,更是在濱河造成了極大的恐慌,老刑警劉巖翻翩,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件都许,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嫂冻,警方通過(guò)查閱死者的電腦和手機(jī)胶征,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桨仿,“玉大人睛低,你說(shuō)我怎么就攤上這事》” “怎么了暇昂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)伴嗡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)从铲,這世上最難降的妖魔是什么瘪校? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上阱扬,老公的妹妹穿的比我還像新娘泣懊。我一直安慰自己,他們只是感情好麻惶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布馍刮。 她就那樣靜靜地躺著,像睡著了一般窃蹋。 火紅的嫁衣襯著肌膚如雪卡啰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天警没,我揣著相機(jī)與錄音匈辱,去河邊找鬼。 笑死杀迹,一個(gè)胖子當(dāng)著我的面吹牛亡脸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播树酪,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浅碾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了续语?” 一聲冷哼從身側(cè)響起垂谢,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绵载,沒(méi)想到半個(gè)月后埂陆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娃豹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年焚虱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懂版。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹃栽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躯畴,到底是詐尸還是另有隱情民鼓,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布蓬抄,位于F島的核電站丰嘉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚷缭。R本人自食惡果不足惜饮亏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一耍贾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧路幸,春花似錦荐开、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砰识,卻和暖如春能扒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仍翰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工赫粥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人予借。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓越平,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灵迫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秦叛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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