ReactJS'de tıklama olayını manuel olarak nasıl tetikleyebilirim?


97

ReactJS'de bir tıklama olayını manuel olarak nasıl tetikleyebilirim ? Bir kullanıcı öğe1'i tıkladığında, inputetiketin tıklanmasını otomatik olarak tetiklemek istiyorum .

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

Bazı harici kitaplıklara baktığımızda, giriş öğesini programlı olarak yapmak iyi bir fikir gibi görünüyor: github.com/okonet/react-dropzone/blob/master/src/index.js#L7
Ahmed Nuaman

Bunu neden React'te yapmak isteyeceğini anlayamıyorum. Ne yapmak istiyorsun?
tobiasandersen

@tobiasandersen Bir inputöğeye programlı olarak odaklanmak tamamen geçerli bir kullanım durumudur ve soruyu soran kişinin programla tetiklenen tıklama ile başarmak istediği şey olabilir.
John Weisz

Evet tabi, hem odak hem de bulanıklık mükemmel bir şekilde geçerlidir. Ama tıklamak? Sormamın nedeni, örneğin odaklanma kullanım durumu ise, bunu göstermek daha iyidir. Ancak tıklama gerçekten kullanım durumuysa, işleyiciyi aramak daha iyidir.
tobiasandersen

@JohnWhite Well, doğru bağlanabilirdi :) Ama muhtemelen haklısın ve bu benim küstahça çıkmak istemedim. Bunun arkasındaki gerçek niyetin ne olduğunu görmek istedim.
tobiasandersen

Yanıtlar:


121

Sen kullanabilirsiniz refyatan bir başvuru kazanmak pervane HTMLInputElement , bir geri arama nesneye bir sınıf özelliği olarak başvuru depolamak ve ardından kullanarak olay işleyicileri daha sonra tetiğe referansı bir tıklama kullanmak HTMLElement.click yöntemi.

Senin içinde renderyöntemle:

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

Olay işleyicinizde:

this.inputElement.click();

Tam örnek:

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

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

Geri aramada doğru sözcük kapsamını sağlayan ES6 ok işlevine dikkat thisedin. Ayrıca, bu yolla elde ettiğiniz nesnenin document.getElementById, kullanarak elde edeceğiniz şeye benzer bir nesne , yani gerçek DOM düğümü olduğunu unutmayın.


7
Bu benim için çalışmıyor. Değil emin modası geçmiş olur, ama başarılı elemanı atamak, ama dediğim zaman eğer clicküzerinde, clicktanımlanmamış. Bu öğeye atadığım diğer tüm öznitelikleri ve geri aramaları görebiliyorum. Herhangi bir fikir?
TheJKFever

40
"Referanslar artık bir belge DOM düğümü döndürmüyor, bir React sanal DOM düğümüne başvuru döndürüyorlar" Bu kesinlikle bir yanılgıdır. Referanslar "sanal DOM" düğümleri döndürmez. Kaynak: React üzerinde çalışıyorum.
Dan Abramov

4
@DanAbramov Peki bunun için önerilen yöntem nedir?
gösterge tablosu

1
@JohnWeisz Çok teşekkürler, benim için işe yaradı, bu zorunluluğum Form dışında tıklama ile başa çıkmak zorunda kaldım çünkü düğme ile form arasına bazı öğeler koymam gerekti.
Markus Ethur

1
Benim için çalışıyor. Giriş elemanını -100'e mutlak konumla, sonra ref={(ref)=>{this.fileUploadRef = ref}onClick={()=>{this.fileUploadRef.click()}}
Richard

20

Mayıs 2018'de ES6 React Docs ile çalışmak için aşağıdakileri referans olarak aldım: 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;

Bu daha çok React Odaklı cevap gibi görünüyor .
Ritik

8

refGeri aramayı kullanabilirsiniz, bu da node. click()Programlı tıklama yapmak için bu düğümü çağırın .

Alma divdüğümü

clickDiv(el) {
  el.click()
}

Düğüm refiçin a ayarlamadiv

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

Kemanı kontrol et

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

Umarım yardımcı olur!


Bir jsfiddle'a bağlantı oluşturduğunuzda, en azından ilgili kodu buraya koymanın iyi bir uygulama olduğu kabul edilir (btw: pasaj editörü reactj'leri de destekler)
Icepickle

4
String ref yaklaşımı kullanımdan kaldırılmasa da, geri çağrı tabanlı sözdizimi tarafından değiştirilen eski işlevsellik olarak kabul edildiğini belirtmek gerekir: ref={elem => this.elem = elem}- Bu, Bileşenlere Başvurular bölümünde ayrıntılı olarak açıklanmıştır .
John Weisz

1
@JohnWhite Geçerli öneri. Cevap güncellendi!
Pranesh Ravi

Ayrıca, bunu elyapmadan önce null / undefined olmadığını kontrol etmeniz ve emin olmanız gerekir .
janex

4

İşlevsel bir bileşende bu ilke de işe yarar, sadece biraz farklı bir sözdizimi ve düşünme biçimidir.

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

Bunu deneyin ve sizin tarafınızdan işe yaramazsa bana bildirin:

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

Öğesine tıklamak div, inputöğeye bir tıklamayı simüle etmelidir


2

İşte Hooks çözümü

    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 bir işlev değildir"
Spoderman4

1

React Hook'larını ve useRefkancayı kullanma .

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

Benim için bu, tıklama ve odak kullanılamadığı için çalışmıyordu. Ama bu cevap ne işe yaradı, stackoverflow.com/a/54316368/3893510 myInput.current? .Click (); Yaparsınız: myInput.current.dispatchEvent (yeni MouseEvent ('tıklama', {görünüm: pencere, baloncuklar: doğru, iptal edilebilir: doğru, düğmeler: 1,}),); Çalışması gerekir
jackbridger

1

Aaron Hakala'nın kullanımıyla cevabına değinmek Bu cevaptan ilham alan Ref: 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,
      }),
    );
  };

Ve JSX'iniz:

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

0

Reactjs'in en son sürümünde çalışmazsa, innerRef'i kullanmayı deneyin.

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>

Bu benim için çalışıyor


-2

Basit eski js nasıl olur? misal:

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

Beklenti React'te
Nitin Kumar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.