1、React中的key值的作用是什么?
react中key值主要是用來識別組件的,key值相同時,在后期操作的時候,react在創建key值相同的組件時,遇到key值相同的,不會重新創建;
有了key值之后,key值與組件就會形成一種對應的關系,react會根據key值來絕對組件的創建銷毀或者更新;
如果key值相同,組件的屬性發生了變化,這時組件不會被銷毀,只會對響應的屬性進行更新;
如果key值不同,那么組件會先被銷毀,之后再重新創建;
2、react中的性能優化有哪些方式?
1)react通過操縱虛擬DOM,不進行節點操作,最大限度的減少與真實DOM的交互,這樣可以提高性能;
2)shouldComponentUpdate,在這個生命周期內,我們可以進行新舊兩個state和props的對比,如果數據沒有發生變化,這個函數就會返回false,這樣后面的生命周期就不會執行,render函數也不會重新渲染,這樣也可以提升性能;
3)immutable,immutable的特點就是不可修改,改變它的任何數據時,都會重新生成一個新的對象,修改只會在新生成的對象上修改,原數據不會發生改變,這樣就可以避免把所有節點都復制一遍,降低性能損耗;immutable的實現原理就是數據結構共享;
3、react中如何修改state中的數據?this.setState是同步的還是異步的?this.setState中的第二個參數的作用是什么?為什么是異步的?
1)通過this.setState來修改state中的數據;
2)this.setState是異步的;
3)其中有兩個參數,第一個參數是一個對象或者是一個函數(必須返回一個對象),
函數中的第一個值為(prevState),第二個參數是(prevProps)
例:
this.setState((prevState,prevProps)=>({ }))
4)為什么是異步的,一位state可以批量執行,也就是說當多個setState一起同時執行時會被合並,提高DOM的渲染效率;
5)this.setState什么時候是同步的?原生js綁定的事件,setTimeout/setInterval等,(就是不受react機制控制時)
6)this.setState本身其實是一個同步的,異步不是因為本身的運行機制或者代碼,而是因為他所在的合成事件和鈎子函數的調用順序在更新之前,導致函數內沒法立即拿到更新后的值,形成了所謂的異步,可以通過第二個參數中的callback拿到更新后的結果;
4、render函數什么時候會執行?
當this.setState發生變化時就會更新;
5、this.setState執行后會執行哪些生命周期函數?
shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate
6、call、apply、bind三者之間的區別?
call和apply都是直接調用函數的;
bind每次調用執行的時候都會返回一個新的函數體,新的函數體內部的this指向才是我們需要改變指向的this;
7、組件第一次加載時執行的生命周期有哪些?
constructor、componentWillMount、render、componentDidMount
8、哪些生命周期會執行一次?
constructor、componentwillMount、componentDidMount、componentWillUnmount
9、哪些生命周期會執行多次?
render、componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、componentDidUpdate
10、當this.props執行后會執行哪些生命周期?
componentWillRecevieProps、shouldcomponentUpdate、componentWillUpdate、render、componentDidUpdate
11、當組件的key值發生變化時會執行哪些生命周期?
componentWillMount、constructor、componentWillMount、render、componentDidMount
12、react中如何創建一個組件?
1)class 組件名稱 extends Component{ };
2)var App=React.createClass({ });
13、react中如何定義自定義屬性,以及限制外部數據的類型?
自定義屬性:
組件名稱.defaultProps={
key:val,
}
限制外部數據類型:引入第三方依賴propsTypes;
組件名稱.propsTypes={
key:propsTypes.類型
}
14、react中常用的路由配置項?
BrowserRouter 路由根組件,路徑不帶#號history路由
HashRouter 路由根組件,路徑帶#號hash路由
withRouter 對非路由渲染的組件組件進行包裹,讓其具備三個屬性
Route 定義路由
Link 路由跳轉,沒有動態屬性,使用場景,非tabBar
NavLink 路由跳轉,有動態屬性,使用場景,tabBar
Switch 路由渲染,被其包裹的組件只會被渲染一個,包裹時最好將子組件 放在這個標簽之外,父組件放在內部
Redirect 路由重定向
15、reatc路由中Route渲染組件的方法有哪幾種?區別是什么?
1)component:使用component渲染的路由組件會有三個自帶的屬性,localtion、history、match,他的缺點是不可以進行傳參,不可以渲染非組件標簽;
2)render:使用render渲染的路由組件可以進行路由傳參,可以渲染非組件標簽,但是不具備三個屬性,如果需要使用的話,需要傳參傳遞進來;
16、如何控制路由的路徑完全匹配?
在NavLink或者Route標簽中添加exact屬性,是路徑完全匹配
17、react中路由傳遞參數的方法有哪些?
動態路由:
定義路由時:采用/:/:這種形式;
路由跳轉時:路徑+key形式;
接收:this.props.match.params;
query傳值:
定義路由時:與正常時相同;
路由跳轉時:使用字符串拼接;
接收:this.props.location.search
對象傳值:
定義路由時:與正常時相同;
路由跳轉時:使用對象,內部包含定義路徑的對象和傳遞參數的對象;
接收:this.props.history.query
編程式導航:
this.props.history.push({路徑部分},{參數部分})
注意:使用對象傳值以及編程式導航傳值時如果頁面刷新,那么傳遞的值就會消失;