Je veux ajouter quelques règles pour les accessoires:
import React, { Component } from 'react'
export default class App extends Component {
static propTypes = { name: React.PropTypes.string.isRequired };
render() {
return(
)
}
}
Mais j'ai eu une erreur:
Warning: Failed prop type: Required prop `name` was not specified in `App`.
J'ai cette configuration pour babel:
{
"presets": ["es2015", "react"],
"plugins": ["transform-runtime", "transform-class-properties"]
}
Qu'est-ce que j'ai mal fait?
Upd. Changer le code: utilisez static
Il semble que vous ne transpiliez pas votre code de manière à reconnaître les propriétés de classe statiques. Si vous utilisez babel, vous pouvez l'activer à l'aide de la transformation de propriété de classe: https://babeljs.io/docs/plugins/transform-class-properties/ .
Dans notre base de code, nous avons cette fonctionnalité avec le préréglage Stage 1, https://babeljs.io/docs/plugins/preset-stage-1/
Bien sûr, vous pouvez toujours définir vos types sur la classe:
export default class App extends Component {
...
render() {
...
}
}
App.propTypes = {
data: PropTypes.object.isRequired...
}
^^ cela ne nécessite aucune transpilation spéciale.
La propriété statique de la classe est agréable mais vous pouvez la configurer comme ceci
export default class App extends Component {
static propTypes = { name: React.PropTypes.string.isRequired };
render() {...}
}
plutôt que de définir les propTypes sur this
dans le constructeur.
Il s'agit d'une propriété statique de la classe ES7.
Vous pouvez l'utiliser avec babel-presets-stage-1
. Voici la doc http://babeljs.io/docs/plugins/preset-stage-1/ et http://babeljs.io/docs/plugins/transform-class -Propriétés/
Si vous souhaitez utiliser toutes les fonctionnalités de ES7, vous devez simplement installer le babel-preset-stage-0
.
npm install babel-preset-stage-0 --save-dev
Étant donné que la dépendance stage-0
est stage-1
, stage-1
dépendance stage-2
et ainsi de suite. La npm
installera toutes les dépendances. Vous pouvez donc utiliser toutes les fonctionnalités de l'ES7.
Je laisse cette réponse pour les commentaires, mais la réponse de Timothy concernant Babel est meilleure.
Dans ES6, les classes ont des méthodes, et c'est tout - pas même les propriétés, encore moins les propriétés statiques:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static
ES2017 peut prendre en charge un mécanisme de propriété différent:
_ { https://esdiscuss.org/topic/es7-property-initializers } _
Cette question est étroitement liée à alternatives de variables de classe ES6 et est probablement une dupe.
UTILISATION DE BABEL 7
À partir de babel v7.1.0, pour utiliser les propriétés de classe statiques ainsi que celles déclarées avec la syntaxe de la propriété initializer, vous devez installer un plugin comme ci-dessous:
npm install --save-dev @babel/plugin-proposal-class-properties
En outre, tous les préréglages annuels de babel étaient obsolètes. Par conséquent, au lieu d'utiliser es2015
, installez et utilisez simplement @babel/preset-env
à côté de @babel/preset-react
. Votre configuration babel devrait ressembler à celle ci-dessous:
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": [["@babel/plugin-proposal-class-properties", { "loose": true }],]
}
En savoir plus sur le plugin ici .
Avec les installations et les configurations ci-dessus, vous pouvez réécrire votre composant comme suit:
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>
);
}
}
Et voila ça marche !!
NOTE: PropTypes
n'est plus dans le package react
, vous devez l'importer séparément du package prop-types
.