TLDR: use defaultChecked en lugar de marcado, trabajando jsbin .
Intentando configurar una casilla de verificación simple que tachará el texto de la etiqueta cuando esté marcada. Por alguna razón, handleChange no se dispara cuando uso el componente. ¿Alguien puede explicar lo que estoy haciendo 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>
);
}
});
Uso:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
Solución:
El uso de check no permite que el valor subyacente cambie (aparentemente) y, por lo tanto, no llama al controlador onChange. Cambiar a defaultChecked parece solucionar esto:
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})
fácil que tener que almacenar un valor? Luego, un operador ternario en el atributo verificado:checked={this.state.checked ? 'checked': null}
this.refs.complete.getDOMNode().checked
. ver violín jsfiddle.net/d10xyqu1Respuestas:
Para obtener el estado marcado de su casilla de verificación, la ruta sería:
La alternativa es obtenerlo del evento pasado al
handleChange
método:fuente
checked
para componentes controlados: /checked
significa que el estado se administra fuera del componente. Cuando el usuario hace clic, no hay nada que llamar,handleChange
ya que no se actualiza ningún estado. En su lugar, debería escucharonClick
y activar una actualización de estado allí.Es mejor no usar referencias en tales casos. Utilizar:
Hay algunas opciones:
checked
vsdefaultChecked
El primero respondería tanto a los cambios de estado como a los clics. Este último ignoraría los cambios de estado.
onClick
vsonChange
El primero siempre se activaría con clics. Este último no se activaría con clics si el
checked
atributo está presente en elinput
elemento.fuente
En el escenario en el que NO le gustaría usar el controlador onChange en el DOM de entrada, puede usar la
onClick
propiedad como alternativa. LadefaultChecked
condición puede dejar un estado fijo para v16 IINM.Espero que esto ayude a alguien en el futuro.
fuente
Si tiene una
handleChange
función que se ve así:Puede crear una
onChange
función personalizada para que actúe como lo haría una entrada de texto:fuente
handleChange
encendidoinput
debería serthis.handleChange
?En caso de que alguien esté buscando un controlador de eventos universal, el siguiente código se puede usar más o menos (suponiendo que la propiedad de nombre esté establecida para cada entrada):
fuente
onChange no llamará a handleChange en el móvil cuando usa defaultChecked. Como alternativa, puede usar onClick y onTouchEnd.
fuente
En el material ui, el estado de la casilla de verificación se puede recuperar como
fuente