本文原創首發於公衆號:ReactNative開發圈,轉載需註明出處。react
本文會不按期不斷更新,想查看最新版本請移步至https://github.com/forrest23/...android
1.性能媲美原生APP
2.使用JavaScript編碼,只要學習這一種語言
3.絕大部分代碼安卓和IOS都能共用
4.組件式開發,代碼重用性很高
5.跟編寫網頁通常,修改代碼後便可自動刷新,不須要慢慢編譯,節省不少編譯等待時間
6.支持APP熱更新,更新無需從新安裝APPios
缺點:
內存佔用相對較高
版本還不穩定,一直在更新,如今尚未推出穩定的1.0版本git
生命週期 調用次數 可否使用 setSate()
getDefaultProps 1(全局調用一次) 否
getInitialState 1 否
componentWillMount 1 是
render >=1 否
componentDidMount 1 是
componentWillReceiveProps >=0 是
shouldComponentUpdate >=0 否
componentWillUpdate >=0 否
componentDidUpdate >=0 否
componentWillUnmount 1 否github
當調用 setState 時,React會作的第一件事情是將傳遞給 setState 的對象合併到組件的當前狀態。
這將啓動一個稱爲和解(reconciliation)的過程。
和解(reconciliation)的最終目標是以最有效的方式,根據這個新的狀態來更新UI。
爲此,React將構建一個新的 React 元素樹(您能夠將其視爲 UI 的對象表示)。
一旦有了這個樹,爲了弄清 UI 如何響應新的狀態而改變,React 會將這個新樹與上一個元素樹相比較( diff )。
經過這樣作, React 將會知道發生的確切變化,而且經過了解發生什麼變化,只需在絕對必要的狀況下進行更新便可最小化 UI 的佔用空間。redux
1.無論是props仍是state的改變,都會引起render的從新渲染。
2.都能由自身組件的相應初始化函數設定初始值。react-native
不一樣點
1.初始值來源:state的初始值來自於自身的getInitalState(constructor)函數;props來自於父組件或者自身getDefaultProps(若key相同前者可覆蓋後者)。promise
2.修改方式:state只能在自身組件中setState,不能由父組件修改;props只能由父組件修改,不能在自身組件修改。安全
3.對子組件:props是一個父組件傳遞給子組件的數據流,這個數據流能夠一直傳遞到子孫組件;state表明的是一個組件內部自身的狀態,只能在自身組件中存在。服務器
其實這個問題也是跟reconciliation有關係。
「和解( reconciliation )的最終目標是以最有效的方式,根據新的狀態更新用戶界面」。
若是咱們知道咱們的用戶界面(UI)的某一部分不會改變,
那麼沒有理由讓 React 很麻煩地試圖去弄清楚它是否應該渲染。
經過從 shouldComponentUpdate 返回 false,
React 將假定當前組件及其全部子組件將保持與當前組件相同
this.props.children 的值有三種可能:
1.當前組件沒有子節點,它就是 undefined; 2.有一個子節點,數據類型是 object ; 3.有多個子節點,數據類型就是 array 。
系統提供React.Children.map()方法安全的遍歷子節點對象
action是用戶觸發或程序觸發的一個普通對象。
reducer是根據action操做來作出不一樣的數據響應,返回一個新的state。
store的最終值就是由reducer的值來肯定的。(一個store是一個對象, reducer會改變store中的某些值)
action -> reducer -> 新store -> 反饋到UI上有所改變。
要實現RN的腳本熱更新,咱們要搞明白RN是如何去加載腳本的。 在編寫業務邏輯的時候,咱們會有許多個js文件,打包的時候RN會將這些個js文件打包成一個叫index.android.bundle(ios的是index.ios.bundle)的文件,全部的js代碼(包括rn源代碼、第三方庫、業務邏輯的代碼)都在這一個文件裏,啓動App時會第一時間加載bundle文件,因此腳本熱更新要作的事情就是替換掉這個bundle文件。
採用Flex佈局的元素,稱爲Flex容器(flex Container),簡稱"容器"。它的全部子元素自動成爲容器成員,稱爲Flex項目(flex item),簡稱"項目"。
容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫作main start,結束位置叫作main end;交叉軸的開始位置叫作cross start,結束位置叫作cross end。
項目默認沿主軸排列。單個項目佔據的主軸空間叫作main size,佔據的交叉軸空間叫作cross size。
容器的屬性
如下6個屬性設置在容器上。
flex-direction 屬性決定主軸的方向(即項目的排列方向)。
flex-wrap 屬性定義,若是一條軸線排不下,如何換行。
flex-flow flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式。
justify-content 定義了項目在主軸上的對齊方式。
align-items 屬性定義項目在交叉軸上如何對齊。
align-content align-content屬性定義了多根軸線的對齊方式。若是項目只有一根軸線,該屬性不起做用。
code push 調用 react native 的打包命令,將當前環境的非 native 代碼全量打包成一個 bundle 文件,而後上傳到微軟雲服務器(Windows Azure)。 在 app 中啓動頁(或 splash 頁)編寫請求更新的代碼(請求包含了本地版本,hashCode、appToken 等信息),微軟服務端對比本地 js bundle 版本和微軟服務器的版本,若是本地版本低,就下載新的 js bundle 下來後實現更新(code push 框架實現)。
同步只返回一個普通 action 對象。而異步操做中途會返回一個 promise 函數。固然在 promise 函數處理完畢後也會返回一個普通 action 對象。thunk 中間件就是判斷若是返回的是函數,則不傳導給 reducer,直到檢測到是普通 action 對象,才交由 reducer 處理。
本文會不按期不斷更新,想查看最新版本請移步至https://github.com/forrest23/...
本文題目節選自互聯網,若有侵權請聯繫我!
歡迎關注個人微信公衆號:ReactNative開發圈