Wie kann ein Klickereignis in ReactJS manuell ausgelöst werden?

92

Wie kann ich ein Klickereignis in ReactJS manuell auslösen ? Wenn ein Benutzer auf Element1 klickt, möchte ich automatisch einen Klick auf das inputTag auslösen .

<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>
Mamata Hegde
quelle
Bei einigen externen Bibliotheken scheint es eine gute Idee zu sein, das Eingabeelement programmgesteuert zu
erstellen
Ich kann nicht verstehen, warum Sie dies jemals in React tun möchten. Was willst du machen
Tobiasandersen
@tobiasandersen Es ist ein absolut gültiger Anwendungsfall, ein inputElement programmgesteuert zu fokussieren. Dies ist wahrscheinlich das, was der Fragesteller mit dem programmgesteuert ausgelösten Klick erreichen möchte.
John Weisz
Ja sicher, sowohl Fokus als auch Unschärfe sind vollkommen gültig. Aber klicken? Der Grund, den ich frage, ist, dass es besser ist, dies zu zeigen, wenn z. B. Fokussierung der Anwendungsfall ist. Aber wenn Klick wirklich der Anwendungsfall ist, ist es besser, einfach den Handler aufzurufen.
Tobiasandersen
@ JohnWhite Nun, es könnte richtig gebunden werden :) Aber du hast wahrscheinlich Recht, und es war nicht meine Absicht, snarky zu kommen. Ich wollte nur sehen, was die wahre Absicht dahinter war.
Tobiasandersen

Antworten:

116

Mit der refRequisite können Sie über einen Rückruf einen Verweis auf das zugrunde liegende HTMLInputElement- Objekt abrufen , den Verweis als Klasseneigenschaft speichern und diesen Verweis verwenden, um später mithilfe der HTMLElement.click- Methode einen Klick von Ihren Ereignishandlern auszulösen .

In Ihrer renderMethode:

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

In Ihrem Event-Handler:

this.inputElement.click();

Vollständiges Beispiel:

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

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

Beachten Sie die ES6-Pfeilfunktion , die den richtigen lexikalischen Bereich für thisden Rückruf bereitstellt . Beachten Sie auch, dass das Objekt, das Sie auf diese Weise erwerben, ein Objekt ist, das dem entspricht, mit dem Sie es erwerben würden document.getElementById, dh dem tatsächlichen DOM-Knoten.

John Weisz
quelle
7
Das funktioniert bei mir nicht. Ich bin mir nicht sicher, ob es veraltet ist, aber ich habe das Element erfolgreich zugewiesen, aber wenn ich clickes clickaufrufe , ist es undefiniert. Ich kann alle anderen Attribute und Rückrufe sehen, die ich diesem Element zugewiesen habe. Irgendwelche Ideen?
TheJKFever
34
"Refs geben keinen Dokument-DOM-Knoten mehr zurück, sondern geben einen Verweis auf einen virtuellen DOM-Knoten von React zurück." Das ist definitiv ein Missverständnis. Refs geben keine "virtuellen DOM" -Knoten zurück. Quelle: Ich arbeite an React.
Dan Abramov
4
@ DanAbramov Also, was ist die empfohlene Methode dafür?
Dashboard
1
@JohnWeisz Vielen Dank, es hat bei mir funktioniert. Ich musste diese Notwendigkeit mit einem Klick außerhalb des Formulars behandeln, da ich einige Elemente zwischen Schaltfläche und Formular einfügen musste.
Markus Ethur
1
Funktioniert bei mir. Ich setze das Eingabeelement auf -100 mit absoluter Position, dann in meinen Code ref={(ref)=>{this.fileUploadRef = ref}und dann auf meine SchaltflächeonClick={()=>{this.fileUploadRef.click()}}
Richard
19

Folgendes sollte im Mai 2018 mit ES6 React Docs als Referenz funktionieren: 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;
Sir Codes viel
quelle
Dies sieht nach einer reaktionsorientierteren Antwort aus.
Ritik
9

Sie können einen refRückruf verwenden, der das zurückgibt node. Rufen Sie click()diesen Knoten auf, um einen programmgesteuerten Klick auszuführen.

Den divKnoten bekommen

clickDiv(el) {
  el.click()
}

Einstellen refdes divKnotens

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

Überprüfen Sie die Geige

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

Ich hoffe es hilft!

Pranesh Ravi
quelle
Wenn Sie auf eine jsfiddle verlinken, ist es eine gute Praxis, mindestens den relevanten Code hier einzufügen (übrigens: Der Snippet-Editor unterstützt auch Reactjs)
Icepickle
4
Es ist anzumerken, dass der String-Ref-Ansatz zwar nicht veraltet ist, jedoch als Legacy-Funktionalität betrachtet wird, die durch die Callback-basierte Syntax ersetzt wird: ref={elem => this.elem = elem}- Dies wird in Refs to Components beschrieben .
John Weisz
1
@ JohnWhite Gültiger Vorschlag. Die Antwort wurde aktualisiert!
Pranesh Ravi
Außerdem müssen Sie überprüfen und sicherstellen, dass elnicht null / undefiniert ist, bevor Sie dies tun.
Janex
4

In einer funktionalen Komponente funktioniert dieses Prinzip auch, es ist nur eine etwas andere Syntax und Denkweise.

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

}
Unveränderlicher Ziegel
quelle
3

Hier ist die Hooks-Lösung

    import React, {useRef} from 'react';

    const MyComponent = () =>{

    const myRefname= useRef(null);

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

    return (
      <div onClick={handleClick}>
        <input ref={myRefname}/>
      </div>
     );
    }
Sajad Saderi
quelle
"myRefname.current.focus ist keine Funktion"
Spoderman4
2

Versuchen Sie dies und lassen Sie mich wissen, wenn es auf Ihrer Seite nicht funktioniert:

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

Durch Klicken auf das divsollte ein Klick auf das inputElement simuliert werden

Alex Oleksiiuk
quelle
0

Wenn es in der neuesten Version von reactjs nicht funktioniert, versuchen Sie es mit innerRef

class MyComponent extends React.Component {


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

  handleClick = (e) => {
    this.inputElement.click();
  }
}
mXaln
quelle
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>

Diese Arbeit für mich

Arslan
quelle
0

React Hooks und den useRefHook verwenden .

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>
    );
}
Aaron Hakala
quelle
-1

Wie wäre es einfach nur alte js? Beispiel:

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>
);
taggartJ
quelle
Erwartung ist in Reaktion
Nitin Kumar