记一次react报错(关于getDerivedStateFromProps)
在使用react16的时候遇到了:
componentWillReceiveProps has been renamed, and is not recommended for use;这个警告。
官方提供的解决方法有:
- 移动到componentDidUpdate
- 移至静态getDerivedStateFromProps
- 在非严格模式下使用UNSAFE_componentWillReceiveProps
使用componentDidUpdate替代componentWillReceiveProp,会有部分场景不适用,需要看情况使用
使用UNSAFE_componentWillReceiveProps,未来react版本升级会导致不可用。
综上:静态getDerivedStateFromProps替代componentWillReceiveProp是相对比较合适的方案。
getDerivedStateFromProps
这个生命周期的功能实际上就是将传入的props映射到state上面。
getDerivedStateFromProps是一个静态函数,也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state。
该函数必须有返回值。当props传入的内容不需要影响state,就必须返回一个null
static getDerivedStateFromProps(nextProps, prevState) {
const {type} = nextProps;
// 当传入的type发生变化的时候,更新state
if (type !== prevState.type) {
return {
type,
};
}
// 否则,对于state不进行任何操作
return null;
}
getDerivedStateFromProps和componentWillReceiveProps的区别
当外部多个属性在很短的时间间隔之内多次变化,就会导致componentWillReceiveProps被多次调用。这个调用并不会被合并,如果这次内容都会触发异步请求,那么可能会导致多个异步请求阻塞。
reactsetState操作是会通过transaction进行合并的,由此导致的更新过程是batch的,而react中大部分的更新过程的触发源都是setState,所以render触发的频率并不会非常频繁