2016-06-18 24 views
8

Chcę przesłać formularz odpowiedzi po kliknięciu linku.React.js: przesłanie formularza programowo nie wyzwala zdarzenia onSubmit

W tym celu należy przesłać formularz programowo po kliknięciu łącza.

Mój problem: onSubmit Handler nie jest zwolniony po przesłaniu formularza.

Oto kod snipped że zrobiłem do tego celu:

var MyForm = React.createClass({ 
    handleSubmit: function(e){ 
    console.log('Form submited'); 
    e.preventDefault(); 
    }, 
    submitForm : function(e){ 
    this.refs.formToSubmit.submit(); 
    }, 
    render: function() { 
    return (
    <form ref="formToSubmit" onSubmit={this.handleSubmit}> 
    <input name='myInput'/> 
    <a onClick={this.submitForm}>Validate</a> 
    </form>); 
    } 
}); 

ReactDOM.render(
    <MyForm name="World" />, 
    document.getElementById('container') 
); 

handleSubmit nie jest wywoływany i domyślne zachowanie jest wykonywany (formularz składany). Czy jest to błąd ReactJs lub normalne zachowanie? Czy istnieje sposób wywołania wywołania programu onSubmit?

+0

Czy znalazłeś rozwiązanie tego problemu? Mam ten sam problem. – Noitidart

Odpowiedz

-1

Powinieneś używać tagu wejściowego z typem submit zamiast tagu kotwicy, ponieważ znacznik zakotwiczenia nie uruchamia zdarzenia submit.

render: function() { 
return (<form ref="formToSubmit" onSubmit={this.handleSubmit}> 
    <input name='myInput'/> 
    <input onClick={this.submitForm} type="submit" value="Validate" /> 
</form>); 

}

+4

Użycie znacznika wejściowego do przesłania formularza nie oznacza "przesłania go programowo". – Gunchars

-1

miałem ten sam problem, ale nie mógł go naprawić. Niezależnie od tego, co zrobiłem, wykonanie document.querySelector('form').submit() nie uruchomiłoby obsługi onSubmit. Próbowałem włączyć niewidoczny <input type="submit">, ale nadal .submit() nie wyzwoliłby go. Więc po prostu zmieniłem zachowanie niewidocznej przesyłki (style="display:none"), a następnie robiąc .click() na tym niewidocznym przycisku przesyłania, zadziwiająco działa nawet z display:none. Testowałem jednak tylko w Firefoksie.

1

Twój bieżący numer jest powiązany z wyzwalaniem zdarzenia SyntheticEvent, a nie natywnego wysłania formularza. To wyjaśnia, dlaczego this.refs.formToSubmit.submit(); nie uruchamia twojego programu obsługi. O ile mi wiadomo, próba ręcznego uruchomienia tego SyntheticEvent nie jest zalecana ani warta zachodu.

Wierzę, że idiomatycznym sposobem osiągnięcia tego jest uporządkowanie JSX/HTML w celu użycia typu <button> lub <input> typu "submit". Każda z nich wyzwoli Twój uchwyt handleSubmit. Moim zdaniem zmniejszy to złożoność, skonsoliduje obsługę i wydaje się być najlepszym rozwiązaniem.

np.

  • <input type="submit" value="Validate" />
  • <button type="submit">Validate</button>
+0

To jedna z moich głównych skarg na React. Wymusza ścisłą i naiwnie nierealistyczną strukturę idiomatyczną. Jeśli ktoś po prostu przesyła formularz kontaktowy lub rejestracyjny, z pewnością ma to sens, aby zrobić to za pomocą kliknięcia przycisku. Ale bardziej skomplikowane aplikacje mogą, na przykład, autozapisywać złożone formularze, gdy dane wejście jest niewyraźne lub wybrana jest opcja, a Redux i React wydają się bardzo dobrze sparować, aby uniemożliwić osiągnięcie tego bez hacky. – CGriffin

0

Nie należy oczekiwać formą ref aby dołączyć dodatkowy oddzwanianie do submit dla Ciebie domyślnie. Byłby to zły projekt ramowy podczas pracy z programowo ustawionymi elementami, takimi jak DOM DOM refs.

Należy użyć ref do wystąpienia wszystkich zdarzeń, które trzeba w dowolnej kolejności chcesz zamiast opierania się na niewypowiedziane wewnętrznej realizacji ref [gdy instancja przez element form].

to działa:

this.refs.formToSubmit.onSubmit(); 
this.refs.formToSubmit.submit(); 

Rzeczywista submit powinna zawsze występować jako ostatni.

Powiązane problemy