2016-07-13 17 views
8

chcę dodać jakieś zasady rekwizytów:statyczne propTypes nie działa pod ES6

import React, { Component } from 'react' 

export default class App extends Component { 
    static propTypes = { name: React.PropTypes.string.isRequired }; 

    render() { 
    return(
    ) 
    } 
} 

Ale mam ten błąd:

Warning: Failed prop type: Required prop `name` was not specified in `App`. 

mam tę konfigurację dla babel:

{ 
    "presets": ["es2015", "react"], 
    "plugins": ["transform-runtime", "transform-class-properties"] 
} 

Co zrobiłem źle?

Aktualizacja. Zmień kod: użyj: static

+1

Możliwy duplikat [ES6 klasy zmiennych alternatyw] (http://stackoverflow.com/questions/22528967/es6-class-variable-alternatives) –

Odpowiedz

14

Wygląda na to, że nie transponujesz kodu w sposób umożliwiający rozpoznanie właściwości klasy statycznej. Jeśli używasz babel, można to włączyć, używając transformacji klasy: https://babeljs.io/docs/plugins/transform-class-properties/.

W naszej bazie kodu możemy uzyskać tę funkcjonalność z etapem 1 presetu, https://babeljs.io/docs/plugins/preset-stage-1/

Oczywiście zawsze można zdefiniować proptypes na klasy:

export default class App extends Component { 
    ... 
    render() { 
    ... 
    } 
} 

App.propTypes = { 
data: PropTypes.object.isRequired... 
} 

^^ ta nie wymaga specjalna transpozycja.

in klasie właściwość statyczna jest ładna, dzięki czemu można ustawić go tak jak to

export default class App extends Component { 
    static propTypes = { name: React.PropTypes.string.isRequired }; 
    render() {...} 
} 

zamiast definiować propTypes na this w konstruktorze.

+0

Och, fajnie; Nie wiedziałem nawet, że Babel to ma. –

+1

Włączyłem tę wtyczkę 'transform-class-properties', ale nadal otrzymuję ten błąd – Meldum

+0

Zmieniono na" statyczny "ale dostałem ten błąd:' Ostrzeżenie: Nieudany typ podpory: Wymagana nazwa podpory nie została określona w aplikacji. " – Meldum

1

Pozostawiam tę odpowiedź dla komentarzy, ale odpowiedź Timothy'ego na Babel jest lepsza.


W ES6, klasy mają metody, i to wszystko - nie właściwości nawet, nie mówiąc już statyczne:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static

ES2017 może obsługiwać inny mechanizm własności:

https://esdiscuss.org/topic/es7-property-initializers

To pytanie jest mocno powiązane z ES6 class variable alternatives an d jest ostatecznie prawdopodobnie dupe.

+0

tak powinno być coś takiego: 'constructor() {this.propTypes = {name: React.PropTypes.string.isRequired}; } '? – Meldum

+0

@Meldum Przypuszczam, ale to tworzy je dla każdego przypadku, który wydaje się być marnotrawstwem. –

+0

ES2016 nie będzie miał właściwości statycznych: http://www.2ality.com/2016/01/ecmascript-2016.html – zerkms

1

To jest właściwość statyczna klasy ES7.

Można go używać z babel-presets-stage-1. Oto doc http://babeljs.io/docs/plugins/preset-stage-1/ i http://babeljs.io/docs/plugins/transform-class-properties/

Jeśli chcesz korzystać ze wszystkich funkcji ES7, wystarczy zainstalować babel-preset-stage-0.

npm install babel-preset-stage-0 --save-dev 

Ponieważ stage-0 zależność jest stage-1, stage-1 zależność stage-2 i tak dalej.npm zainstaluje wszystkie zależności. Możesz więc korzystać ze wszystkich funkcji ES7.

+0

(już nie ES2016 :( –

0

ta nie działa dla mnie, bo zapomniałem ..

constructor(props) { 
    super(props) 
} 
Powiązane problemy