2016-10-07 2 views
19

Как я могу вручную вызвать событие click в ReactJS? Когда пользователь нажимает на элемент1, я хочу автоматически активировать щелчок на теге input.Как вручную запускать событие click в 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

Глядя на некоторые внешние библиотеки, представляется целесообразным сделать программный элемент ввода: https://github.com/okonet/react-dropzone/blob/master/src/index.js#L7 –

+0

Я могу Посмотрите, почему вы хотели бы сделать это в Реакт. Что вы хотите сделать? – tobiasandersen

+0

@tobiasandersen Это совершенно допустимый прецедент, чтобы программно сфокусировать элемент 'input', который, скорее всего, хочет, чтобы его попросили с помощью программно вызванного щелчка. –

ответ

37

Вы можете использовать ref опоры для получения ссылки на подстилающие HTMLInputElement объекта с помощью обратного вызова, сохранить ссылку как свойство класса, а затем использовать эту ссылку, чтобы позже вызвать щелчок из обработчиков событий с помощью метода HTMLElement.click.

В вашем методе render:

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

В обработчике события:

this.inputElement.click(); 

Обратите внимание на ES6 arrow function, что обеспечивает правильную лексическую область для this в функции обратного вызова. Также обратите внимание, что объект, который вы приобретаете таким образом, является объектом, схожим с тем, что вы приобретете, используя document.getElementById, то есть фактический DOM-узел.

+1

Это не работает для меня.Не уверен, что он устарел, но я успешно назначил элемент, но когда я нажимаю 'click' на него,' click' не определен. Я могу видеть все другие атрибуты и обратные вызовы, которые я назначил этому элементу. Есть идеи? – TheJKFever

+0

@TheJKFever - невозможно сказать, не зная ваш код, но, скорее всего, ссылка, которую вы получаете, фактически не является объектом 'HTMLInputElement'. Что дает экземпляр this.inputElement? –

+0

это тоже не работает для меня, нажмите кнопку undefined. – venkatareddy

7

Вы можете использовать ref обратного вызова, которая будет возвращать node. Вызовите click() на этом узле, чтобы сделать программный щелчок.

Получение div узла

clickDiv(el) { 
    el.click() 
} 

ref установив на div узел

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

Проверьте скрипку

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

Надеется, что это помогает!

+0

, когда вы ссылаетесь на jsfiddle, рекомендуется использовать по крайней мере соответствующий код здесь (кстати, редактор snippet также поддерживает реакцию) – Icepickle

+0

Добавлен фрагмент! Спасибо, что указали! –

+4

Стоит отметить, что хотя подход string ref не устарел, он считается устаревшей функциональностью, которая заменяется синтаксисом на основе обратного вызова: 'ref = {elem => this.elem = elem}' - Это подробно описано в [Refs to Components] (https://facebook.github.io/react/docs/more-about-refs.html). –

Смежные вопросы