类扩展 React.Component 不能在 React 中使用 getInitialState

IT技术 reactjs
2021-04-16 04:00:08

我正在 React 中使用 ES6 语法,并编写如下组件:

export default class Loginform extends React.Component {
    getInitialState() {
        return {
          name: '',
          password: ''
        };
    };
}

但是浏览器让我担心:

警告:getInitialState 是在 Loginform 上定义的,它是一个普通的 JavaScript 类。这只支持使用 React.createClass 创建的类。你的意思是定义一个状态属性吗?

我可以用传统的语法处理它,var Loginform = React.createClass但什么是正确的 ES6 语法?

还有一点,我觉得在传统语法中React.createClass是一个对象,所以里面的函数用逗号分隔,但是对于extends需要分号类,我不太理解。

3个回答

ES6 类方法声明之间不需要分号或逗号。

对于 ES6 类,getInitialState已被弃用,以支持在构造函数中声明初始状态对象:

export default class Loginform extends React.Component {
  constructor(props, context) {
    super(props, context);

    this.state = {
      name: '',
      password: ''
    };
  };
}
你想在哪里调用它?在 ES6 中类this没有自动绑定,这可能是问题的一部分:facebook.github.io/react/blog/2015/01/27/...
2021-05-24 04:00:08
我有点喜欢 ES5 的方式 - 和 getInitialState()
2021-06-04 04:00:08
有了这个, when console.log(this.state.name),它会抛出一个关于Cannot read property 'state' of null
2021-06-14 04:00:08
引用链接文章:“ ReactcreateClass功能提供的优点之一是它自动将您的方法绑定到组件实例。例如,这意味着在单击回调this中将绑定到组件。随着转向 ES6 类,我们必须自己处理这个绑定。React 团队建议在构造函数中进行预绑定newmediacampaigns.com/blog/...
2021-06-16 04:00:08

ES6 示例:state、defaultProps、propTypes

import React from 'react'
import ReactDom from 'react-dom';
export default class Item extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            check:false,
        };
        this.click=this.click.bind(this);
    }
    click(){
       this.setState({check:true});
    }
    render(){
        const text=this.state.check?'yes':'no';
        return(<div onClick={this.click}>{this.props.name} : <b>{text}</b></div>)
    }

}

Item.defaultProps={
    comment:"default comment",
};
Item.propTypes={
    name:React.PropTypes.string.isRequired,
};

如果我们使用类字段,以下是有效的。

state = {
      name: '',
      password: ''
}

这可以用来代替

constructor(props, context) {
    super(props, context);

    this.state = {
      name: '',
      password: ''
    };
  };