为什么 React 团队在函数式组件中弃用了 defaultProps
简单来说,就是没有必要。
在函数式组件中,我们完全可以使用用JS默认参数的形式,来申明默认属性,代码如下:
function Foo({foo = 1, bar = "hello"}) {
let props = {foo, bar};
//...
}
对于大多数团队来说 React
的 defaultProps
是一个黑盒,如果我们把默认属性的行为放在函数组件定义中,从代码质量来说更加可控。
而defaultProps
设计之出是为了什么呢?
React
团队认为 defaultProps
在类上非常有用,因为props
对象会被传递给许多不同的方法。生命周期、回调等等。每一个都在它自己的范围内。这使得它很难使用JS
默认参数,因为你必须在每个函数中复制相同的默认值。
简而言之,就是在每个生命周期和方法的作用域中可以使用新的默认值。
class Foo {
static defaultProps = {foo: 1};
componentDidMount() {
let foo = this.props.foo;
console.log(foo);
}
componentDidUpdate() {
let foo = this.props.foo;
console.log(foo);
}
componentWillUnmount() {
let foo = this.props.foo;
console.log(foo);
}
handleClick = () => {
let foo = this.props.foo;
console.log(foo);
}
render() {
let foo = this.props.foo;
console.log(foo);
return <div onClick={this.handleClick} />;
}
}
因此,在 React 团队的后续更新中已经实现:在函数是组件中使用defaultProps
,React
会在createElement
中添加一个警告。这包括其他特殊组件,如forwardRef和memo
。