Ich möchte einige Regeln für Requisiten hinzufügen:
import React, { Component } from 'react'
export default class App extends Component {
static propTypes = { name: React.PropTypes.string.isRequired };
render() {
return(
)
}
}
Aber ich habe einen Fehler bekommen:
Warning: Failed prop type: Required prop `name` was not specified in `App`.
Ich habe diese Konfiguration für Babel:
{
"presets": ["es2015", "react"],
"plugins": ["transform-runtime", "transform-class-properties"]
}
Was habe ich falsch gemacht?
Upd. Code ändern: use static
Es scheint, als würden Sie Ihren Code nicht so umwandeln, dass statische Klasseneigenschaften erkannt werden können. Wenn Sie Babel verwenden, kann dies mit der Class-Eigenschaftsumwandlung aktiviert werden: https://babeljs.io/docs/plugins/transform-class-properties/ .
In unserer Codebasis erhalten wir diese Funktionalität mit dem Stage 1-Preset https://babeljs.io/docs/plugins/preset-stage-1/ .
Natürlich können Sie Ihre Eigenschaften immer in der Klasse definieren:
export default class App extends Component {
...
render() {
...
}
}
App.propTypes = {
data: PropTypes.object.isRequired...
}
^^ das erfordert keine besondere Verwandlung.
Die statische Eigenschaft in der Klasse ist Nizza, sodass Sie sie so einrichten können
export default class App extends Component {
static propTypes = { name: React.PropTypes.string.isRequired };
render() {...}
}
anstatt die propTypes für this
im Konstruktor zu definieren.
Dies ist die statische Eigenschaftsfunktion der ES7-Klasse.
Sie können es mit babel-presets-stage-1
verwenden. Hier ist das Dokument http://babeljs.io/docs/plugins/preset-stage-1/ und http://babeljs.io/docs/plugins/transform-class -Eigenschaften/
Wenn Sie alle Funktionen von ES7 nutzen möchten, müssen Sie lediglich den babel-preset-stage-0
installieren.
npm install babel-preset-stage-0 --save-dev
Da stage-0
Abhängigkeit stage-1
ist, stage-1
Abhängigkeit stage-2
und so weiter. Die npm
installiert alle Abhängigkeiten. So können Sie alle ES7-Funktionen nutzen.
Ich lasse diese Antwort für die Kommentare, aber Timothys Antwort in Bezug auf Babel ist besser.
In ES6 haben Klassen Methoden, und das ist es - nicht einmal Eigenschaften, geschweige denn statisch:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static
ES2017 unterstützt möglicherweise einen anderen Eigenschaftsmechanismus:
https://esdiscuss.org/topic/es7-property-initializers
Diese Frage steht in engem Zusammenhang mit Variablenvariablen der ES6-Klasse und ist letztendlich wahrscheinlich ein Dupe.
BENUTZUNG VON BABEL 7
Zur Verwendung von statischen Klasseneigenschaften sowie von Eigenschaften, die mit der Eigenschaftsinitialisiersyntax deklariert wurden, müssen Sie ab babel v7.1.0 ein Plugin wie folgt installieren:
npm install --save-dev @babel/plugin-proposal-class-properties
Außerdem wurden alle jährlichen Voreinstellungen von Babel nicht mehr verwendet. Statt es2015
zu verwenden, müssen Sie statt @babel/preset-env
einfach @babel/preset-react
installieren und verwenden. Ihre Babel-Konfiguration sollte wie folgt aussehen:
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": [["@babel/plugin-proposal-class-properties", { "loose": true }],]
}
Lesen Sie mehr über das Plugin hier .
Mit den obigen Installationen und Konfigurationen können Sie Ihre Komponente wie folgt umschreiben:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
export default class App extends Component {
static propTypes = { name: PropTypes.string.isRequired };
render() {
return (
<div>Static Class Properties</div>
);
}
}
Und voila es funktioniert !!
NOTE: PropTypes
ist nicht mehr im react
-Paket, Sie müssen es separat aus dem prop-types
-Paket importieren.