Class extends React.Component can't use getInitialState in React

Reactjs

Reactjs Problem Overview


I'm tring the ES6 syntax in React, and write the components like:

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

but the browser throws me a waring about:

> Warning: getInitialState was defined on Loginform, a plain JavaScript > class. This is only supported for classes created using > React.createClass. Did you mean to define a state property instead?

I can handle it with the traditional syntax var Loginform = React.createClass but what's correct ES6 syntax?

Another little thing, I think in traditional syntax React.createClass is an object, so the functions in it is separated by comma, but with the extends class it require semicolon, I don't understand it well.

Reactjs Solutions


Solution 1 - Reactjs

You don't need semicolons or commas between ES6 class method declarations.

For ES6 classes, getInitialState has been deprecated in favor of declaring an initial state object in the constructor:

export default class Loginform extends React.Component {
  constructor(props, context) {
    super(props, context);
    
    this.state = {
      name: '',
      password: ''
    };
  };
}

Solution 2 - Reactjs

ES6 example: 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,
};

Solution 3 - Reactjs

If we use class field, following is working.

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

This can be used instead of

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrick YangView Question on Stackoverflow
Solution 1 - ReactjsmaxView Answer on Stackoverflow
Solution 2 - ReactjsJuan Carlos ConstantineView Answer on Stackoverflow
Solution 3 - Reactjslingjin.wView Answer on Stackoverflow