做微信前端開發做了一段時間了,對一直使用的React做一個總結
React 的優點我主要體會在更新Dom和響應時間上。 類似一個“狀态機“,UI元件化,單項資料流(友善打理,自上而下的渲染方式)
React 的diff算法,利用虛拟Dom實作了非常好的渲染系統。利用setstate等一些渲染函數。讀入目前狀态,将其轉化目标頁面的一個虛拟表現。然後利用diff算法
計算虛拟頁面和真實Dom的差異,然後對這些差異進行最少的更新。
React的主要的優勢就是在最小重繪了Dom操作,避免不必要的更新。
React發源自Facebook的PHP架構XHP的一個分支,Xhp在每次有請求進來的時候都渲染整個界面。React的産生就是把重新渲染整個界面的PHP的工作方式帶到用戶端應用來。
Diff算法(虛拟DOM)
一個Web頁面可以看做是一個DOM樹,每一個節點位置的改變,就會導緻整顆樹的改變,React裡面有虛拟DOM,一個被修改後的DOM樹。每次渲染就是虛拟DOM和真是DOM樹通過Diff算法進行重新渲染。Diff的算法複雜度為O(n)
Diff算法之是以為O(n)是從高層往底層進行查找。 很簡單,也有區分。
1.隻比較同層,如果一層的DOM類型都不同,直接把不同的DOM節點給删去,然後替換上虛拟DOM上被修改的DOM節點。 新增加的DOM節點的子節點就不用檢視了。
2.如果類型相同屬性不同,進行屬性的替換。
3.如果在清單的子節點,比如一個table裡面的子元件,在使用過程中大家應該遇到過,如果沒有給子節點附上獨一無二的key值那麼會進行提示。 隻是在清單當中diff可以利用鍵值對使用插入的方式進行替換。不然類似冒泡排序一個個的替換節點。 如果表中元素沒有獨一無二的key,那麼就會進行提示。當時并沒有影響,但是可能在替換的時候發生問題。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9UleOVzZ65ENZpWTmZEWjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DNyATOwgDN5ATNyYDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
React就類似一個View,元件化(向web componet 看齊),多端同構。
UI由無數的元件嵌套而成,它們存在層級關系。所有有父元件子元件。頂層元件的概念。
View設定好,就必須有資料了。
整體的View劃分好後,通過setState,state,給一些值進行定義。自父元件往子元件傳值直接用props
子元件向父元件傳參數就比較麻煩了。當然我們可以通過函數傳參解決這個問題。
http://blog.csdn.net/qq_26878975/article/details/62052234
DataFlow(單項資料流動)
React是一個視圖庫,但是web沒有資料,那就沒什麼用,首先在頂層元件擷取到資料,通過Ajax或者Fetch來進行擷取資料。 然後通過props傳給每一層的子元件。然後一層層的傳遞下去。最後每個子元件都得到自己渲染所需要的資料,進而完成UI的渲染。(通過函數參數進行子向父傳參)
React的生命周期
在渲染過程中,React會頻繁的建立或者銷毀元件。React為每個元件提供了生命周期鈎子函數去響應不同的時刻,建立,存在和銷毀。
建立時刻
Consructor(props){
super(); //調用弗雷構造器
//設定執行個體的屬性以及組建的特性
}
componentwillMount 首次渲染前被調用。 沒有什麼用。
render 建立一個虛拟Dom,表示組建的輸出。
隻能通過props,state通路資料。 可以傳回null,false或者react任意元件,必須都是修飾Dom,在其中不能改變元件的狀态或者修改Dom的輸出,隻能有一個組合元件。
componentDidMount
在render方法成功調用并且真實的Dom已經被渲染之後。這就是可以通路原始Dom的生命周期的鈎子函數(react運作在服務端時,該方法不會被調用)
在元件已經渲染好,并且使用者預期互動,使用者改變元件裡面的資料有新的state流入元件樹。
componentwillreceiveprops
react是單向流可以改變父輩子類同時都改變,用componentwillreceiveprops方法會被調用,我們也能更改props對象及更新state的機會。
shouldComponentupdate(優化的時候可以考慮)首次渲染期間或者調用forceUpdate方法後,這個方法不會被調用。
精确優化,在确認某個元件或者它任何子件不需要渲染新的props或者state,該方法傳回false。
componentWillUpdate
元件會在接受到新的props和state進行渲染前調用該方法。
銷毀期
react使用完一個元件,這個元件就必須從Dom中解除安裝随後被銷毀。此時僅有的一個鈎子函數做出響應,完成所有的清理和銷毀工作。
componentwillunmount
函數在組建消亡前被調用,做一些清理工作,在componentDidmount方法中添加的所有任務都需要在該方法中撤銷,比如建立的定時器或者添加的事件監聽器。
JSX與react
jsx寫起來可讀性更高,也更容易調試。React的一個特點是建立一個個獨立的元件。同時JSX以幹淨簡潔的方式,保證了元件中的标簽和業務邏輯相分離,以此來實作一個清晰直覺的方式來描述元件樹。
jsx和HTML的差別
屬性:HTML用内聯的方式給每個節點設定屬性。
條件判斷,jsx可以使用三目運算符,設定變量在屬性中引用,把邏輯放到函數在引用,使用&&運算符
非dom屬性: key dom的渲染,是通過節點來的。 ref:資料一般是單向流,這個父元件對子元件的的一個引用
樣式:内聯樣式,React内聯模式都是駝峰寫法
var style = {
}
React。renderComponent(<div style={styles}>);
如果不用jsx。 定義元件類 2.定義一個元件類産生執行個體的工廠。 3.。使用工廠來建立ReactElement執行個體