我看到这两种用法可以互换。
两者的主要用例是什么?有什么优点/缺点吗?一种做法更好吗?
我看到这两种用法可以互换。
两者的主要用例是什么?有什么优点/缺点吗?一种做法更好吗?
当前回答
在构造函数中,我们应该总是初始化状态。
其他回答
构造函数和getInitialState之间的区别是ES6和ES5本身的区别。 getInitialState与React一起使用。createClass和 构造函数与React.Component一起使用。
因此,问题归结为使用ES6或ES5的优点/缺点。
让我们看看代码中的区别
ES5
var TodoApp = React.createClass({
propTypes: {
title: PropTypes.string.isRequired
},
getInitialState () {
return {
items: []
};
}
});
ES6
class TodoApp extends React.Component {
constructor () {
super()
this.state = {
items: []
}
}
};
reddit上有一个关于这方面的有趣帖子。
React社区正在向ES6靠拢。它也被认为是最佳实践。
React之间有一些区别。createClass和React.Component。例如,在这些情况下是如何处理的。在这篇博文和facebook关于自动绑定的内容中阅读更多关于这些差异的内容
构造函数也可用于处理此类情况。要将方法绑定到组件实例,可以在构造函数中对其进行预绑定。这是做这么酷的东西的好材料。
还有一些关于最佳实践的好材料 React.js中组件状态的最佳实践 将React项目从ES5转换为ES6
更新日期:2019年4月9日:
随着Javascript类API的新变化,您不需要构造函数了。
你可以这样做
class TodoApp extends React.Component {
this.state = {items: []}
};
这仍然会被转译为构造函数格式,但您不必担心。您可以使用这种更具可读性的格式。
React挂钩
从React 16.8版本开始,有一个新的API叫做hooks。
现在,您甚至不需要类组件来拥有状态。它甚至可以在功能组件中完成。
import React, { useState } from 'react';
function TodoApp () {
const items = useState([]);
注意,初始状态作为参数传递给useState;useState ([])
阅读更多关于react钩子的官方文档
最大的区别是从它们的来源开始,构造函数是JavaScript中类的构造函数,另一方面,getInitialState是React生命周期的一部分。
构造函数是你的类初始化的地方…
构造函数 构造函数方法是用于创建和的特殊方法 初始化用类创建的对象。只能有一个 类中名称为“构造函数”的特殊方法。一个SyntaxError 类中包含多个 构造函数方法。 类的构造函数可以使用super关键字调用 父类。
在React v16文档中,他们没有提到任何首选项,但如果你使用createReactClass(),你需要getInitialState…
初始状态设置 在ES6类中,你可以通过赋值来定义初始状态 这一点。构造函数中的状态:
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: props.initialCount};
}
// ...
}
使用createReactClass(),您必须提供一个单独的 返回初始状态的getInitialState方法:
var Counter = createReactClass({
getInitialState: function() {
return {count: this.props.initialCount};
},
// ...
});
更多信息请访问这里。
还创建了下面的图像来显示React组件的一些生命周期:
最大的区别是从它们的来源开始,所以constructor是JavaScript中类的构造函数,另一方面,getInitialState是React生命周期的一部分。构造函数方法是用于创建和初始化用类创建的对象的特殊方法。
这两种方法是不可互换的。当使用ES6类时,你应该在构造函数中初始化状态,并在使用React.createClass时定义getInitialState方法。
关于ES6类的主题,请参阅官方React文档。
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { /* initial state */ };
}
}
等于
var MyComponent = React.createClass({
getInitialState() {
return { /* initial state */ };
},
});
如果您正在使用ES6编写React-Native类,将遵循以下格式。它包括RN的生命周期方法,用于类进行网络调用。
import React, {Component} from 'react';
import {
AppRegistry, StyleSheet, View, Text, Image
ToastAndroid
} from 'react-native';
import * as Progress from 'react-native-progress';
export default class RNClass extends Component{
constructor(props){
super(props);
this.state= {
uri: this.props.uri,
loading:false
}
}
renderLoadingView(){
return(
<View style={{justifyContent:'center',alignItems:'center',flex:1}}>
<Progress.Circle size={30} indeterminate={true} />
<Text>
Loading Data...
</Text>
</View>
);
}
renderLoadedView(){
return(
<View>
</View>
);
}
fetchData(){
fetch(this.state.uri)
.then((response) => response.json())
.then((result)=>{
})
.done();
this.setState({
loading:true
});
this.renderLoadedView();
}
componentDidMount(){
this.fetchData();
}
render(){
if(!this.state.loading){
return(
this.renderLoadingView()
);
}
else{
return(
this.renderLoadedView()
);
}
}
}
var style = StyleSheet.create({
});