摘要:一誕生的性能瓶頸,主要有以下原因。注意組件類的第一個字母必須大寫,否則會報錯。組件并不是真實的節(jié)點,而是存在于內(nèi)存之中的一種數(shù)據(jù)結(jié)構(gòu),叫做虛擬。此外,還提供兩種特殊狀態(tài)的處理函數(shù)。不會隨著時間改變可能不是。
本文為學(xué)習(xí)筆記,適合入門的童鞋,如有錯誤,請多多指教。
一、react誕生Web app的性能瓶頸,主要有以下原因。
(1)Web基于DOM,而DOM很慢。瀏覽器打開網(wǎng)頁時,需要解析文檔,在內(nèi)存中生成DOM結(jié)構(gòu),如果遇到復(fù)雜的文檔,這個過程是很慢的。可以想象一下,如果網(wǎng)頁上有上萬個、甚至幾十萬個形狀(不管是圖片或CSS),生成DOM需要多久?更不要提與其中某一個形狀互動了。
(2)DOM拖慢JavaScript。所有的DOM操作都是同步的,會堵塞瀏覽器。JavaScript操作DOM時,必須等前一個操作結(jié)束,才能執(zhí)行后一個操作。只要一個操作有卡頓,整個網(wǎng)頁就會短暫失去響應(yīng)。瀏覽器重繪網(wǎng)頁的頻率是60FPS(即16毫秒/幀),JavaScript做不到在16毫秒內(nèi)完成DOM操作,因此產(chǎn)生了跳幀。用戶體驗上的不流暢、不連貫就源于此。
(3)網(wǎng)頁是單線程的。現(xiàn)在的瀏覽器對于每個網(wǎng)頁,只用一個線程處理。所有工作都在這一個線程上完成,包括布局、渲染、JavaScript執(zhí)行、圖像解碼等等,怎么可能不慢?
(4)網(wǎng)頁沒有硬件加速。網(wǎng)頁都是由CPU處理的,沒用GPU進行圖形加速。
這里我們看到了dom的問題,下面來學(xué)習(xí)下react做了哪些事情,就大概清楚為什么react解決了以上問題。
優(yōu)勢:
組件可復(fù)用性和擴展性好,開發(fā)效率提高
前后端渲染模板上的統(tǒng)一,客戶端和服務(wù)器都可渲染
引入虛擬DOM,每個React組件都擁有一個完整的生命周期,對DOM狀態(tài)的操作都會批量更新,以期盡可能的減少頁面重繪,來追求更好的性能
劣勢:
框架100k,本身較大,手機頁面基本首屏WIFI/4S,3G/6S,可以考慮客戶端緩存
據(jù)其他業(yè)務(wù)反映,無其他劣勢,好評一片
框架建議:REACT+后臺直出+前端SPA,后續(xù)考慮Service Worker、或者上傳到cdn減少后續(xù)加載
二、基礎(chǔ)React 可以在瀏覽器運行,也可以在服務(wù)器運行;
`react.js` 是 React 的核心庫 `react-dom.js` 是提供與 DOM 相關(guān)的功能 `Browser.js` 的作用是將 JSX 語法轉(zhuǎn)為 JavaScript 語法,此步驟應(yīng)在服務(wù)器完成
監(jiān)聽jsx文件到j(luò)s自動轉(zhuǎn)化方法:我們都知道react其實是以jsx的方式編碼,這就涉及由jsx到j(luò)s的轉(zhuǎn)化,以下為自動轉(zhuǎn)化方式
npm install -g react-tools
jsx --watch src/ build/
[JSX] (http://facebook.github.io/jsx/) 是一個看起來很像 XML 的 JavaScript 語法擴展。React 可以用來做簡單的 JSX 句法轉(zhuǎn)換。
重點一:組件ReactDOM.render 是 React 的最基本方法
ReactDOM.render(Hello, world!
, document.getElementById("example") );
var HelloMessage = React.createClass({ render: function() { returnHello {this.props.name}
; } }); ReactDOM.render(, document.getElementById("example") );
React 允許將代碼封裝成組件(component),React.createClass 方法就用于生成一個組件類 HelloMessage 。模板插入
注意:
1、組件類的第一個字母必須大寫,否則會報錯。HelloMessage
2、組件類只能包含一個頂層標(biāo)簽,否則也會報錯。h1
組件并不是真實的 DOM 節(jié)點,而是存在于內(nèi)存之中的一種數(shù)據(jù)結(jié)構(gòu),叫做虛擬 DOM (virtual DOM)。只有當(dāng)它插入文檔以后,才會變成真實的 DOM 。根據(jù) React 的設(shè)計,所有的 DOM 變動,都先在虛擬 DOM 上發(fā)生,然后再將實際發(fā)生變動的部分,反映在真實 DOM上,這種算法叫做?DOM diff?,它可以極大提高網(wǎng)頁的性能表現(xiàn)。
從組件獲取真實 DOM 的節(jié)點,這時就要用到?ref?屬性
組件的生命周期分成三個狀態(tài):
Mounting:已插入真實 DOM
Updating:正在被重新渲染
Unmounting:已移出真實 DOM
React 為每個狀態(tài)都提供了兩種處理函數(shù),will?函數(shù)在進入狀態(tài)之前調(diào)用,did?函數(shù)在進入狀態(tài)之后調(diào)用,三種狀態(tài)共計五種處理函數(shù)。
componentWillMount()
componentDidMount()
componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
componentWillUnmount()
此外,React 還提供兩種特殊狀態(tài)的處理函數(shù)。
componentWillReceiveProps(object nextProps):已加載組件收到新的參數(shù)時調(diào)用
shouldComponentUpdate(object nextProps, object nextState):組件判斷是否重新渲染時調(diào)用
<應(yīng)用>
動畫類:可以采用componentDidMount,利用定時器不斷變化形狀或者透明度等形態(tài)
ajax:可以使用?componentDidMount?方法設(shè)置 Ajax 請求,等到請求成功,再用?this.setState?方法重新渲染 UI
React 的一大創(chuàng)新,就是將組件看成是一個狀態(tài)機,一開始有一個初始狀態(tài),然后用戶互動,導(dǎo)致狀態(tài)變化,從而觸發(fā)重新渲染 UI。
getInitialState:用于定義初始狀態(tài),也就是一個對象
this.state?:屬性讀取
this.setState: 修改狀態(tài)值,每次修改以后,自動調(diào)用?this.render?方法,再次渲染組件
state和props不同:
this.props?表示那些一旦定義,就不再改變的特性,它們從父組件傳遞過來,“屬于”父組件。
this.state?是會隨著用戶互動而產(chǎn)生變化的特性。故表單類渲染也需要用state,this.state?是組件私有的,可以通過調(diào)用?this.setState()來改變它。當(dāng) state 更新之后,組件就會重新渲染自己。
第一步:拆分用戶界面為一個組件樹
第二步: 利用 React ,創(chuàng)建應(yīng)用的一個靜態(tài)版本
第三步:識別出最小的(但是完整的)代表 UI 的 state,分析是否為state 。簡單地對每一項數(shù)據(jù)提出三個問題:
是從父級通過 props 傳入的?可能不是 state 。
不會隨著時間改變?可能不是 state 。
能根據(jù)組件中其它 state 數(shù)據(jù)或者 props 計算出來?不是 state 。
第四步:確認 state 的生命周期,判斷哪個組件會改變或者說擁有這個 state 數(shù)據(jù)模型。
找出每一個基于那個 state 渲染界面的組件。
找出共同的祖先組件(某個單個的組件,在組件樹中位于需要這個 state 的所有組件的上面)。
要么是共同的祖先組件,要么是另外一個在組件樹中位于更高層級的組件應(yīng)該擁有這個 state 。
如果找不出擁有這個 state 數(shù)據(jù)模型的合適的組件,創(chuàng)建一個新的組件來維護這個 state ,然后添加到組件樹中,層級位于所有共同擁有者組件的上面
第五步:添加反向數(shù)據(jù)流,組件之間經(jīng)常交互,從父級到子級比較簡單,這里說的從子級到父級
相關(guān)鏈接:
中文社區(qū):http://react-china.org/
facebook react官網(wǎng):http://facebook.github.io/react/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79154.html
摘要:前端進階進階構(gòu)建項目一配置最佳實踐狀態(tài)管理之痛點分析與改良開發(fā)中所謂狀態(tài)淺析從時間旅行的烏托邦,看狀態(tài)管理的設(shè)計誤區(qū)使用更好地處理數(shù)據(jù)愛彼迎房源詳情頁中的性能優(yōu)化從零開始,在中構(gòu)建時間旅行式調(diào)試用輕松管理復(fù)雜狀態(tài)如何把業(yè)務(wù)邏輯這個故事講好和 前端進階 webpack webpack進階構(gòu)建項目(一) Webpack 4 配置最佳實踐 react Redux狀態(tài)管理之痛點、分析與...
摘要:前言非正經(jīng)入門是相對正經(jīng)入門而言的。不過不要緊,正式學(xué)習(xí)仍需回到正經(jīng)入門的方式。快速入門建議先學(xué)會用拼文寫文檔注冊一個賬號,把庫到自己名下,然后用這個庫寫自己的博客,參見這份介紹。會用拼文寫文章,相當(dāng)于開發(fā)已入門三分之一了。 本系列博文從 Shadow Widget 作者的視角,解釋該框架的設(shè)計要點,既作為用戶手冊的補充,也從更本質(zhì)角度幫助大家理解 Shadow Widget 為什么這...
摘要:即將立秋的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。課多周刊機器人運營中心是如何玩轉(zhuǎn)起來的分享課多周刊是如何運營并堅持下來的。 即將立秋的《課多周刊》(第2期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大...
摘要:即將立秋的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。課多周刊機器人運營中心是如何玩轉(zhuǎn)起來的分享課多周刊是如何運營并堅持下來的。 即將立秋的《課多周刊》(第2期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大...
閱讀 2733·2023-04-25 14:15
閱讀 2685·2021-11-04 16:11
閱讀 3385·2021-10-14 09:42
閱讀 434·2019-08-30 15:52
閱讀 2819·2019-08-30 14:03
閱讀 3536·2019-08-30 13:00
閱讀 2105·2019-08-26 11:40
閱讀 3301·2019-08-26 10:25