ReactJS에서 클릭 이벤트를 수동으로 트리거하는 방법은 무엇입니까?


106

ReactJS 에서 클릭 이벤트를 수동으로 트리거하려면 어떻게해야 합니까? 사용자가 element1을 클릭 할 때 input태그 에 대한 클릭을 자동으로 트리거하고 싶습니다 .

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

일부 외부 라이브러리를 보면, 프로그래밍 입력 요소를 만들기 위해 좋은 아이디어를 보인다 github.com/okonet/react-dropzone/blob/master/src/index.js#L7
아메드 Nuaman

나는 왜 당신이 React에서 이것을하고 싶어하는지 알 수 없습니다. 무엇을 하시겠습니까?
tobiasandersen

@tobiasandersen input요소 에 프로그래밍 방식으로 초점을 맞추는 것은 완벽하게 유효한 사용 사례 이며, 이는 질문자가 프로그래밍 방식으로 트리거 된 클릭으로 달성하고자하는 것입니다.
존 와이즈

예, 초점과 흐림 모두 완벽하게 유효합니다. 하지만 클릭? 내가 묻는 이유는 예를 들어 집중이 유스 케이스라면 그것을 보여주는 것이 더 낫다는 것입니다. 그러나 클릭이 실제로 사용 사례라면 핸들러를 호출하는 것이 좋습니다.
tobiasandersen

@JohnWhite 글쎄, 그것은 올바르게 묶일 수 있습니다 :) 그러나 당신은 아마도 옳고, snarky에서 벗어나는 것은 내 의미가 아닙니다. 이것의 진짜 의도가 무엇인지 알고 싶었습니다.
tobiasandersen 2010 년

답변:


128

refprop을 사용하여 콜백을 통해 기본 HTMLInputElement 객체에 대한 참조를 획득하고 참조를 클래스 속성으로 저장 한 다음 해당 참조를 사용하여 나중에 HTMLElement.click 메서드를 사용하여 이벤트 핸들러에서 클릭을 트리거 할 수 있습니다 .

귀하의 render방법에서 :

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

이벤트 핸들러에서 :

this.inputElement.click();

전체 예 :

class MyComponent extends React.Component {
  render() {
    return (
      <div onClick={this.handleClick}>
        <input ref={input => this.inputElement = input} />
      </div>
    );
  }

  handleClick = (e) => {
    this.inputElement.click();
  }
}

콜백에서 올바른 어휘 범위를 제공 하는 ES6 화살표 함수에 유의하십시오 this. 또한이 방법으로 획득 한 객체는를 사용하여 획득 할 수있는 객체 document.getElementById, 즉 실제 DOM 노드 와 유사한 객체 입니다.


7
이것은 나를 위해 작동하지 않습니다. 확실하지가 구식이지만 내가 성공적으로 요소를 할당하지만 호출 할 때 경우에 click그것을, click정의되어 있지 않습니다. 해당 요소에 할당 한 다른 모든 속성과 콜백을 볼 수 있습니다. 어떤 아이디어?
TheJKFever

41
"참조는 더 이상 문서 DOM 노드를 반환하지 않고 React 가상 DOM 노드에 대한 참조를 반환합니다."이것은 확실히 오해입니다. 참조는 "가상 DOM"노드를 반환하지 않습니다. 출처 : React에서 작업합니다.
Dan Abramov

4
@DanAbramov 그래서 이것에 대한 권장 방법은 무엇입니까?
alegria

1
@JohnWeisz 감사합니다 soooooo, 그것은 나를 위해 일했습니다, 버튼과 폼 사이에 몇 가지 요소를 넣어야했기 때문에 Form 외부의 클릭으로 처리해야 할 필요성이있었습니다.
Markus Ethur

1
나를 위해 작동합니다. 입력 요소를 절대 위치로 -100에 넣은 다음 코드 ref={(ref)=>{this.fileUploadRef = ref}와 버튼에 넣었습니다onClick={()=>{this.fileUploadRef.click()}}
Richard

22

2018 년 5 월 ES6 React Docs를 참조로 사용하려면 다음을 확인하세요 . https://reactjs.org/docs/refs-and-the-dom.html

import React, { Component } from "react";
class AddImage extends Component {
  constructor(props) {
    super(props);
    this.fileUpload = React.createRef();
    this.showFileUpload = this.showFileUpload.bind(this);
  }
  showFileUpload() {
    this.fileUpload.current.click();
  }
  render() {
    return (
      <div className="AddImage">
        <input
          type="file"
          id="my_file"
          style={{ display: "none" }}
          ref={this.fileUpload}
        />
        <input
          type="image"
          src="http://www.graphicssimplified.com/wp-content/uploads/2015/04/upload-cloud.png"
          width="30px"
          onClick={this.showFileUpload}
        />
      </div>
    );
  }
}
export default AddImage;

이것은 React Oriented 대답 처럼 보입니다 .
Ritik

8

ref을 반환하는 콜백을 사용할 수 있습니다 node. click()해당 노드를 호출 하여 프로그래밍 방식으로 클릭합니다.

div노드 얻기

clickDiv(el) {
  el.click()
}

a refdiv노드로 설정

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

바이올린 확인

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

도움이 되었기를 바랍니다.


jsfiddle에 링크 할 때 최소한 여기에 관련 코드를 넣는 것이 좋습니다 (btw : 스 니펫 편집기는 reactjs도 지원)
Icepickle

4
문자열 ref 접근 방식은 더 이상 사용되지 않지만 콜백 기반 구문으로 대체되는 레거시 기능으로 간주된다는 점은 주목할 가치가 있습니다 .-- ref={elem => this.elem = elem}이것은 Refs to Components에 자세히 설명되어 있습니다.
존 와이즈

1
@JohnWhite 유효한 제안. 답변을 업데이트했습니다!
Pranesh Ravi

또한 el그렇게하기 전에 null / undefined가 아닌지 확인하고 확인해야 합니다.
janex

6

기능적 구성 요소에서도이 원칙이 작동하지만 구문과 사고 방식이 약간 다릅니다.

const UploadsWindow = () => {
  // will hold a reference for our real input file
  let inputFile = '';

  // function to trigger our input file click
  const uploadClick = e => {
    e.preventDefault();
    inputFile.click();
    return false;
  };

  return (
    <>
      <input
        type="file"
        name="fileUpload"
        ref={input => {
          // assigns a reference so we can trigger it later
          inputFile = input;
        }}
        multiple
      />

      <a href="#" className="btn" onClick={uploadClick}>
        Add or Drag Attachments Here
      </a>
    </>
  )

}

3

다음은 후크 솔루션입니다.

    import React, {useRef} from 'react';

    const MyComponent = () =>{

    const myRefname= useRef(null);

    const handleClick = () => {
        myRefname.current.focus();
     }

    return (
      <div onClick={handleClick}>
        <input ref={myRefname}/>
      </div>
     );
    }

"myRefname.current.focus는 함수가 아닙니다"
Spoderman4

2

이것을 시도하고 그것이 작동하지 않는 경우 알려주십시오.

<input type="checkbox" name='agree' ref={input => this.inputElement = input}/>
<div onClick={() => this.inputElement.click()}>Click</div>

를 클릭하면 요소 div클릭이 시뮬레이션됩니다.input


1

React Hooks와 useRefhook 사용하기 .

import React, { useRef } from 'react';

const MyComponent = () => {
    const myInput = useRef(null);

    const clickElement = () => {
        // To simulate a user focusing an input you should use the
        // built in .focus() method.
        myInput.current?.focus();

        // To simulate a click on a button you can use the .click()
        // method.
        // myInput.current?.click();
    }

    return (
        <div>
            <button onClick={clickElement}>
                Trigger click inside input
            </button>
            <input ref={myInput} />
        </div>
    );
}

나를 위해 이것은 클릭 및 포커스를 사용할 수 없기 때문에 작동하지 않았습니다. 그러나 작업이 대답했다 stackoverflow.com/a/54316368/3893510 ? 경우 대신 할 일 myInput.current .click ()을 시도; 당신은 : myInput.current.dispatchEvent (new MouseEvent ( 'click', {view : window, bubbles : true, cancelable : true, buttons : 1,}),); 작동합니다
jackbridger 20. 9.

1

이 답변에서 영감을 얻은 useRef로 Aaron Hakala의 답변을 리핑 https://stackoverflow.com/a/54316368/3893510

const myRef = useRef(null);

  const clickElement = (ref) => {
    ref.current.dispatchEvent(
      new MouseEvent('click', {
        view: window,
        bubbles: true,
        cancelable: true,
        buttons: 1,
      }),
    );
  };

그리고 JSX :

<button onClick={() => clickElement(myRef)}>Click<button/>
<input ref={myRef}>

0

최신 버전의 reactjs에서 작동하지 않으면 innerRef를 사용해보십시오.

class MyComponent extends React.Component {


  render() {
    return (
      <div onClick={this.handleClick}>
        <input innerRef={input => this.inputElement = input} />
      </div>
    );
  }

  handleClick = (e) => {
    this.inputElement.click();
  }
}

0

  imagePicker(){
        this.refs.fileUploader.click();
        this.setState({
            imagePicker: true
        })
    }
  <div onClick={this.imagePicker.bind(this)} >
  <input type='file'  style={{display: 'none'}}  ref="fileUploader" onChange={this.imageOnChange} /> 
  </div>

이것은 나를위한 일


-2

평범한 오래된 js는 어떻습니까? 예:

autoClick = () => {
 if (something === something) {
    var link = document.getElementById('dashboard-link');
    link.click();
  }
};
  ......      
var clickIt = this.autoClick();            
return (
  <div>
     <Link id="dashboard-link" to={'/dashboard'}>Dashboard</Link>
  </div>
);

Expectaion는 반작용에
니틴 쿠마르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.