Je suis nouveau sur React et Javascript et j'essaye de rendre le composant React suivant:
'use strict';
var React = require('react');
import ToReadList from './toreadlist.js';
var ToRead = React.createClass({
getInitialState: function() {
return { bookTitles: [] };
},
handleSubmit: function(e) {
e.preventDefault();
this.state.bookTitles.Push(React.findDOMNode(this.refs.bookTitleInput).value.trim());
this.setState({items: this.state.bookTitles});
},
render: function() {
return (<div>
<form onSubmit={this.handleSubmit}><input type="text" ref="bookTitleInput"></input>
<input type="submit"></input></form>
<ToReadList bookTitles={this.state.bookTitles} />
</div>
);
}
});
module.exports = ToRead;
Mais j'ai l'erreur suivante sur ma console: " Uncaught TypeError: Impossible de lire la propriété 'toUpperCase' of undefined "
J'ai essayé de déboguer (parce que l'erreur est obscure pour moi et qu'aucune ligne de mon code n'est indiquée) et j'ai remarqué que cette ligne particulière:
this.state.bookTitles.Push()
provoque l'erreur.
S'il vous plaît aider!
Edit L'erreur est provoquée par une fonction d'injection de webpack var:
function autoGenerateWrapperClass(type) {
return ReactClass.createClass({
tagName: type.toUpperCase(),
render: function() {
return new ReactElement(
type,
null,
null,
null,
null,
this.props
);
}
});
}
Mes excuses pour la mauvaise qualité de ce post.
J'ai résolu le problème.
Enfin, le problème provient du composant inclus:
<ToReadList bookTitles={this.state.bookTitles} />
L'erreur est apparue lorsque this.state.bookTitles.Push(React.findDOMNode(this.refs.bookTitleInput).value.trim());
a été appelé car bookTitles
déclenche l'erreur à l'intérieur du composant lorsqu'il n'est pas vide (i.e <ToReadList bookTitles={["mastery", "foundation"]} />
déclenche exactement la même erreur).
Le code correspondant à la question est en tant que tel:
'use strict';
var React = require('react');
import {ToReadListItem} from './todoreadlistitem.js';
var ToReadList = React.createClass({
render: function() {
return (<ul>
{this.props.bookTitles.map(function(bookTitle){
return (<li>
<ToReadListItem bookTitle={bookTitle} isChecked={false}/>
</li>);
})}
</ul>);
}
});
module.exports = ToReadList;
Changer cette ligne:
import {ToReadListItem} from './todoreadlistitem.js';
Pour ça:
import ToReadListItem from './todoreadlistitem.js';
Je sais que ce n’est pas une bonne idée de mélanger la syntaxe es6 avec une syntaxe plate, mais je me permets de le faire car l’application est conçue à des fins d’expérimentation.
J'espère que j'ai aidé à rendre les choses plus claires.
findDOMNode()
utilise la fonction toUpperCase()
qui est appelée en fait sur un null.
Exemple
var x = null
x.toUpperCase()// results in this error.
Si vous pouviez publier le code findDOMNode()
, nous pourrions retracer l'erreur.
OU
Assurez-vous que la toUpperCase()
est appelée sur un non-null object
.
Je suppose que le problème vient du fait que vous essayez de modifier directement l’état. Essaye ça:
var newBookTitles = this.state.bookTitles;
var value = React.findDOMNode(this.refs.bookTitleInput).value.trim();
newBookTitles.Push(value);
this.setState({bookTitles: newBookTitles});
J'espère que cela résoudra votre problème.
Importer un composant avec un nom incorrect m'a donné la même erreur.
Je l'avais importé en tant que var AreaChart = Charts.AreaChart;
où comme dans Charts.js
, il a été exporté avec un petit 'c':
Areachart: Areachart
Le changer en AreaChart: Areachart
dans Charts.js
lors de l'exportation l'a résolu.