কীভাবে ম্যানুয়ালি ক্লিক ইভেন্টকে রিঅ্যাক্টজেএসে ট্রিগার করবেন?


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-rodzone/blob/master/src/index.js#L7
আহমেদ নুমান

আপনি কখনই প্রতিক্রিয়াতে এটি করতে চান তা আমি দেখতে পাচ্ছি না। আপনি কি খুঁজছেন?
tobiasandersen

@ টোবিয়াস্যান্ডারসেন এটি কোনও inputউপাদানকে প্রোগ্রামক্রমে ফোকাস করার জন্য একদম বৈধ ব্যবহার-কেস , যা সম্ভবত প্রশ্নকর্তা প্রোগ্রামিকভাবে ট্রিগারযুক্ত ক্লিকের সাথে কী অর্জন করতে চায়।
জন ওয়েইজ

হ্যাঁ নিশ্চিত, ফোকাস এবং অস্পষ্ট উভয়ই পুরোপুরি বৈধ। কিন্তু ক্লিক করছেন? যে কারণটি আমি জিজ্ঞাসা করছি তা হ'ল যদি উদাহরণস্বরূপ ব্যবহারের ক্ষেত্রে ফোকাস করা হয় তবে তা দেখানো ভাল। তবে ক্লিকটি যদি সত্যিই ব্যবহারের ক্ষেত্রে হয় তবে হ্যান্ডলারের সাথে কেবল কল করা ভাল।
tobiasandersen

পছন্দ করেছেন এর পিছনে আসল উদ্দেশ্য কী তা কেবল দেখতে চেয়েছিলাম।
tobiasandersen

উত্তর:


121

আপনি কলব্যাকের মাধ্যমে refঅন্তর্নিহিত এইচটিএমএলপুট উপাদান উপাদানটির একটি রেফারেন্স অর্জন করতে প্রপ ব্যবহার করতে পারেন , রেফারেন্সটিকে শ্রেণীর সম্পত্তি হিসাবে সংরক্ষণ করতে পারেন, তারপরে এই রেফারেন্সটি পরে আপনার ইভেন্ট হ্যান্ডলারগুলি থেকে এইচটিএমএলিমেন্ট.লিক পদ্ধতিতে ক্লিক করে ট্রিগার করতে ব্যবহার করতে পারেন

আপনার 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প্রকৃত ডোম-নোড।


7
এটি আমার জন্য কাজ করছে না। এটির মেয়াদ শেষ হয়ে গেছে কিনা তা নিশ্চিত নই, তবে আমি সফলভাবে উপাদানটি বরাদ্দ করেছি তবে আমি যখন clickএটির কল করি তখন clickঅপরিজ্ঞাত হয়। আমি অন্যান্য সমস্ত বৈশিষ্ট্য এবং কলব্যাক দেখতে পাচ্ছি যা আমি সেই উপাদানটির জন্য নিযুক্ত করেছি। কোন ধারনা?
TheJKFever

40
"রিফসগুলি আর কোনও ডকুমেন্ট ডিওএম নোড ফিরিয়ে দেয় না, তারা একটি রিঅ্যাক্ট ভার্চুয়াল ডোম নোডের রেফারেন্স দেয়" এটি অবশ্যই একটি ভুল ধারণা। রেফসগুলি "ভার্চুয়াল ডিওএম" নোড দেয় না। সূত্র: আমি প্রতিক্রিয়া নিয়ে কাজ করি।
ড্যান আব্রামভ

4
@ ড্যানআব্রামভ তাহলে এর জন্য প্রস্তাবিত পদ্ধতি কী?
ড্যাশবোর্ড

4
@ জোহানওয়েজ আপনাকে অনেক ধন্যবাদ জানায়, এটি আমার পক্ষে কাজ করেছে, ফর্মের বাইরে ক্লিক করার সাথে আমার এই প্রয়োজনীয়তা ছিল কারণ আমি বোতাম এবং ফর্মের মধ্যে কিছু উপাদান রাখতে চাইছি।
মার্কাস ইথার

4
আমার জন্য কাজ কর. আমি ইনপুট উপাদানটি নিখুঁত অবস্থানের সাথে -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;

এটি আরও প্রতিক্রিয়া ওরিয়েন্টেড উত্তরের মত দেখাচ্ছে ।
itত্বিক

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/

আশা করি এটা সাহায্য করবে!


আপনি যখন জিসফিডেলের সাথে লিঙ্ক করেন, কমপক্ষে এখানে প্রাসঙ্গিক কোডটি রাখার জন্য একটি ভাল অনুশীলন হয়েছে (বিটিডাব্লু: স্নিপেট সম্পাদকটিও রিএ্যাকটজকে সমর্থন করে)
আইসপিকল

4
এটি লক্ষণীয় যে স্ট্রিং রেফের পদ্ধতির অবমূল্যায়নref={elem => this.elem = elem} না করলেও কল্যাগব্যাক -ভিত্তিক সিনট্যাক্স দ্বারা ছাড়ানো উত্তরাধিকার কার্যকারিতা হিসাবে বিবেচিত হয়: - এটি রেফস টু কম্পোনেন্টগুলিতে বিস্তারিত ।
জন ওয়েইজ

4
@ জন হোয়াইট বৈধ পরামর্শ। উত্তর আপডেট!
প্রণেশ রবি

এছাড়াও, আপনাকে পরীক্ষা করে দেখতে হবে এবং এটি করার 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>
     );
    }

"মাইআরফনেম.কন্ট্রন.ফোকাস কোনও ফাংশন নয়"
স্পোডারম্যান 4

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 ? পরিবর্তে Do myInput.current .click () করার চেষ্টা করেছো | আপনি করুন: myInput.current.dispatchEvent (নতুন মাউসইভেন্ট ('ক্লিক', {দর্শন: উইন্ডো, বুদবুদ: সত্য, বাতিলকরণযোগ্য: সত্য, বোতাম: 1,}),); এটি কাজ করা উচিত
jackbridger

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

এবং আপনার জেএসএক্স:

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

0

যদি এটি রিট্যাক্সের সর্বশেষতম সংস্করণে কাজ না করে তবে ইনারআরফ ব্যবহার করে দেখুন

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

কীভাবে স্রেফ পুরানো জেএস সম্পর্কে? উদাহরণ:

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

প্রত্যাশা প্রতিক্রিয়া হয়
নিতিন কুমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.