2016-10-07 23 views
19

Jak ręcznie uruchomić zdarzenie click w ReactJS? Gdy użytkownik kliknie element 1, chcę automatycznie wywołać kliknięcie znacznika input.Jak ręcznie uruchomić zdarzenie kliknięcia w ReactJS?

<div className="div-margins logoContainer"> 
    <div id="element1" className="content" onClick={this.uploadLogoIcon}> 
    <div className="logoBlank" /> 
    </div> 
    <input accept="image/*" type="file" className="hide"/> 
</div> 
+0

Patrząc na niektóre biblioteki zewnętrzne, warto wprowadzić programowo element wejściowy: https://github.com/okonet/react-dropzone/blob/master/src/index.js#L7 –

+0

Mogę nie rozumiesz, dlaczego chciałbyś to zrobić w React. Co chcesz zrobić? – tobiasandersen

+0

@tobiasandersen Jest to całkowicie poprawny przypadek użycia, aby programowo skupić element 'input', który jest prawdopodobnie tym, który pytający chce osiągnąć za pomocą kliknięcia uruchamianego programowo. –

Odpowiedz

37

Można użyć ref rekwizyt nabyć odniesienie do leżącej HTMLInputElement obiektu poprzez oddzwonienie, przechowywać odniesienia jako właściwości klasy, a następnie użyć, że odniesienie do później wywołać kliknięcie z obsługi zdarzeń z wykorzystaniem metody HTMLElement.click.

W swojej metodzie render:

<input ref={input => this.inputElement = input} ... /> 

W swojej obsługi zdarzeń:

this.inputElement.click(); 

Zanotuj ES6 arrow function która zapewnia prawidłowy zakres leksykalny dla this w zwrotnego. Zauważ również, że obiekt, który pozyskujesz w ten sposób, jest obiektem podobnym do tego, co uzyskałbyś używając document.getElementById, tj. Rzeczywistego węzła DOM.

+1

To nie działa dla mnie.Nie jestem pewien, czy jest on nieaktualny, ale z powodzeniem przypisuję ten element, ale gdy go wywołam, kliknięcie jest niezdefiniowane. Widzę wszystkie inne atrybuty i wywołania zwrotne, które przypisałem temu elementowi. Jakieś pomysły? – TheJKFever

+0

@TheJKFever - Nie można powiedzieć, nie znając swojego kodu, ale jest prawdopodobne, że odniesienie, które otrzymujesz, jest w rzeczywistości _nie_ obiektem 'HTMLInputElement'. Co daje "instanceof this.inputElement"? –

+0

to też nie działa, kliknięcie jest niezdefiniowane. – venkatareddy

7

Można użyć ref zwrotnego która zwróci node. Zadzwoń pod numer click() w tym węźle, aby wykonać kliknięcie programowe.

Pierwsze węzeł

clickDiv(el) { 
    el.click() 
} 

div Ustawianie ref do węzła

<div 
    id="element1" 
    className="content" 
    ref={this.clickDiv} 
    onClick={this.uploadLogoIcon} 
> 

div Sprawdź skrzypce

https://jsfiddle.net/pranesh_ravi/5skk51ap/1/

Nadzieję, że to pomaga!

+0

po podłączeniu do jsfiddle, uważam, że dobrą praktyką jest umieszczenie tu co najmniej odpowiedniego kodu (btw: edytor fragmentów obsługuje również reaktsy) – Icepickle

+0

Dodano fragment kodu! Dzięki za wskazanie! –

+4

Warto zauważyć, że podczas gdy podejście ciąg znaków nie jest przestarzałe, uważa się, że dotychczasowa funkcjonalność została zastąpiona przez składnię opartą na oddzwanianiu: 'ref = {elem => this.elem = elem}' - jest to szczegółowo [Odnosi się do komponentów] (https://facebook.github.io/react/docs/more-about-refs.html). –