inputs - React Checkbox no envía onChange
select checkbox react (3)
TLDR: use defaultChecked en lugar de checked, trabajando jsbin aquí http://jsbin.com/mecimayawe/1/edit?js,output
Intentando configurar una casilla simple que tache 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 marcado no permite que el valor subyacente cambie (al parecer) 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>
);
}
});
En el caso de que no desee usar el controlador onChange en el DOM de entrada, puede usar la propiedad onClick
como alternativa. La defaultChecked
, la condición puede dejar un estado fijo para v16 IINM.
class CrossOutCheckbox extends Component {
constructor(init){
super(init);
this.handleChange = this.handleChange.bind(this);
}
handleChange({target}){
if (target.checked){
target.removeAttribute(''checked'');
target.parentNode.style.textDecoration = "";
} else {
target.setAttribute(''checked'', true);
target.parentNode.style.textDecoration = "line-through";
}
}
render(){
return (
<span>
<label style={{textDecoration: this.props.complete?"line-through":""}}>
<input type="checkbox"
onClick={this.handleChange}
defaultChecked={this.props.complete}
/>
</label>
{this.props.text}
</span>
)
}
}
Espero que esto ayude a alguien en el futuro.
En material ui, el estado de la casilla de verificación se puede buscar como
this.refs.complete.state.switched
Para obtener el estado verificado de su casilla, la ruta sería:
this.refs.complete.state.checked
La alternativa es obtenerlo del evento pasado al método handleChange
:
event.target.checked