2015-04-03 14 views
38

Czy obiekt statyki działa z klasami ES6 w React?Reakcja na statykę z klasami ES6

class SomeComponent extends React.Component { 

    render() { 
    // ... 
    } 

} 

React.statics = { 
    someMethod: function() { 
    //... 
    } 
}; 

Coś jak wyżej daje mi metodę niezdefiniowany someMethod kiedy robię SomeComponent.someMethod()

Odpowiedz

50

Działa tylko z React.createClass. Wystarczy zadeklarować metody jako statycznej metody klasy:

class SomeComponent extends React.Component { 

    static someMethod() { 
    //... 
    } 

    render() { 
    // ... 
    } 

} 

chodzi

React.statics = { ... } 

Jesteś dosłownie tworząc statics mienia na obiekcie React. Ta właściwość nie rozszerza twojego komponentu w sposób magiczny.

+2

Należy zauważyć, że właściwości babel i narzędzia jsx obsługują właściwości statyczne (na przykład 'statyczne typy propT = {...}'); ale to tylko propozycja ES7. Metody statyczne to ES6. – FakeRainBrigand

+0

robiąc to w ten sposób Zawsze otrzymuję komunikat "Nie można odczytać właściwości" _currentElement "błędu null, podczas gdy te same metody bez modyfikatora statycznego działają poprawnie. Nie używam żadnych zmiennych klasy w moich metodach ... – abimelex

-5

statics działa tylko dla React komponentów check docs.

+4

Czy OP nie ma komponentu reagującego? –

+1

To jest dokładnie Twoja odpowiedź. Co to jest OP? – Roman

+1

"OP" odnosi się do pytania lub do osoby, która napisała pytanie. Może po prostu sformułowałeś to nieco dziwnie, ponieważ jest to zdecydowanie składnik React. Nie utworzono go za pomocą 'React.createClass'. –

21

Chociaż statics działa tylko dla React.createClass, nadal można zapisać statyczne metody w notacji ES6. Jeśli używasz ES7, możesz również pisać właściwości statyczne.

Możesz napisać statykę wewnątrz ES6 klas + w ten sposób:

class Component extends React.Component { 
    static propTypes = { 
    ... 
    } 

    static someMethod(){ 
    } 
} 

lub na zewnątrz klasy jak ten:

class Component extends React.Component { 
    .... 
} 

Component.propTypes = {...} 
Component.someMethod = function(){....} 

Jeśli chcesz napisać jak to pierwsze, to trzeba ustawić stage: 0 na Babel (od czasu eksperymentu).

+1

Zauważ, że 'propTypes = ...' nie jest notacją ES6. – Bergi

+1

Masz rację, wygląda na to, że ES7 Property Initializer notation. http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#es7-property-initializers –

+3

Aby korzystać z ES7, musisz 'npm install babel -preset-stage-0', a następnie dodaj '' stage-0 "' do .babelrc jak: '{" presets ": [" es2015 "," react "," stage-0 "]}' – emisilva