J'essaie donc d'obtenir la valeur d'un élément select
dans reactjs, mais je n'arrive pas à le comprendre. La this.refs.selectElement.getDOMNode().value
arrive toujours sous la forme undefined
. Tous les autres contrôles du formulaire, comme text
, fonctionnent bien. Des idées? Est-ce que vous ne pouvez pas obtenir la valeur de l'élément select
via refs
et devez utiliser l'événement onChange
?
Mis à jour:
var TestSelectClass = React.createClass({
mixins: [Router.Navigation],
_handleDube: function(event) {
DubeActionCreators.DubeTest({
message: this.refs.message.getDOMNode().value,
tax: this.refs.tax.getDOMNode().value,
validity: this.refs.valid_for.getDOMNode().value
});
},
render: function() {
return (
<ReactBootstrap.ListGroup>
<textarea
className="form-control"
rows="3"
placeholder="Enter message"
ref="message" >
</textarea>
<div className="input-group">
<span className="input-group-addon" id="basic-addon1">$</span>
<input type="text" className="form-control" placeholder="10" aria-describedby="basic-addon1" ref="tax" />
</div>
<Input type="select" value="1" ref="valid_for">
<option value="1">1 hour</option>
<option value="2">1 day</option>
<option value="2">5 days</option>
</Input>
</ReactBootstrap.ListGroup>
)
}
});
Mise à jour: Solution Donc, si quelqu'un rencontre un problème similaire, apparemment, si vous utilisez react-bootstrap, vous ne pouvez pas accéder à l'élément Input
si vous l'avez encapsulé dans un ListGroup
. Vous pouvez le retirer ou envelopper tous les Input
éléments dans un <form>
tag. Cela a résolu mon problème, merci pour toute l'aide.
Je vois que vous utilisez react-bootstrap , qui inclut un wrapper autour des éléments d’entrée habituels.
Dans ce cas, vous devez utiliser la fonction wrapper getInputDOMNode()
pour obtenir l'élément DOM réel de l'entrée sous-jacente. Mais vous pouvez également utiliser la fonction de commodité getValue()
que react-bootstrap fournit pour les éléments d'entrée .
Donc, votre _handleDube
fonction devrait ressembler à:
_handleDube: function(event) {
DubeActionCreators.DubeTest({
message: this.refs.message.getInputDOMNode().value,
tax: this.refs.tax.getInputDOMNode().value,
validity: this.refs.valid_for.getValue()
});
},
Voir ce JSFiddle pour un exemple complet: http://jsfiddle.net/mnhm5j3g/1/
c'est assez simple:
sur la méthode de rendu, vous devriez garder un œil sur la bind(this)
<select onChange={this.yourChangeHandler.bind(this)}>
<option value="-1" disabled>--</option>
<option value="1">one</option>
<option value="2">two</option>
<option value="3">three</option>
</select>
et votre gestionnaire est comme:
yourChangeHandler(event){
alert(event.target.value)
}
Créez une fonction handleChange (). Ensuite, mettez-le dans votre render () comme ceci:
<Input type="select" value="1" ref="valid_for" onChange={this.handleChange}>
Et la fonction dans le composant:
handleChange: function(e) {
var val = e.target.value;
},
"react": "^15.0.2",
"react-bootstrap": "^0.29.3",
"react-dom": "^15.0.2",
sous env, ReactDOM.findDOMNode () fonctionne pour moi.
dans render ():
<FormControl name="username" ref="username"/>
dans le gestionnaire ():
const username = findDOMNode(this.refs.username);
Aucun de ce qui précède n'a fonctionné pour moi. En fait, je devais passer par la hiérarchie du DOM pour trouver un moyen d'extraire la valeur. PS: j'ai fait pas utiliser ReactBootstrap.ListGroup
dans mon code. Juste le Input
de React Bootstrap. Voici mon code (ES6 +).
import ReactDOM from 'react-dom';
getValueFromSelect(ref){
var divDOMNode = ReactDOM.findDOMNode(ref);
/* the children in my case were a label and the select itself.
lastChild would point to the select child node*/
var selectNode = divDOMNode.lastChild;
return selectNode.options[selectNode.selectedIndex].text;
}
Les dépendances:
"react": "^0.14.3",
"react-bootstrap": "0.28.1",
"react-dom": "^0.14.3",
Les références en tant que chaînes sont considérées comme héritées et peuvent être déconseillées . Mais il semble que les composants de react-bootstrap ne fonctionnent pas avec les références de rappel. Je travaillais sur cela aujourd'hui pour gérer une entrée de recherche.
class SearchBox extends Component {
constructor(props, context) {
super(props, context);
this.handleChange = this.handleChange.bind(this);
}
handleChange() {
this.props.updateQuery(this._query.value);
}
render() {
// ...
<FormControl
onChange={this.handleChange}
ref={(c) => this._query = c} // should work but doesn't
value={this.props.query}
type="text"
placeholder="Search" />
// ...
}
}
J'ai fini par saisir l'événement de changement et en obtenir la valeur. Cela ne semble pas très "réactif", mais cela fonctionne.
class SearchBox extends Component {
constructor(props, context) {
super(props, context);
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
this.props.updateQuery(e.target.value);
}
render() {
// ...
<FormControl
onChange={this.handleChange}
value={this.props.query}
type="text"
placeholder="Search" />
// ...
}
}
Si vous êtes comme moi avec la dernière composante FormControl
, voici une solution que j'ai trouvée:
import React, {Component} from 'react'
import ReactDOM from 'react-dom'
class Blah extends Component {
getSelectValue = () => {
/* Here's the key solution */
console.log(ReactDOM.findDOMNode(this.select).value)
}
render() {
return
<div>
<FormControl
ref={select => { this.select = select }}
componentClass="select"
disabled={this.state.added}
>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</FormControl>
<Button onclick={this.getSelectValue}>
Get Select value
</Button>
</div>
}
}
Il y a encore un autre moyen facile! si tu utilises <FormGroup>
composant et définissez les accessoires controlId
, le DOM interne (<input>
, ...) obtiendra que controlId
comme attribut id
. par exemple:
<FormGroup controlId="myInputID">
<ControlLabel>Text</ControlLabel>
<FormControl type="text" placeholder="Enter text" />
</FormGroup>
Ensuite, vous aurez la valeur en appelant document.getElementById
:
var myInputValue = document.getElementById("myInputID").value;