ReactJS में क्लिक इवेंट को मैन्युअल रूप से ट्रिगर कैसे करें?


97

मैं ReactJS में मैन्युअल रूप से एक क्लिक ईवेंट को कैसे ट्रिगर कर सकता हूं ? जब कोई उपयोगकर्ता तत्व 1 पर क्लिक करता है, तो मैं स्वचालित रूप से 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
अहमद नुमान

मैं यह नहीं देख सकता कि आप रिएक्ट में ऐसा क्यों करना चाहते हैं। आपको क्या करना है?
टोबियासंडर्सन

@tobiasandersen यह प्रोग्राम को एक inputतत्व पर ध्यान केंद्रित करने के लिए एक पूरी तरह से वैध उपयोग-मामला है , जो कि संभावित रूप से प्रोग्रामर को ट्रिगर क्लिक के साथ पूरा करना चाहता है।
जॉन वीज़

हाँ, ध्यान और धुंधला दोनों पूरी तरह से मान्य हैं। लेकिन क्लिक करना? कारण मैं पूछ रहा हूं कि यदि उदाहरण ध्यान केंद्रित करने का उपयोग मामला है, तो यह दिखाना बेहतर है। लेकिन अगर क्लिक वास्तव में उपयोग का मामला है, तो यह बेहतर है कि केवल हैंडलर को कॉल करें।
टोबियासंडर्सन

@ जॉनोहाइट वैसे तो यह सही ढंग से बंधी हो सकती है :) लेकिन आप शायद सही कह रहे हैं, और यह मेरा मतलब नहीं था। बस यह देखना चाहता था कि इसके पीछे असली इरादा क्या था।
टोबियासंडर्सन

जवाबों:


121

आप कॉलबैक के माध्यम से refअंतर्निहित 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();
  }
}

ईएस 6 तीर फ़ंक्शन को नोट करें thisजो कॉलबैक के लिए सही शाब्दिक गुंजाइश प्रदान करता है । यह भी ध्यान दें, कि आप जिस तरह से इस वस्तु को प्राप्त करते हैं document.getElementById, वह एक वस्तु है जो आप उपयोग करते हुए हासिल करेंगे , अर्थात वास्तविक DOM-node।


7
यह मेरे लिए काम नहीं कर रहा है। निश्चित नहीं है कि यह पुराना है, लेकिन मैं सफलतापूर्वक तत्व असाइन करता हूं, लेकिन जब मैं इस clickपर कॉल करता हूं , तो clickयह अपरिभाषित है। मैं अन्य सभी विशेषताओं और कॉलबैक को देख सकता हूं जो मैंने उस तत्व को सौंपा है। कोई विचार?
TheJKFever

40
"रेफरी अब एक दस्तावेज़ डोम नोड वापस नहीं करता है, वे एक प्रतिक्रिया आभासी डोम नोड के संदर्भ में लौटते हैं" यह निश्चित रूप से एक गलत धारणा है। Refs "वर्चुअल DOM" नोड्स वापस नहीं करता है। स्रोत: मैं रिएक्ट पर काम करता हूं।
दान अब्रामोव

4
@DanAbramov तो इसके लिए अनुशंसित विधि क्या है?
डैशबोर्ड

1
@JohnWeisz आपको बहुत बहुत धन्यवाद, इसने मेरे लिए काम किया, मुझे फॉर्म के बाहर क्लिक के साथ हैंडल करने की यह आवश्यकता थी क्योंकि मुझे बटन और फॉर्म के बीच कुछ तत्व डालने थे।
मार्कस इथोर

1
मेरे लिये कार्य करता है। मैंने पूरी स्थिति के साथ इनपुट तत्व को -100 पर डाल दिया, फिर अपने कोड में ref={(ref)=>{this.fileUploadRef = ref}और फिर मेरे बटनonClick={()=>{this.fileUploadRef.click()}}
रिचर्ड

20

एक संदर्भ के रूप में ES6 रिएक्ट डॉक्स के साथ मई 2018 काम करने के लिए निम्नलिखित प्राप्त करें : 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;

यह अधिक रिएक्ट ओरिएंटेड उत्तर की तरह दिखता है ।
ऋतिक

8

आप refकॉलबैक का उपयोग कर सकते हैं जो वापस आ जाएगा nodeclick()एक प्रोग्रामेटिक क्लिक करने के लिए उस नोड पर कॉल करें।

divनोड प्राप्त करना

clickDiv(el) {
  el.click()
}

नोड के refलिए एक सेटिंगdiv

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

फिडल को चेक करें

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

आशा करता हूँ की ये काम करेगा!


जब आप एक jsfiddle से लिंक करते हैं, तो कम से कम प्रासंगिक कोड यहां (btw: स्निपेट संपादक प्रतिक्रिया के रूप में अच्छी तरह से समर्थन करता है) डालने के लिए एक अच्छा अभ्यास माना जाता है
Icepickle

4
यह ध्यान देने योग्य है कि जब स्ट्रिंग रेफरी दृष्टिकोण को पदावनत नहीं किया जाता है, तो इसे विरासत की कार्यक्षमता माना जाता है जिसे कॉलबैक-आधारित सिंटैक्स द्वारा अलग किया जाता है: ref={elem => this.elem = elem}- यह Refs to Components में विस्तृत है ।
जॉन वीज़

1
@ जॉनहोइट मान्य सुझाव। उत्तर अपडेट किया गया!
प्राणेश रवि

इसके अलावा, आपको यह जांचने और सुनिश्चित करने की आवश्यकता elहै कि ऐसा करने से पहले आप अशक्त / अनिर्धारित नहीं हैं।
जेनेक्स

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>

क्लिक divकरना चाहिए inputतत्व पर एक क्लिक अनुकरण करना चाहिए


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 एक फ़ंक्शन नहीं है"
Spoderman4

1

रिएक्ट हुक और 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>
    );
}

मेरे लिए यह क्लिक और फोकस उपलब्ध नहीं होने के कारण काम नहीं कर रहा था। लेकिन क्या काम किया है यह जवाब है, stackoverflow.com/a/54316368/3893510 अगर myInput.current करने की कोशिश के बजाय .click (); आप ऐसा करते हैं: myInput.current.dispatchEvent (नया MouseEvent ('क्लिक', {दृश्य: विंडो, बुलबुले: सच, रद्द करने योग्य: सत्य, बटन: 1,}),); यह काम करना चाहिए
जैकबरीगर

1

उपयोग के साथ हारून हकला के जवाब पर रीफिंग इस उत्तर से प्रेरित 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 के नवीनतम संस्करण में काम नहीं करता है, तो इनरर्फ का उपयोग करके देखें

class MyComponent extends React.Component {


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

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


-2

कैसे के बारे में सिर्फ सादे पुराने जे एस? उदाहरण:

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

उम्मीद रिएक्ट में है
नितिन कुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.