React组件从props初始化状态

在React中,这两种实现之间有什么真正的区别吗?
一些朋友告诉我,FirstComponent就是模式,但我不明白为什么。SecondComponent似乎更简单,因为渲染只调用一次

第一:

从“React”导入React,{PropTypes}
类FirstComponent扩展了React.Component{
状态={
说明:“”
}
componentDidMount(){
const{description}=this.props;
this.setState({description});
}
渲染(){
常量{state:{description}}}=this;
返回(
<输入类型=“文本”值={description}/>
);
}
}
导出默认组件;

第二:

从“React”导入React,{PropTypes}
类SecondComponent扩展了React.Component{
状态={
说明:“”
}
建造师(道具)=&gt{
常量{description}=props;
this.state={description};
}
渲染(){
常量{state:{description}}}=this;
返回(
<输入类型=“文本”值={description}/>
);
}
}
导出默认组件;

更新:
我将setState()更改为this.state={}(感谢joews),但是,我仍然看不到区别。一个比另一个好吗

应该注意的是,复制从不更改为状态的属性(在这种情况下直接访问.props)是一种反模式。如果您有一个最终会更改但以.props中的值开头的状态变量,您甚至不需要构造函数调用-这些局部变量在调用父级构造函数后初始化:

类FirstComponent扩展React.Component{
状态={
x:this.props.initialX,
//您甚至可以调用函数和类方法:
y:this.someMethod(this.props.initialY),
};
}

这是一个与下面@joews的答案相当的速记。它似乎只适用于es6 transpilers的最新版本,我在一些网页设置中遇到了问题。如果这对您不起作用,您可以尝试添加babel插件babel插件转换类属性,或者您可以使用下面@joews提供的非速记版本

发表评论