1.React Native相對于原生的ios和Android有哪些優(yōu)勢?
- 性能媲美原生APP
- 使用JavaScript編碼,簡單易學(xué)
- 絕大部分代碼安卓和IOS都能共用,復(fù)用率90%以上
- 采用組件式開發(fā),代碼重用性很高,開發(fā)效率高
- 跟編寫網(wǎng)頁一般,修改代碼后即可自動刷新,不需要慢慢編譯,節(jié)省很多編譯等待時間
- 支持APP熱更新,更新無需重新安裝APP
2.加載bundle的機(jī)制
要實(shí)現(xiàn)RN的腳本熱更新,我們要搞明白RN是如何去加載腳本的。 在編寫業(yè)務(wù)邏輯的時候,我們會有許多個js文件,打包的時候RN會將這些個js文件打包成一個叫index.jsbundle的文件,所有的js代碼(包括rn源代碼、第三方庫、業(yè)務(wù)邏輯的代碼)都在這一個文件里,啟動App時會第一時間加載bundle文件,所以腳本熱更新要做的事情就是替換掉這個bundle文件。
3.React Native組件的生命周期
生命周期 | 調(diào)用次數(shù) | 能否使用 setSate() |
---|---|---|
getDefaultProps | 1(全局調(diào)用一次) | 否 |
getInitialState | 1 | 否 |
componentWillMount | >=1 | 是(但是毫無意義) |
componentDidMount | 1 | 是(會導(dǎo)致組件在初始化的時候就觸發(fā)了更新,渲染了兩遍,應(yīng)該盡量避免) |
componentWillReceiveProps | >=0 | 是 |
shouldComponentUpdate | >=0 | 否 |
componentWillUpdate | >=0 | 否 |
componentDidUpdate | >=0 | 否 |
componentWillUnmount | 1 | 是(無意義) |
4.Redux中同步 action 與異步 action 最大的區(qū)別是什么
同步只返回一個普通 action 對象。而異步操作中途會返回一個 promise 函數(shù)。當(dāng)然在 promise 函數(shù)處理完畢后也會返回一個普通 action 對象。thunk 中間件就是判斷如果返回的是函數(shù),則不傳導(dǎo)給 reducer,直到檢測到是普通 action 對象,才交由 reducer 處理。
5.redux狀態(tài)管理的流程
action是用戶觸發(fā)或程序觸發(fā)的一個普通對象。 reducer是根據(jù)action操作來做出不同的數(shù)據(jù)響應(yīng),返回一個新的state。 store的最終值就是由reducer的值來確定的。(一個store是一個對象, reducer會改變store中的某些值) action -> reducer -> 新store -> 反饋到UI上有所改變。
6.reactJS的props.children.map函數(shù)來遍歷會收到異常提示,為什么?應(yīng)該如何遍歷?
this.props.children 的值有三種可能:
- 當(dāng)前組件沒有子節(jié)點(diǎn),它就是 undefined
- 有一個子節(jié)點(diǎn),數(shù)據(jù)類型是 object
- 有多個子節(jié)點(diǎn),數(shù)據(jù)類型就是 array
所以系統(tǒng)提供React.Children.map()方法安全的遍歷子節(jié)點(diǎn)對象
7.調(diào)用 setState 之后發(fā)生了什么?
當(dāng)調(diào)用 setState 時,React會做的第一件事情是將傳遞給 setState 的對象合并到組件的當(dāng)前狀態(tài)。 這將啟動一個稱為和解(reconciliation)的過程。 和解(reconciliation)的最終目標(biāo)是以最有效的方式,根據(jù)這個新的狀態(tài)來更新UI。 為此,React將構(gòu)建一個新的 React 元素樹(您可以將其視為 UI 的對象表示)。 一旦有了這個樹,為了弄清 UI 如何響應(yīng)新的狀態(tài)而改變,React 會將這個新樹與上一個元素樹相比較( diff )。 通過這樣做, React 將會知道發(fā)生的確切變化,并且通過了解發(fā)生什么變化,只需在絕對必要的情況下進(jìn)行更新即可最小化 UI 的占用空間。
8.shouldComponentUpdate 的作用是啥以及為何它這么重要?
shouldComponentUpdate 允許我們手動地判斷是否要進(jìn)行組件更新,根據(jù)組件的應(yīng)用場景設(shè)置函數(shù)的合理返回值能夠幫我們避免不必要的更新。
其實(shí)這個問題也是跟reconciliation有關(guān)系。 “和解( reconciliation )的最終目標(biāo)是以最有效的方式,根據(jù)新的狀態(tài)更新用戶界面”。 如果我們知道我們的用戶界面(UI)的某一部分不會改變, 那么沒有理由讓 React 很麻煩地試圖去弄清楚它是否應(yīng)該渲染。 通過從 shouldComponentUpdate 返回 false, React 將假定當(dāng)前組件及其所有子組件將保持與當(dāng)前組件相同
9.props和state相同點(diǎn)和不同點(diǎn)
相同點(diǎn):
- 不管是props還是state的改變,都會引發(fā)render的重新渲染
- 都能由自身組件的相應(yīng)初始化函數(shù)設(shè)定初始值
不同點(diǎn):
- 初始值來源:state的初始值來自于自身的getInitalState(constructor)函數(shù);props來自于父組件或者自身getDefaultProps(若key相同前者可覆蓋后者)
- 修改方式:state只能在自身組件中setState,不能由父組件修改;props只能由父組件修改,不能在自身組件修改
- 對子組件:props是一個父組件傳遞給子組件的數(shù)據(jù)流,這個數(shù)據(jù)流可以一直傳遞到子孫組件;state代表的是一個組件內(nèi)部自身的狀態(tài),只能在自身組件中存在。
10.React中Element 和 Component 有何區(qū)別?
簡單地說,一個 React element 描述了你想在屏幕上看到什么。
換個說法就是,一個 React element 是一些 UI 的對象表示。
一個 React Component 是一個函數(shù)或一個類,
它可以接受輸入并返回一個 React element
(通常是通過 JSX ,它被轉(zhuǎn)化成一個 createElement 調(diào)用)。