2015-10-31 8 views
65

jestem tring składnię ES6 w React i pisać komponenty takie jak:klasa rozszerza React.Component nie można używać getInitialState w React

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

ale przeglądarka rzuca mi Waring o:

Ostrzeżenie: getInitialState został zdefiniowany w Loginform, zwykłej klasie JavaScript . Ta funkcja jest obsługiwana tylko w przypadku klas utworzonych przy użyciu parametru React.createClass: . Czy zamiast tego chciałeś zdefiniować właściwość stanu?

Potrafię sobie z tym poradzić przy użyciu tradycyjnej składni var Loginform = React.createClass, ale jaka jest prawidłowa składnia ES6?

Inna mała rzecz, myślę, że w tradycyjnej składni React.createClass jest obiektem, więc funkcje w nim są oddzielone przecinkiem, ale z klasą extends wymaga średnika, nie rozumiem tego dobrze.

+0

Możliwa duplikat [Dlaczego czy getInitialState nie jest wywoływany dla mojej klasy React?] (http://stackoverflow.com/questions/31709258/why-is-getinitialstate-not-being-called-for-my-react-class) –

+0

@FelixKling sure. przepraszam –

Odpowiedz

134

Nie potrzebujesz średników ani przecinków między deklaracjami metod klasy ES6.

Dla klas ES6, getInitialState została zastąpiona deklarując początkowy obiekt stanu w konstruktorze:

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

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

Dzięki temu, gdy 'console.log (this.state.name)', rzuca błąd o 'Nie można odczytać stanu właściwości 'null' –

+4

Gdzie próbujesz go nazwać? W klasach ES6 "ten" nie jest automatycznie związany, co może być częścią problemu: https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html #autobinding – max

+0

tak, działa, thx, akceptowane! –

3

ES6 Przykład: Stan, 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, 
}; 
Powiązane problemy