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.子組件怎向父組件傳值+
- 父組件通過props來傳遞事件的引用,並通過回調的方式來實現。
- 還可以通過context, context可以跨級從父組件向子組件傳值,也可以子組件來獲取和設置父組件暴露出來的屬性值。
8.知道hooks嗎?爲什麼會出現hooks?++
第一問,把hooks的用法,及注意點答出來就可以了。
- 使函數式組件也有自己的內部狀態
- 代碼量更少
- 更容易拆分
9.受控組件和非受控組件的區別+
受控組件狀態由父組件維護,非受控組件狀態由自身維護。受控組件設置value,非受控組件不設置value。
10.react、vue相較與jquery的優勢+
- react/vue組件化開發,容易複用
- 維護的優勢
- 虛擬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>