React 入門

京都嵐山

其實這篇想寫一陣子了,不過拖太久本來想放掉,是後來又看到 TonyQ 在說他的經驗,就覺得還是寫一下,搞不好可以幫到人(?),然後其實我對 React 沒深入研究,目前也只寫過一次,也沒做到複雜的 App,所以這篇純粹是我的觀察啦。

先講結論,寫過目前一般 Web App 的人,要來寫 React 大概都要一些撞牆期吧,我的狀況是要寫 React + Flux 架構的 Web App,但是一開始對 Flux 的介紹沒認真看,在一知半解的狀態下就開始做了,結果就一直出現些靈異現象,大部分是覺得應該要更新畫面了但是沒有,追到後來大概就兩個原因:

  • 亂用 props 和 state,總之就是 React 只會在 state 變化的時候更新畫面,props 變化的時候不會(其實設計上是 immutable 的),而用 props 的時機基本上是父層 component 要設定資料給子 component 的時候才會用,至於父層收到不同的資料給子 component 時,同樣是改 props,為什麼畫面就會更新了,事實上是因為父層 component 更新的時候,才有機會改動到子 component 的 prop,而因為有重新 render,子 component 的內容也會一起更新,也才更新了畫面。

  • 想要只更新子 component,這個問題就是沒把 flux 的設計弄清楚,Flux 的 store 其實有點代表所有的資料的意思,而不管是什麼動作,都要把整包的 store 資料更新回去,根 component 會綁事件在 store 的更新事件上,發現 store 資料有更新就開始重新 render component,然後跟著它的子 component 就會因為 prop 更新而跟著更新。

當然 store 是可以有多個的,重點在於每次更新都要整個 store 的資料重新給根 component,不能從 store 裡面某一層開始送,然後想要只更新某個子 component,這樣結果就很容易發生靈異事件,當然 React 可以不用 Flux 架構,不過我覺得那條路走起來更困難,所以還是乖乖使用 Flux 架構,其實我後來做的結構很簡單,action 就只是一個事件,store 就是 POJSO 而已,沒用到一些市面上的 Flux framework。

最後一點要提的就是每次都整包 store 更新,可能就會有人想到效能問題,當然 React 本身效能不錯,不過資料量要是超大,可能還是會有出現狀況,我想這也是為什麼 Facebook 要發展 Immutable.js 的原因,其實我仔細瞭解後,發現 Immutable 配合 Flux 架構真的是超適合的,而且他在大量資料更新的時候,可以保持蠻不錯的效能,因為只有 reference 的變化,而不是真的重新產生整包資料,沒變化的資料都是本來就已經在記憶體裡面的,整體的資源消耗少很多。