1. 程式人生 > 其它 >2022年前端React的100道面試題的第8題:getDerivedStateFromProps方法

2022年前端React的100道面試題的第8題:getDerivedStateFromProps方法

問題

關於 static getDerivedStateFromProps 方法的理解正確的有哪些?

選項

A 會在呼叫 render 方法之後呼叫,並且在初始掛載及後續更新時都會被呼叫。

B 它應返回一個物件來更新 state,如果返回 null 則不更新任何內容。

C 存在只有一個目的:讓元件在 props 變化時更新 state。

D 是在16.4 版本新增的,用於替代 shouldComponentUpdate 生命週期。

答案

B、C

糾錯:

A 會在呼叫 render 方法之呼叫,並且在初始掛載及後續更新時都會被呼叫。

D 此生命週期是在 16.3 版本新增的,用於替代 componentWillReceiveProps

生命週期。 在 16.4 版本進行了優化,無論props還是state的修改都會觸發的渲染此生命週期,在上一個版本只會在 props 觸發渲染時更新。

(16.4 的優化後,便與 UNSAFE_componentWillReceiveProps 的執行時機不同,後者僅在父元件重新渲染時觸發,而不是在內部呼叫 setState 時。)

解答

此方法無權訪問元件例項。

static getDerivedStateFromProps 生命週期是接受 props 和 state 引數的純函式。

它的執行順序

  1. constructor()

  2. static getDerivedStateFromProps()

  3. render()

  4. componentDidMount()

觸發此生命週期的時機

  • state 修改時觸發的渲染時;

  • props 修改時觸發的渲染時;

  • 父元件重新渲染時;

此生命週期和 shouldComponentUpdate(props, state) 的區別

前置控制 state 的修改,後置控制 render 是否允許被執行。

此生命週期和 UNSAFE_componentWillReceiveProps(nextProps: any): void 的區別

static getDerivedStateFromProps() 後,UNSAFE_componentWillReceiveProps

將不會再執行,且後置不會再設定 setState() 觸發。

作用 state 的方式

如果不做任何返回,或者返回空物件,都不會對 state 有任何影響。因為它返回的是一個乾淨的物件,會 merge 到 state 物件上作為最新的資料狀態值。從 TS 函式定義檢查考慮,如果有邏輯中的 return,建議在函式最後提供一個預設返回值 return null

使用方式

當判斷 props 是否發生修改時,需要先儲存 props 的值,然後對比上次和本次的 props 是否有差異,如果有差異才重新渲染此元件。

class EmailInput extends Component {
state = {
email: this.props.email,
preEmail: this.props.email,
};

static getDerivedStateFromProps(props, state) {
if (props.email !== state.preEmail) {
return { email: props.email, preEmail: props.email };
}
return null
}

render() {
return <input onChange={this.handleChange} value={this.state.email} />;
}

handleChange = event => {
this.setState({ email: event.target.value });
};
}

官方提醒

舊的 componentWillReceiveProps 和新的 getDerivedStateFromProps 方法都會給元件增加明顯的複雜性。為了比對 props 的變化,往往需要用 props 中的屬性作為 state 作為初始化,因為上面的觸發時機,會導致覆蓋元件內部在 state 的值。這樣做會導致 state 後沒有正確渲染

資料

React生命週期

來源

搜尋《考試競技》微信小程式