TLDR: Utiliser defaultChecked au lieu de vérifier, de travail jsbin .
Essayer de configurer une simple case à cocher qui rayera le texte de son étiquette lorsqu'elle est cochée. Pour une raison quelconque, handleChange n'est pas déclenché lorsque j'utilise le composant. Quelqu'un peut-il expliquer ce que je fais mal?
var CrossoutCheckbox = React.createClass({
getInitialState: function () {
return {
complete: (!!this.props.complete) || false
};
},
handleChange: function(){
console.log('handleChange', this.refs.complete.checked); // Never gets logged
this.setState({
complete: this.refs.complete.checked
});
},
render: function(){
var labelStyle={
'text-decoration': this.state.complete?'line-through':''
};
return (
<span>
<label style={labelStyle}>
<input
type="checkbox"
checked={this.state.complete}
ref="complete"
onChange={this.handleChange}
/>
{this.props.text}
</label>
</span>
);
}
});
Usage:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
Solution:
L'utilisation de vérifié ne laisse pas la valeur sous-jacente changer (apparemment) et n'appelle donc pas le gestionnaire onChange. Le passage à defaultChecked semble résoudre ce problème:
var CrossoutCheckbox = React.createClass({
getInitialState: function () {
return {
complete: (!!this.props.complete) || false
};
},
handleChange: function(){
this.setState({
complete: !this.state.complete
});
},
render: function(){
var labelStyle={
'text-decoration': this.state.complete?'line-through':''
};
return (
<span>
<label style={labelStyle}>
<input
type="checkbox"
defaultChecked={this.state.complete}
ref="complete"
onChange={this.handleChange}
/>
{this.props.text}
</label>
</span>
);
}
});
this.setState({checked: !this.state.checked})
plus simple que de devoir stocker une valeur. Puis un opérateur ternaire dans l'attrubute vérifié:checked={this.state.checked ? 'checked': null}
this.refs.complete.getDOMNode().checked
. voir fiddle jsfiddle.net/d10xyqu1Réponses:
Pour obtenir l'état coché de votre case à cocher, le chemin serait:
L'alternative est de l'obtenir à partir de l'événement passé dans la
handleChange
méthode:la source
checked
pour les composants contrôlés: /checked
signifie que l'état est géré en dehors du composant. Lorsque l'utilisateur clique, il n'y a rien à appelerhandleChange
car aucun état n'est mis à jour. Au lieu de cela, vous devrez écouteronClick
et déclencher une mise à jour de l'état là-bas.Il vaut mieux ne pas utiliser de références dans de tels cas. Utilisation:
Il existe quelques options:
checked
contredefaultChecked
Le premier répondrait à la fois aux changements d'état et aux clics. Ce dernier ignorerait les changements d'état.
onClick
contreonChange
Le premier se déclencherait toujours sur les clics. Ce dernier ne se déclencherait pas sur les clics si l'
checked
attribut est présent sur l'input
élément.la source
Dans le cas où vous ne souhaitez PAS utiliser le gestionnaire onChange sur le DOM d'entrée, vous pouvez utiliser la
onClick
propriété comme alternative. LedefaultChecked
, la condition peut laisser un état fixe pour la version 16 IINM.J'espère que cela aidera quelqu'un à l'avenir.
la source
Si vous avez une
handleChange
fonction qui ressemble à ceci:Vous pouvez créer une
onChange
fonction personnalisée afin qu'elle agisse comme une entrée de texte:la source
handleChange
surinput
devrait êtrethis.handleChange
?Dans le cas où quelqu'un recherche un gestionnaire d'événements universel, le code suivant peut être utilisé plus ou moins (en supposant que la propriété name est définie pour chaque entrée):
la source
onChange n'appellera pas handleChange sur mobile lors de l'utilisation de defaultChecked. Vous pouvez également utiliser onClick et onTouchEnd.
la source
Dans le matériel ui, l'état de la case à cocher peut être récupéré comme
la source