ReactJSでクリックイベントを手動でトリガーする方法は?


97

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
Ahmed Nuaman 2016年

Reactでこれをやりたい理由がわかりません。あなたは何をしたいですか?
tobiasandersen 2016年

@tobiasandersenこれは、input要素をプログラムでフォーカスするための完全に有効なユースケースです。これは、プログラムでトリガーされたクリックでアスカーが達成したいことである可能性があります。
ジョンワイズ2016年

確かに、フォーカスとブラーの両方が完全に有効です。しかし、クリックしますか?私が尋ねている理由は、たとえばフォーカシングがユースケースである場合、それを示す方がよいということです。ただし、クリックが実際にユースケースである場合は、ハンドラーを呼び出す方が適切です。
tobiasandersen 2016年

@JohnWhiteまあそれは正しくバインドされる可能性があります:)しかし、あなたはおそらく正しいです、そしてそれは卑劣なことをやめることは私の意味ではありませんでした。この背後にある本当の意図が何であるかを見たかっただけです。
tobiasandersen 2016年

回答:


121

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

40
「参照はドキュメントDOMノードを返さなくなり、React仮想DOMノードへの参照を返します」これは間違いなく誤解です。参照は「仮想DOM」ノードを返しません。出典:Reactに取り組んでいます。
ダンアブラモフ2017年

4
@DanAbramovでは、これに推奨される方法は何ですか?
ダッシュボード

1
@JohnWeiszどうもありがとうございました、それは私のために働きました、私はボタンとフォームの間にいくつかの要素を入れなければならなかったので、フォームの外側をクリックして処理する必要がありました。
Markus Ethur 2018年

1
私のために働きます。入力要素を絶対位置で-100に配置し、次にコードに配置し、次にref={(ref)=>{this.fileUploadRef = ref}ボタンに配置しますonClick={()=>{this.fileUploadRef.click()}}
Richard

20

ES6 React Docsを参照として2018年5月に機能するように、次のものを入手しました: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;

これは、より反応指向の答えのように見えます。
Ritik

8

refを返すコールバックを使用できますnode。コールclick()そのノードをて、プログラムによるクリックを実行します。

divノードの取得

clickDiv(el) {
  el.click()
}

ノードにarefを設定するdiv

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

フィドルを確認してください

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

それが役に立てば幸い!


jsfiddleにリンクするときは、少なくとも関連するコードをここに配置することをお勧めします(ところで、スニペットエディターはreactjsもサポートしています)
Icepickle 2016年

4
string refアプローチは非推奨ではありませんが、コールバックベースの構文に取って代わられるレガシー機能と見なされていることに注意してください。-ref={elem => this.elem = elem}これについては、Refs toComponentsで詳しく説明しています
ジョンワイズ2016年

1
@JohnWhite有効な提案。答えを更新しました!
Pranesh Ravi 2016

また、elそれを行う前に、null /未定義でないことを確認して確認する必要があります。
janex

4

機能コンポーネントでは、この原則も機能します。構文と考え方が少し異なります。

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

}

2

これを試して、それがあなたの側で機能しない場合は私に知らせてください:

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

をクリックするとdivinput要素のクリックをシミュレートする必要があります


2

これがフックソリューションです

    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は関数ではありません」
Spoderman 46

1

ReactフックとuseRefフックの使用

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>
    );
}

クリックとフォーカスが利用できなかったため、これは機能しませんでした。しかし、 myInput.current?.click();を実行しようとする代わりに、この回答、stackoverflow.com / a / 54316368/3893510が機能しました。あなたがすること:myInput.current.dispatchEvent(new MouseEvent( 'click'、{view:window、bubbles:true、cancelable:true、buttons:1、})、); 動作するはずです
jackbridger

1

この回答に触発されたuseRefでアーロンハカラの回答をリフする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>
);

期待は反応中
Nitin Kumar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.