TLDR:ここではチェックされたjsbinの代わりにdefaultCheckedを使用します http://jsbin.com/mecimayawe/1/edit?js,output
チェックされたときにラベルテキストを消す簡単なチェックボックスを設定しようとしています。コンポーネントを使用しても、何らかの理由で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);
溶液:
Checkedを使用しても根本的な値は(明らかに)変更されないため、onChangeハンドラは呼び出されません。 defaultCheckedに切り替えると、これが修正されるようです。
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
そのような場合にはrefを使わない方がいいでしょう。つかいます:
<input
type="checkbox"
checked={this.state.active}
onClick={this.handleClick}
/>
いくつかの選択肢があります。
checked
とdefaultChecked
前者は両方の状態の変化に反応するでしょうそしてクリック。後者は状態変化を無視します。
onClick
とonChange
前者は常にクリックでトリガーされます。 checked
属性がinput
要素に存在する場合、後者はクリックでトリガーしません。
このシナリオでは、入力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>
)
}
}
これが将来の誰かに役立つことを願っています。
このようなhandleChange
関数があるとします。
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value,
});
}
カスタムのonChange
関数を作成して、テキスト入力のように機能させることができます。
<input
type="checkbox"
name="check"
checked={this.state.check}
onChange={(e) => {
handleChange({
target: {
name: e.target.name,
value: e.target.checked,
}
});
}}
/>
defaultCheckedを使用すると、onChangeはモバイルでhandleChangeを呼び出しません。代わりに、onClickとonTouchEndを使うことができます。
<input onClick={this.handleChange} onTouchEnd={this.handleChange} type="checkbox" defaultChecked={!!this.state.complete} />;
マテリアルuiでは、チェックボックスの状態は以下のように取得できます。
this.refs.complete.state.switched