跳到主要内容

为什么 React 团队在函数式组件中弃用了 defaultProps

源链接

简单来说,就是没有必要。

在函数式组件中,我们完全可以使用用JS默认参数的形式,来申明默认属性,代码如下:

function Foo({foo = 1, bar = "hello"}) {
let props = {foo, bar};
//...
}

对于大多数团队来说 ReactdefaultProps 是一个黑盒,如果我们把默认属性的行为放在函数组件定义中,从代码质量来说更加可控。

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 团队的后续更新中已经实现:在函数是组件中使用defaultPropsReact会在createElement中添加一个警告。这包括其他特殊组件,如forwardRef和memo

总结:在函数式组件中应当使用JS函数默认参数定义组件默认属性,避免使用 defaultProps