static getDerivedStateFromProps()git
當本地state
須要根據props
來改變的時候可調用此方法。github
這個方法是在render()
前會被執行,只要執行render()
都會被在以前被觸發。web
該方法有兩個參數props
和state
; 返回值爲state
對象, 不須要返回總體state
,把須要改變的state
返回便可。性能優化
示例:dom
static getDerivedStateFromProps(props, state) { if(props.color !== state.color) { return {color: props.color}; } }
shouldComponentUpdate()函數
此方法有兩個參數:shouldComponentUpdate(nextProps, nextState)
.性能
返回值爲true
或者false
, 默認返回true
.優化
主要使用它來控制組件要不要渲然,經常使用做性能優化。this
觸發此方法的條件是:組件接收任意props
或者state
時都會被調用。須要注意的是在第一次render()
時和在調用forceUpdate()
時都不會被觸發。code
示例:
shouldComponentUpdate(nextProps, nextState) { if(nextProps.color !== this.props.color || nextState.size !== this.state.size) { return true; } return false; }
render()
這個方法是React組件中必需要提供的方法。當state
或者props
任一數據有更新時都會執行。
須要注意當繼承PureComponent
時,不會對對象進行深度比較,也就是,不會根據對象內的對象變化時執行render()
.
render()
是一個純函數,也就是不能在這個方法中有相似setState()
這樣的行爲。
返回的數據類型能夠有:
null
、String
、Number
、Array
、Boolean
。Portal
注意:不能返回
undefined
.
當shouldComponentUpdate()
返回false
時,不管state
和props
有沒有變化,這個方法都不執行。
示例:
render() { return ( <div>{this.state.color}</div> ); }
getSnapshotBeforeUpdate()
getSnapshotBeforeUpdate(prevProps, prevState)
在render
將組件渲然到dom
中就會執行。
若是不實現該方法則返回null.
返回的數據由本身定義,而且返回的數據做爲componentDidUpdate
方法中的參數。
示例:
class ScrollingList extends React.Component { constructor(props) { super(props); this.listRef = React.createRef(); } getSnapshotBeforeUpdate(prevProps, prevState) { if (prevProps.list.length < this.props.list.length) { const list = this.listRef.current; return list.scrollHeight - list.scrollTop; } return null; } render() { return ( <div ref={this.listRef}>{/* ...contents... */}</div> ); } }
componentDidUpdate()
該方法在組件更新後當即執行,而且在組件掛載階段不執行。
componentDidUpdate(prevProps, prevState, snapshot)
第三個參數就是上節中提到的。
示例:
componentDidUpdate(prevProps, prevState, snapshot) { if (snapshot !== null) { const list = this.listRef.current; list.scrollTop = list.scrollHeight - snapshot; } }
componentWillUnmount()
在組件被卸載或者銷燬的時候執行,方法中不能再有setState
的動做。
通常用做清除組件中起的定義器、webSocket
等。
示例:
componentWillUnmount() { if(this.timer) { window.clearInterval(this.timer); this.timer = null; } }
componentDidCatch()
componentDidCatch(error, info)
異常的處理。
只能捕獲組件樹的異常,沒法捕獲這個方法內的異常。
示例:
定義一下異常處理組件:
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, info) { this.setState({ hasError: true }); window.console.log(error, info); } render() { if (this.state.hasError) { return <h1>Something went wrong.</h1>; } return this.props.children; } }
使用這個異常組件:
<ErrorBoundary> <MyWidget /> </ErrorBoundary>
推薦閱讀《React 手稿》