想到一个简单的例子,例如:
class CommentAreaComponent extends React.Component {
static propTypes = {
id: PropTypes.string.isRequired,
loading: PropTypes.bool,
};
static defaultProps = {
loading: false,
};
在构造函数中,我可以定义类似的东西来实现(我认为)同样的事情:
class MyComponent extends React.Component {
constructor({
loading = false,
}:{
id:string,
loading?:boolean
}) {
super(arguments[0]);
}
}
第二个例子是仅使用Flowtype。使用Reacts PropTypes和DefaultProps是否有优势?或者我可以在使用FlowType时完全删除它们吗?
答案 0 :(得分:7)
您肯定可以使用Flow类型而不是React PropTypes,但您提出的语法并不常见。请参阅Flow docs(向下滚动以查看ES6语法):
class Button extends React.Component {
props: {
title: string,
visited: boolean,
onClick: () => void,
};
state: {
display: 'static' | 'hover' | 'active';
};
static defaultProps = {
visited: false,
};
constructor(props) {
super(props);
this.state = {
display: 'static',
};
}
render() {
let className = 'button ' + this.state.display;
if (this.props.visited) {
//...
}
return (/*...*/);
}
}
您可以使用PropTypes对Flow类型做的唯一事情是定义custom validators(例如,检查道具是否是有效的电子邮件)。
我有更多Flow React examples on github,但我还没有使用Flow v0.22测试它们,只有v0.21。他们可能需要稍作调整。
答案 1 :(得分:3)
作为一般规则,Flow的静态分析将为您提供更大的力量和更大的覆盖面,因此优于propTypes
。
然而,propTypes
仍然很好,如果您可能是通过多个组件传播对象,或者在其他动态运行时场景中道具可能没有您期望的值。
考虑使用https://github.com/brigand/babel-plugin-flow-react-proptypes
充分利用两者注意:我不隶属于此库。