2014-10-28 7 views
55

TLDR:, उपयोग defaultChecked बजाय जाँच यहाँ http://jsbin.com/mecimayawe/1/edit?js,outputचेकबॉक्स प्रतिक्रिया नहीं भेज onChange

jsbin काम कर सेटअप करने के लिए एक सरल चेकबॉक्स कि अपनी लेबल पाठ से पता लगा जब यह चेक किया गया है जाएगा कोशिश कर रहा है। कुछ कारणों से हैंडल चेंज को घटक का उपयोग करते समय निकाल दिया नहीं जा रहा है। क्या कोई समझा सकता है कि मैं क्या गलत कर रहा हूं?

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 हैंडलर फोन नहीं करता है।

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> 
    ); 
    } 
}); 
+2

सबसे पहले, क्यों न करें 'this.setState ({check:! This.state.checked})' मूल्य को स्टोर करने से आसान है। फिर चेक किए गए अटूट्यूट में एक टर्नरी ऑपरेटर: 'चेक = {this.state.checked? 'चेक किया गया': शून्य} ' – zackify

+0

इस तरह यह शुरू हुआ, लेकिन यह कभी अपडेट नहीं हुआ। तो मैंने इसे यहां और वहां फेंकना शुरू कर दिया जो निकाला नहीं जा रहा था। आदर्श रूप से पूरा होने पर आदर्श रूप से सबसे सरल रूप में वापस जायेंगे :) – jdarling

+0

मान लें कि आपका माउंट नोड एक वास्तविक डोम नोड है, आपको 'this.refs.complete.getDOMNode()। चेक' का उपयोग करना होगा। बेवकूफ देखें http://jsfiddle.net/d10xyqu1/ – trekforever

उत्तर

93

अपने चेकबॉक्स की जाँच की राज्य पथ होगा प्राप्त करने के लिए: defaultChecked को स्विचिंग इसे ठीक करने लगता है

this.refs.complete.state.checked 

विकल्प घटना handleChange विधि में पारित से इसे पाने के लिए है:

event.target.checked 
+3

हैंडल चेंज कभी नहीं बुलाया जा रहा है, इससे कोई फर्क नहीं पड़ता कि आप चेकबॉक्स या लेबल पर क्लिक करते हैं, हैंडल चेंज को कॉल नहीं किया जाता है :( – jdarling

+6

डिफ़ॉल्ट जांच का प्रयास करें = {यह। आपके इनपुट पर "चेक" की बजाय state.complete}। – zbyte

+0

वह था ... हमेशा के लिए खोज और पोकिंग की खोज की गई। अगर अन्य लोग इस पर भी दौड़ते हैं तो पूरा काम करने वाले उत्तर के साथ प्रश्न अपडेट करेंगे। – jdarling

1

सामग्री UI में, चेकबॉक्स का राज्य

01 के रूप में दिलवाया जा सकता है
0

परिदृश्य में आप इनपुट डॉम पर ऑन चेंज हैंडलर का उपयोग नहीं करना चाहते हैं, तो आप 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> 
     ) 
    } 
} 

मुझे उम्मीद है कि यह भविष्य में किसी की मदद करेगा।

संबंधित मुद्दे