面试题答案
一键面试getDerivedStateFromProps
方法更新 state
的原理
getDerivedStateFromProps
是 React 组件的静态方法,它在组件实例化之后,每次接收到新的 props
时都会被调用。其语法为:
static getDerivedStateFromProps(props, state) {
// 逻辑判断,根据props返回新的state,若不需要更新则返回null
if (props.someValue!== state.someValue) {
return { someValue: props.someValue };
}
return null;
}
它接收两个参数,props
是最新传入的属性,state
是当前的状态。该方法应该返回一个对象来更新状态,如果不需要更新则返回 null
。通过比较新的 props
和当前的 state
,我们可以决定是否需要更新 state
。
常见使用场景举例
- 根据 props 初始化 state
假设我们有一个
Counter
组件,它接收一个初始值initialCount
作为props
,我们可以使用getDerivedStateFromProps
来初始化state
中的count
。
import React, { Component } from'react';
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
static getDerivedStateFromProps(props, state) {
if (!state.initialized) {
return {
count: props.initialCount,
initialized: true
};
}
return null;
}
render() {
return <div>{this.state.count}</div>;
}
}
- 根据 props 更新 state
假设有一个
Image
组件,它接收src
属性,当src
变化时,我们需要更新state
中的imageLoaded
状态来表示图片是否加载完成。
import React, { Component } from'react';
class Image extends Component {
constructor(props) {
super(props);
this.state = {
imageLoaded: false
};
}
static getDerivedStateFromProps(props, state) {
if (props.src!== state.prevSrc) {
return {
imageLoaded: false,
prevSrc: props.src
};
}
return null;
}
handleImageLoad = () => {
this.setState({ imageLoaded: true });
};
render() {
return (
<img
src={this.props.src}
onLoad={this.handleImageLoad}
alt="example"
/>
);
}
}