React 확인란이 onChange를 전송하지 않음
TLDR: 선택된 jsbin 대신 default Checked를 사용합니다.
선택 시 레이블 텍스트를 지우는 단순 확인란을 설정하려고 합니다.어떤 이유에서인지 컴포넌트를 사용할 때 handleChange가 실행되지 않습니다.내가 뭘 잘못하고 있는지 설명해 줄 사람?
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>
);
}
});
사용방법:
React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode);
솔루션:
체크박스를 켜도 기본값이 변경되지 않기 때문에 onChange 핸들러를 호출하지 않습니다.default Checked로 전환하면 이 문제가 해결되는 것 같습니다.
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.refs.complete.state.checked
다른 방법은 이벤트로부터 데이터를 취득하는 것입니다.handleChange
방법:
event.target.checked
그런 경우에는 레퍼런스를 사용하지 않는 것이 좋습니다.용도:
<input
type="checkbox"
checked={this.state.active}
onClick={this.handleClick}
/>
몇 가지 옵션이 있습니다.
checked
대defaultChecked
전자는 상태 변화와 클릭 모두에 응답합니다.후자는 상태 변화를 무시합니다.
onClick
대onChange
전자는 항상 클릭에 의해 트리거됩니다.후자는 클릭 시 트리거되지 않습니다.checked
Atribute가 다음 위치에 있습니다.input
요소.
를 가지고 있는 경우handleChange
다음과 같은 기능을 수행합니다.
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value,
});
}
커스텀을 생성할 수 있습니다.onChange
텍스트 입력과 같이 기능하도록 함수는 다음과 같습니다.
<input
type="checkbox"
name="check"
checked={this.state.check}
onChange={(e) => {
this.handleChange({
target: {
name: e.target.name,
value: e.target.checked,
},
});
}}
/>
입력 DOM 상에서 onChange 핸들러를 사용하지 않는 시나리오에서는onClick
대체 수단으로서 재산.그defaultChecked
이 상태는 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>
)
}
}
나는 이것이 미래에 누군가에게 도움이 되기를 바란다.
유니버설 이벤트핸들러를 찾고 있는 경우는, 다음의 코드를 어느 정도 사용할 수 있습니다(모든 입력에 대해서 이름 속성이 설정되어 있는 것을 전제로 합니다).
this.handleInputChange = (e) => {
item[e.target.name] = e.target.type === "checkbox" ? e.target.checked : e.target.value;
}
onChange는 defaultChecked를 사용하는 경우 모바일에서 handleChange를 호출하지 않습니다.대신 onClick 및 onTouchEnd를 사용할 수 있습니다.
<input onClick={this.handleChange} onTouchEnd={this.handleChange} type="checkbox" defaultChecked={!!this.state.complete} />;
재료 UI에서 확인란 상태는 다음과 같이 가져올 수 있습니다.
this.refs.complete.state.switched
언급URL : https://stackoverflow.com/questions/26615779/react-checkbox-not-sending-onchange
'programing' 카테고리의 다른 글
jsfiddle의 js를 디버깅하는 방법 (0) | 2023.02.20 |
---|---|
Next.js - 오류: 절대 URL만 지원됩니다. (0) | 2023.02.20 |
JSON 문자열의 이진 데이터.Base64보다 뛰어난 기능 (0) | 2023.02.20 |
Angular.js에서 다른 사람에게 주입할 수 있는 "물건"은 무엇입니까? (0) | 2023.02.20 |
ReactJS에서 중첩된 개체의 PropTypes를 검증하려면 어떻게 해야 합니까? (0) | 2023.02.20 |