2014-10-28 20 views
55

TLDR göndermiyor Checkbox yanıt verin. Bir sebepten dolayı bileşeni kullandığımda handleChange çalışmıyor. Herkes yanlış yaptığımı açıklayabilir mi?onChange

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

Kullanımı:

React.renderComponent(CrossoutCheckbox({text: "Text Text", complete: false}), mountNode); 

Çözüm:

onChange işleyicisi çağırmaz böylece altta yatan değer değişikliği (görünüşte) izin vermez kontrol ve kullanma.

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

Öncelikle neden bir onChange eklemiyorsunuz? 'this.setState ({checked:! This.state.checked})' Bir değeri depolamaktan daha kolay. Sonra kontrol edilen attrubute'ta üçlü operatör: 'checked = {this.state.checked? 'checked': null} ' – zackify

+0

Bu şekilde başladı, ancak hiçbir zaman güncellenmedi. Bu yüzden işten atılmaya başladım ve işten kovulmadığı hataların ayıklanması için. İdeal olarak tamamlandığında en basit forma geri dönecektir :) – jdarling

+0

MountNode'unuzun gerçek bir dom düğümü olduğunu varsayarak, this.refs.complete.getDOMNode(). Checked' kullanmak zorunda kalacaksınız. http://jsfiddle.net/d10xyqu1/ – trekforever

cevap

93

yol olacağını sizin onay kutusu işaretli durumunu almak için: defaultChecked için Geçiş Bunu düzeltmek gibi görünüyor

this.refs.complete.state.checked 

alternatif handleChange yönteme geçirilen etkinliğinden elde etmektir: malzeme arayüzünde

event.target.checked 
+3

handleChange hiçbir zaman aranmıyor, onay kutusunu veya etiketi tıklatırsanız fark etmez, handleChange çağrılmadı :(. – jdarling

+6

defaultChecked = kullanmayı deneyin. girişinizdeki "kontrol" yerine – zbyte

+0

Bu ... Sonsuza dek arandığınızda ve etrafta dolanıp arandığınızda, başkalarının da bu konuda çalıştığı durumlarda tam çalışma yanıtı ile soruları güncelleyeceğiz – jdarling

1

, onay kutusu durumu

01 olarak getirilen edilebilir
0

Senaryoda DOM girişindeki onChange işleyicisini kullanmak istemezseniz, onClick özelliğini alternatif olarak kullanabilirsiniz. defaultChecked, koşul v16 IINM için sabit bir durum bırakabilir.

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> 
     ) 
    } 
} 

Umarım bu, gelecekte birilerine yardımcı olur.