J'essaye mon premier morceau de React.js et je suis perplexe au début ... J'ai le code ci-dessous, qui rend un formulaire de recherche dans <div id="search"></div>
. Mais taper dans le champ de recherche ne fait rien.
Il manque probablement quelque chose en passant les accessoires et l'état de haut en bas, et cela semble être un problème courant. Mais je suis perplexe - je ne vois pas ce qui manque.
var SearchFacet = React.createClass({
handleChange: function() {
this.props.onUserInput(
this.refs.searchStringInput.value
)
},
render: function() {
return (
<div>
Search for:
<input
type="text"
value={this.props.searchString}
ref="searchStringInput"
onchange={this.handleChange} />
</div>
);
}
});
var SearchTool = React.createClass({
render: function() {
return (
<form>
<SearchFacet
searchString={this.props.searchString}
onUserInput={this.props.onUserInput}
/>
<button>Search</button>
</form>
);
}
});
var Searcher = React.createClass({
getInitialState: function() {
return {
searchString: ''
}
},
handleUserInput: function(searchString) {
this.setState({
searchString: searchString
})
},
render: function() {
return (
<div>
<SearchTool
searchString={this.state.searchString}
onUserInput={this.handleUserInput}
/>
</div>
);
}
});
ReactDOM.render(
<Searcher />,
document.getElementById('searcher')
);
(Finalement, j'aurai d'autres types de SearchFacet*
mais j'essaye juste de faire fonctionner celui-ci.)
javascript
reactjs
Phil Gyford
la source
la source
this
lorsque vous saisissez le champ de texte. Il se peut que cethis
ne soit plus leSearcher
composant.this
à quel point dans le code? Essayer de se connecterSearcher.handleUserInput()
ouSearchFacet.handleChange()
ne fait rien.Réponses:
Vous n'avez pas correctement placé votre
onchange
accessoire dans leinput
. Il doit êtreonChange
en JSX.Le sujet du passage d'un
value
accessoire à un<input>
, puis de la modification de la valeur transmise en réponse à l'interaction de l'utilisateur à l'aide d'unonChange
gestionnaire est assez bien considéré dans la documentation .Ils font référence à de telles entrées en tant que composants contrôlés et font référence à des entrées qui permettent au DOM de gérer nativement la valeur de l'entrée et les modifications ultérieures de l'utilisateur en tant que composants non contrôlés .
Chaque fois que vous définissez l'
value
accessoire d'uninput
sur une variable, vous avez un composant contrôlé . Cela signifie que vous devez modifier la valeur de la variable par des moyens programmatiques ou bien l'entrée contiendra toujours cette valeur et ne changera jamais, même lorsque vous tapez - le comportement natif de l'entrée, pour mettre à jour sa valeur lors de la frappe, est remplacé par React ici.Donc, vous prenez correctement cette variable de state, et avez un gestionnaire pour mettre à jour l'état tout mis en place correctement. Le problème était que vous aviez
onchange
et non le bon,onChange
le gestionnaire n'a jamais été appelé et donc levalue
n'a jamais été mis à jour lorsque vous tapez dans l'entrée. Lorsque vous utilisezonChange
le gestionnaire est appelé, levalue
est mis à jour lorsque vous tapez et vous voyez vos modifications.la source
En utilisant
value={whatever}
, vous ne pourrez pas taper dans le champ de saisie. Vous devriez utiliserdefaultValue="Hello!"
.Voir https://facebook.github.io/react/docs/uncontrolled-components.html#default-values
De plus, le
onchange
devrait êtreonChange
comme le souligne @davnicwil.la source
value={whatever}
etvalue={this.state.myvalue}
. J'aurais dû faire cette clarification à la place: utiliseronChange={this.handleChange}
et quelque chose comme çahandleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },
rend les champs à nouveau mutables.defaultValue
sauve ma journée.Cela peut être dû au fait que la fonction onChange ne met pas à jour la valeur appropriée mentionnée dans l'entrée.
Exemple:
dans la fonction onChange, mettez à jour le champ de valeur mentionné.
la source
J'ai aussi le même problème et dans mon cas, j'ai injecté correctement le réducteur mais je ne pouvais toujours pas taper dans le champ. Il s'avère que si vous utilisez,
immutable
vous devez utiliserredux-form/immutable
.Notez que votre état doit être le même,
state->form
sinon vous devez configurer explicitement la bibliothèque, ainsi que le nom de l'étatform
. voir ce numérola source
Pour moi, le simple changement suivant a parfaitement fonctionné
la source
Dans un contexte de composant de classe ...
Si la méthode changeHandler est une fonction normale:
il peut être utilisé comme ça ...
onChange={(e)=>this.handleChange(e)}
Si la méthode changeHandler est une fonction de flèche:
il peut être utilisé comme ça ...
onChange={this.handle}
Et cela a résolu mon problème "Impossible de taper dans le champ de texte de saisie React".
la source