2015-04-17 18 views
8

Tworzę formularz, a ja potrzebowałem wejścia radiowego. Jak uzyskać sprawdzone wejście radiowe w funkcji onSubmit, jaki jest prawidłowy sposób?Jak korzystać z przycisków radiowych w React?

To jest mój kod, ja myRadioInput-zmiennej zawierać Każda z tych opcji A lub B Option kiedy złożyć:

React.createClass({ 
    handleSubmit: function() { 
     e.preventDefault(); 
     var myTextInput = this.refs.myTextInput.getDOMNode().value.trim(); 
     var myRadioInput = "How ?"; 
    }, 
    render: function() { 
     return (
      <form onSubmit={this.handleSubmit}> 
       <input type="text" ref="myTextInput" /> 
       <label> 
        <span>Option A</span> 
        <input type="radio" name="myRadioInput" value="Option A"/> 
       </label> 
       <label> 
        <span>Option B</span> 
        <input type="radio" name="myRadioInput" value="Option B"/> 
       </label> 
       <input type="submit" value="Submit this"/> 
      </form> 
     ) 
    } 
}); 
+3

możliwy duplikat [Jak korzystać z przycisków radiowych w ReactJS?] (Http://stackoverflow.com/questions/27784212/how-to-use-radio-buttons-in-reactjs) – hopper

Odpowiedz

6

Nie należy stosować bibl aby uzyskać dostęp do węzłów DOM i skontrolować ich wartość. Zamiast tego należy połączyć wartość wejściową z właściwością w stanie składnika.

Oto kilka przykładów, jak to zrobić: https://facebook.github.io/react/docs/two-way-binding-helpers.html

+4

Dzięki, ale nie zgadzam się, że należy koniecznie aktualizować stan podczas opracowywania prostych formularzy, które nie wymagają sprawdzania w czasie rzeczywistym. Posiadanie wszystkiego w jednym module obsługi przesyłania sprawia, że ​​komponent jest znacznie prostszy i nie muszę się martwić o miksowanie lub stan. – andersem

+0

I nie zgadzam się z tym, ale to jest w porządku. –

+0

@andersem, jeśli używasz stanu, byłoby to banalne. Motywacją do korzystania z niego, nawet jeśli nie jest to naprawdę potrzebne, jest to, że zmienia on to w odpowiedzi na zmieniające się wymagania. – FakeRainBrigand

10

Jeśli sprawdzić, czy wszystkie elementy formularza mieć name atrybutów można wyodrębnić dane z formularza onSubmit użyciu form.elements:

handleSubmit: function(e) { 
    e.preventDefault() 
    var form = e.target 
    var myTextInput = form.elements.myTextInput.value 
    var myRadioInput = form.elements.myRadioInput.value 
    // ... 
} 

W nowoczesne przeglądarki, form.elements.myRadioInput, powinny być RadioNodeList, które mają wartość .value odpowiadającą wybranej wartości, ale gdy to nie jest obsługiwane, otrzymasz NodeList lub n z z ody, które muszą być powtórzone, aby znaleźć wybraną wartość.


Mam też wielokrotnego użytku React Component - <AutoForm> - która wykorzystuje rodzajowe wdrażania ekstrakcji danych z form.elements dla Ciebie. Używałem go w poniższym fragmencie:

<meta charset="UTF-8"> 
 
<script src="http://fb.me/react-0.13.1.js"></script> 
 
<script src="http://fb.me/JSXTransformer-0.13.1.js"></script> 
 
<script src="https://cdn.rawgit.com/insin/react-auto-form/master/dist/react-auto-form.js"></script> 
 
<div id="app"></div> 
 
<script type="text/jsx;harmony=true">void function() { "use strict"; 
 
    
 
var Example = React.createClass({ 
 
    getInitialState() { 
 
     return {submittedData: null} 
 
    }, 
 

 
    handleSubmit(e, submittedData) { 
 
     e.preventDefault() 
 
     this.setState({submittedData}) 
 
    }, 
 

 
    render() { 
 
     return <div> 
 
      <AutoForm onSubmit={this.handleSubmit}> 
 
       <input type="text" name="myTextInput" /> 
 
       <label> 
 
        <span>Option A</span> 
 
        <input type="radio" name="myRadioInput" value="Option A"/> 
 
       </label> 
 
       <label> 
 
        <span>Option B</span> 
 
        <input type="radio" name="myRadioInput" value="Option B"/> 
 
       </label> 
 
       <input type="submit" value="Submit this"/> 
 
      </AutoForm> 
 
      {this.state.submittedData && <pre> 
 
       {JSON.stringify(this.state.submittedData, null, 2)} 
 
      </pre>} 
 
     </div> 
 
    } 
 
}); 
 
    
 
React.render(<Example/>, document.getElementById('app')) 
 
    
 
}()</script>

+2

Właściwość e.target.elelments.myRaidoButton.value w zdarzeniu onSubmit była dokładnie tym, czego potrzebowałem. +1 za brak konieczności konfigurowania grupy programów obsługi zdarzeń i ręcznego śledzenia stanu wybranego przycisku radiowego. – Jeremy

+0

Uzgodniono z @Jeremy. Ta odpowiedź jest potrzebna.Cieszę się, że istnieje rozwiązanie "valueLink", jest interesujące, ale wydaje mi się, że jest to dla mnie bardziej standardowe. – nackjicholson

0

Używam tego rozwiązania przycisk krótkofalówka wiązania z aktywnym:

wewnątrz render() metoda:

const items = [ 
    {label: 'one', checked: false}, 
    {label: 'two', checked: true}, 
    {label: 'three', checked: true} 
]; 

items.map((item, index) => (
    <div className={`radioItem (item.checked) ? 'active' : ''`}> 
     <label> 
      {item.label} 
      <input type="radio" 
        name="address" 
        value={item.label} 
        onClick={(e)=>{ 
         $('.radioItem').filter('.active').removeClass('active'); 
         $(e.currentTarget).closest('.radioItem').addClass('active'); 
        }} 
        ref={elm => $(elm).prop('checked', item.checked)} 
      /> 
     </label> 
    </div> 
)) 
Powiązane problemy