Bagaimana cara memicu event klik secara manual di ReactJS?

98

Bagaimana saya bisa secara manual memicu event klik di ReactJS ? Saat pengguna mengklik elemen1, saya ingin memicu klik pada inputtag secara otomatis.

<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
sumber
Melihat beberapa perpustakaan eksternal, tampaknya ide yang bagus untuk membuat elemen masukan secara terprogram: github.com/okonet/react-dropzone/blob/master/src/index.js#L7
Ahmed Nuaman
Saya tidak mengerti mengapa Anda ingin melakukan ini di React. Apa yang ingin Anda lakukan?
tobiasandersen
@tobiasandersen Ini adalah kasus penggunaan yang benar-benar valid untuk memfokuskan inputelemen secara terprogram , yang kemungkinan besar ingin dicapai oleh penanya dengan klik yang dipicu secara terprogram.
John Weisz
Ya tentu, baik fokus maupun blur sangat valid. Tapi mengklik? Alasan saya bertanya adalah jika misalnya fokus adalah kasus penggunaan, maka lebih baik untuk menunjukkannya. Namun jika klik benar-benar merupakan kasus penggunaan, maka lebih baik memanggil penangannya saja.
tobiasandersen
@JohnWhite Yah itu bisa diikat dengan benar :) Tapi Anda mungkin benar, dan itu bukan maksud saya untuk bersikap sombong. Hanya ingin melihat apa maksud sebenarnya di balik ini.
tobiasandersen

Jawaban:

121

Anda dapat menggunakan refprop untuk mendapatkan referensi ke objek HTMLInputElement yang mendasari melalui callback, menyimpan referensi sebagai properti kelas, kemudian menggunakan referensi tersebut untuk memicu klik nanti dari penangan peristiwa Anda menggunakan metode HTMLElement.click .

Dalam rendermetode Anda :

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

Di event handler Anda:

this.inputElement.click();

Contoh lengkap:

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

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

Perhatikan fungsi panah ES6 yang menyediakan cakupan leksikal yang benar untuk thiscallback. Juga perhatikan, bahwa objek yang Anda peroleh dengan cara ini adalah objek yang mirip dengan apa yang akan Anda peroleh dengan menggunakan document.getElementById, yaitu simpul DOM sebenarnya.

John Weisz
sumber
7
Ini tidak berhasil untuk saya. Tidak yakin apakah itu kedaluwarsa, tetapi saya berhasil menetapkan elemen, tetapi ketika saya memanggilnya click, clicktidak ditentukan. Saya dapat melihat semua atribut dan callback lain yang telah saya tetapkan ke elemen itu. Ada ide?
TheJKFever
40
"Ref tidak lagi mengembalikan node DOM dokumen, mereka mengembalikan referensi ke node DOM virtual React" Itu jelas merupakan kesalahpahaman. Ref tidak mengembalikan node "DOM virtual". Sumber: Saya mengerjakan React.
Dan Abramov
4
@DanAbramov Jadi, apa metode yang direkomendasikan untuk ini?
dasbor
1
@JohnWeisz Terima kasih banyak, ini berhasil untuk saya, saya harus menangani kebutuhan ini dengan mengklik di luar Formulir karena saya harus meletakkan beberapa elemen antara tombol dan formulir.
Markus Ethur
1
Bekerja untuk saya. Saya meletakkan elemen input pada -100 dengan posisi absolut, lalu di kode saya ref={(ref)=>{this.fileUploadRef = ref}dan kemudian tombol sayaonClick={()=>{this.fileUploadRef.click()}}
Richard
21

Dapatkan yang berikut ini untuk bekerja pada Mei 2018 dengan ES6 React Docs sebagai referensi: 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 Alot
sumber
Ini terlihat seperti jawaban yang lebih Berorientasi Reaksi .
Ritik
8

Anda dapat menggunakan refcallback yang akan mengembalikan node. Panggil click()node tersebut untuk melakukan klik terprogram.

Mendapatkan divnode

clickDiv(el) {
  el.click()
}

Menetapkan refke divnode

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

Periksa biolanya

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

Semoga membantu!

Pranesh Ravi
sumber
ketika Anda menautkan ke jsfiddle, dianggap praktik yang baik untuk meletakkan setidaknya kode yang relevan di sini (btw: editor cuplikan juga mendukung reactjs)
Icepickle
4
Perlu dicatat bahwa meskipun pendekatan ref string tidak digunakan lagi, itu dianggap fungsionalitas lama yang digantikan oleh sintaks berbasis panggilan balik: ref={elem => this.elem = elem}- Ini dirinci dalam Referensi ke Komponen .
John Weisz
1
@JohnWhite Saran yang valid. Memperbarui jawabannya!
Pranesh Ravi
Juga, Anda perlu memeriksa dan memastikan eltidak null / undefined sebelum Anda melakukan itu.
janex
4

Dalam komponen fungsional, prinsip ini juga berfungsi, hanya saja sintaks dan cara berpikirnya sedikit berbeda.

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

}
Bata Abadi
sumber
2

Coba ini dan beri tahu saya jika tidak berhasil pada Anda:

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

Mengklik divharus mensimulasikan klik pada inputelemen

Alex Oleksiiuk
sumber
2

Berikut adalah solusi Hooks

    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
sumber
"myRefname.current.focus bukanlah sebuah fungsi"
Spoderman4
1

Menggunakan React Hooks dan 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>
    );
}
Aaron Hakala
sumber
Bagi saya ini tidak berfungsi karena klik dan fokus tidak tersedia. Tetapi apa yang berhasil adalah jawaban ini, stackoverflow.com/a/54316368/3893510 jika alih-alih mencoba melakukan myInput.current? .Click (); Anda melakukan: myInput.current.dispatchEvent (new MouseEvent ('click', {view: window, bubbles: true, cancelable: true, buttons: 1,}),); Seharusnya berhasil
jackbridger
1

Mengasah jawaban Aaron Hakala dengan useRef yang terinspirasi oleh jawaban ini 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,
      }),
    );
  };

Dan BEJ Anda:

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

Jika tidak berfungsi di versi terbaru reactjs, coba gunakan 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
sumber
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>

Ini bekerja untuk saya

arslan
sumber
-2

Bagaimana dengan js biasa saja? contoh:

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
sumber
Harapan ada di Bereaksi
Nitin Kumar