2020-3月份前端面試總結——react框架相關

react框架相關

備註: + 代表被問到的次數,沒有 + 代表自己整理了,但沒被問到

生命週期+++

1.組件第一次被創建渲染

老版本

constructor()   //調用構造函數
componentWillMount()  //以後要廢棄
render()
componentDidMount()

新版本

constructor()  //調用構造函數
static getDerivedStateFromProps()  //新增生命週期函數,從props計算出來的狀態
render()  //將虛擬dom渲染上去
componentDidMount()  //發送請求,拿數據 常用生命週期函數

2.組件已經渲染後,數據更新

老版本

父元素 render()
componentWillReceiveProps()  //以後要廢棄
sholdComponentUpdate()
componentWillUpdate()  //以後要廢棄
render()
componentDidUpdate()

新版本

static getDerivedStateFromProps()  //新增生命週期函數,重新從props計算出來新的狀態
shouldComponentUpdate()  //判斷要不要更新  更新返回true 不更新返回false 優化方面
render()  //將虛擬dom渲染上去
getSnapshotBeforeUpdata()  //新增生命週期函數   可以用來拿到dom更新之前的一些信息
componentDidUpdate()

3.組件卸載時

componentWillUnmount()

生命週期新舊的差異

因爲react16引入了feber架構,老的生命週期對其不太兼容,所以引入了新的生命週期。

其他react問題

1.steState是同步的還是異步的?或者2者都不準確?多個setState是怎麼更新的?++

有時是同步,又時是異步,具體要看怎麼使用,如果同步的使用setState則是異步合併上去的,如果將setState放在setTimeout等異步回調裏,則可以同步的拿到設置後的最新狀態。

多個setState在更新時會對其進行合併批量更新。

2.虛擬dom是怎麼提升性能的?++

虛擬 dom 相當於在 js 和真實 dom 中間加了一個緩存,利用 diff 算法避免了沒有必要的 dom 操作,從而提高性能。

3.diff算法的理解?++

由於找到最優解耗費的時間太長,所以採用3個策略。

1.dom結構發生變化直接刪除,重新創建,不再去比較子節點;

2.dom結構一樣的不會刪除,但會更新狀態

3.同一層級的子節點,他們要通過key來區分。

4.高階組件的理解嗎?++

高階組件是一個以組件爲參數並返回一個新組件的函數。最常見的就是 Redux 的 connect 函數。

5.Redux的流程,配合react怎麼使用?++

要點:單向數據流

使用:先將createStore從redux中引出來創建store,然後將Provider和connect從react-redux中引出,用Provider包着根組件,並將store傳入,需要訪問store的子組件,通過connect將store合併到子組件的props上,子組件就可以通過props獲得store的狀態。子組件可以通過dispatch一個action對象,然後reducer函數會通過action對象的type屬性,去觸發對應的函數,從而返回新的state來更改狀態。

6.react版本/相較與15,升級了什麼?++

我們用的是16.8 現在最新版本是16.13

新的diff算法,新的生命週期,hooks,feber架構,錯誤邊界捕獲,lazy

7.子組件怎向父組件傳值+

  1. 父組件通過props來傳遞事件的引用,並通過回調的方式來實現。
  2. 還可以通過context, context可以跨級從父組件向子組件傳值,也可以子組件來獲取和設置父組件暴露出來的屬性值。

8.知道hooks嗎?爲什麼會出現hooks?++

​ 第一問,把hooks的用法,及注意點答出來就可以了。

  1. 使函數式組件也有自己的內部狀態
  2. 代碼量更少
  3. 更容易拆分

9.受控組件和非受控組件的區別+

受控組件狀態由父組件維護,非受控組件狀態由自身維護。受控組件設置value,非受控組件不設置value。

10.react、vue相較與jquery的優勢+

  1. react/vue組件化開發,容易複用
  2. 維護的優勢
  3. 虛擬dom的實現

11.render和update哪個先執行?

componentWillUpdate() //在render之前執行
componentDidUpdate()  //在render之後執行

12.和視圖沒有關係的變量應該寫在哪裏?

​ 直接用this掛在實例上

13.setState除了傳對象還可以傳什麼?

​ 還可以傳函數,函數返回一個對象,可以讀取到上一次設置的最新狀態。

14.react寫的循環是返回一些JSX,爲什麼會在組件中寫一個key?

​ 爲了性能優化考慮,相同key的組件作比較,不然的話刪除中間組件,後邊的組件都要重新刪除渲染。

15.操作state中的數組時,用push還是concat?

​ 用concat,react中大多數情況是copy出一個值。而不是在原來的值上面進行修改。

16.使用過的redux中間件

​ thunk 解決異步問題

17.按需加載/分包

​ babel-plugin-import

18.介紹react優化

​ 減少組件的render shouldComponentUpdata()

19.介紹Immuable(不可變數據對象)

immer.js

20.高階使用

​ context 上下文 解決數據深層次傳遞問題

​ portal 用來解決由於父元素體積等限制問題,子元素不在父元素內渲染,但與父元素有事件交互

​ refs 用來獲取組件實例

​ suspense 爲了解決異步加載組件,組件沒加載期間,將頁面渲染成其他load組件

react-router問題

1.react-router裏的<Link> 標籤和<a> 標籤有什麼區別

​ Link靈活,會自動適配不同的歷史模式,無url模式,hash模式,html5模式

​ 不同模式渲染出來的a標籤的href屬性不一樣

​ Link的to屬性可以接受對象

2.<a> 標籤默認事件禁掉以後做什麼才能實現跳轉

​ history.pushState() 瀏覽器框發生改變,框架內部進行跳轉

3.react-router怎麼使用

 <Router history={history} createElement={createElement}>
   <Route path="/" component={App}>
     <Link />
     <Route path="*" component={NotFound} />
   </Route>
 </Router>

4.react-router的原理+

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章