অনক্লিক প্রতিক্রিয়া - পরামিতি সহ ইভেন্ট পাস


93

প্যারামিটার ছাড়াই

function clickMe(e){
  //e is the event
}

<button onClick={this.clickMe}></button>

প্যারামিটার সহ

function clickMe(parameter){
  //how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>

আমি পেতে চাই event। আমি কিভাবে এটি পেতে পারি?

উত্তর:


166

এটা চেষ্টা কর:

<button onClick={(e) => {
     this.clickMe(e, someParameter)
}}>Click Me!</button>

এবং আপনার ফাংশনে:

function clickMe(event, someParameter){
     //do with event
}

4
এটি আমাকে একটি এসিলিন্ট ত্রুটি দিয়েছিল ( eslint.org/docs/rules/arrow-parens.html ) আমি যা করেছি তা বন্ধনীতে ফাংশন পরামিতিগুলি আবৃত ছিলonClick={(e) => { this.clickMe(e, someparameter) }}
ক্রেটজম

4
হ্যাঁ @ ক্রেটজম আমরা যদি ধনুর্বন্ধনী না দিই, এটি একক লাইন হলে এটি একটি রিটার্ন এক্সপ্রেশন হিসাবে কাজ করে অন্যথায় আমাদের অবশ্যই একটি ক্রিয়াকলাপের অংশ হিসাবে মোড়ানোর জন্য ব্রেস ব্যবহার করতে হবে।
জ্যোতি বাবু আরজা

4
আমি কেবল এটি যুক্ত করতে চাই এটি একটি প্রস্তাবিত বাক্য গঠন নয়। রিঅ্যাক্টজ ডক্স থেকে: এই সিনট্যাক্সের সাথে সমস্যাটি হ'ল প্রতি বার বোতামটি রেন্ডার করে একটি আলাদা কলব্যাক তৈরি করা হয়। বেশিরভাগ ক্ষেত্রে, এটি ঠিক আছে। যাইহোক, যদি এই কলব্যাকটি নিম্ন উপাদানগুলিতে প্রপ হিসাবে পাস করা হয় তবে components উপাদানগুলি একটি অতিরিক্ত পুনরায় রেন্ডারিং করতে পারে। এই ধরণের পারফরম্যান্স সমস্যা এড়াতে আমরা সাধারণত কনস্ট্রাক্টরকে বাঁধাই বা ক্লাস ফিল্ড সিনট্যাক্স ব্যবহার করার পরামর্শ দিই। এ আরো তথ্য reactjs.org
northernwind

4
@ উইক্টর হ্যাঁ তুমিই ঠিক. তবে আপনি যদি নিজের কলব্যাকের ভিতরে আপনার পিতামাতার প্রসঙ্গটি চান তবে প্রতিটি রেন্ডারে আপনার আলাদা কলব্যাক থাকা দরকার। আসলে এটি আমার মনে হয় এমন একটি বাণিজ্য।
জ্যোতি বাবু আরজা

@ জ্যোতিবাবুআরজা আমি মনে করি data-*এইচটিএমএল 5 এর বৈশিষ্ট্যগুলি ব্যবহার করা সবচেয়ে ভাল সমাধান । আরও তথ্যের জন্য দয়া করে নীচে আমার উত্তর দেখুন।
হ্যারি চ্যাং

34

ES6 এর সাহায্যে আপনি আরও ছোট উপায়ে এটি করতে পারেন:

const clickMe = (parameter) => (event) => {
    // Do something
}

এবং এটি ব্যবহার করুন:

<button onClick={clickMe(someParameter)} />

এটি কি নতুন কলব্যাক ইস্যু তৈরি করতেও সমাধান করে? stackoverflow.com/questions/42597602/…
ওটানি শুভ

4
এটি ছাড়াও, আপনি একাধিক পরামিতি প্রেরণ করতে পারেন। কনস্ট ক্লিকমে = (প্যারামিটার 1, প্যারামিটার 2) => (ইভেন্ট) => {// কিছু করুন}
আহুরামজদা

4
আপনার উপাদানটি মাউন্ট করা থাকলে এইটিকেও বরখাস্ত করা হয়, আপনার কোডটি হওয়া উচিত:onClick={(e) => clickMe(someParameter)(e)}
আলেকজান্ডার কিম

একইভাবে যদি কেবল ক্লিক করুন, আপনি ইভেন্টটিকে ধ্বংস করতে পারেন, এমনকি আপনি এটি প্যারামিটার হিসাবে সংজ্ঞায়িত করেন না।
মিনহা খা

এর জন্য ধন্যবাদ. এটা কাজ করে। কিন্তু কেন নেই const clickMe = (parameter) => (event) => {...} পরিবর্তে const clickMe = (parameter) => {...}?
zrna

16

সমাধান 1

function clickMe(parameter, event){
}

<button onClick={(event) => {this.clickMe(someparameter, event)}></button>

সমাধান 2 বাইন্ড ফাংশনটি ব্যবহার করে তীর ফাংশন পদ্ধতির চেয়ে ভাল বিবেচনা করা হয় 1. দ্রষ্টব্য, ইভেন্ট পরামিতি হ্যান্ডলারের ফাংশনের শেষ প্যারামিটার হওয়া উচিত

function clickMe(parameter, event){
}

<button onClick={this.clickMe.bind(this, someParameter)}></button>

সমাধান # 2-এ ইভেন্ট প্যারামিটারের শেষ জিনিস হ'ল +1। আমি কী ভুল করছি তা অনুধাবনের জন্য আমাকে চিরকাল নিয়ে গিয়েছিল, ডক্সের কোনও কারণটি আমি অবশ্যই মিস করেছি।
অ্যাবেলিটো

5

নতুন কলব্যাক ইস্যুটি সম্পূর্ণরূপে সমাধানের জন্য, ব্যবহার করুন data-* এইচটিএমএল 5 বৈশিষ্ট্যগুলি হ'ল সেরা সমাধান আইএমও। যেহেতু দিনের শেষে, আপনি পরামিতিগুলি পাস করার জন্য একটি উপ-উপাদানটি বের করে নিলেও এটি এখনও নতুন ফাংশন তৈরি করে।

উদাহরণ স্বরূপ,

const handleBtnClick = e => {
  const { id } = JSON.parse(e.target.dataset.onclickparam);
  // ...
};

<button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>

গুণাবলী ব্যবহারের জন্য https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes দেখুন data-*


আমি এই পদ্ধতির পছন্দ। সহজ এবং পরিষ্কার
15

5

সংবাহন ES6 উদাহরণ:

const clickHandler = param => event => {
  console.log(param); // your parameter
  console.log(event.type); // event type, e.g.: click, etc.
};

আমাদের বোতামটি হ্যান্ডলারটি টগল করে:

<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>

আপনি যদি কোনও ইভেন্ট অবজেক্ট ছাড়াই এই ফাংশন এক্সপ্রেশনটিকে কল করতে চান, তবে আপনি এটিকে এটি কল করতে চাই:

clickHandler(1)();

এছাড়াও, যেহেতু প্রতিক্রিয়া সিন্থেটিক ইভেন্টগুলি (নেটিভ ইভেন্টগুলির জন্য একটি মোড়ক) ব্যবহার করে, তাই একটি ইভেন্ট পুলিং জিনিস রয়েছে যার অর্থ, যদি আপনি নিজের eventঅবজেক্টকে অবিচ্ছিন্নভাবে ব্যবহার করতে চান তবে আপনাকে ব্যবহার করতে হবে event.persist():

const clickHandler = param => event => {
  event.persist();
  console.log(event.target);
  setTimeout(() => console.log(event.target), 1000); // won't be null, otherwise if you haven't used event.persist() it would be null.
};

এখানে সরাসরি উদাহরণ: https://codesandbox.io/s/compassionate- joliot-4eblc?foutsize=14&hidenavication =1& theme=dark


কেন আমি এখনও আছে করতে হবে event.persist()সঙ্গে console.log(event)কিন্তু আমি সঙ্গে এটি প্রয়োজন হবে না console.log(event.target)?
ইসহাক পাক


এই প্রসঙ্গে কারিঙের চেয়ে 2 টি প্যারাম প্রাপ্ত কোনও সাধারণ ফাংশন ব্যবহার করা তত দ্রুত faster আপনি jsben.ch
ncesar

@ncesar আপনি কীভাবে jsben.ch এ প্রতিক্রিয়া সেট করবেন? আপনার পরীক্ষা plz পোস্ট করুন।
আইজাক পাক

জাভাস্ক্রিপ্ট কোডগুলি পরীক্ষা করার জন্য @ ইসাকাক জ্যাকবেন একটি সাধারণ সরঞ্জাম tool আপনি কোডের দুটি ভিন্ন নমুনা রাখেন এবং তাদের গতি তুলনা করেন। আপনাকে আপনার পুরো প্রতিক্রিয়া কোড রাখতে হবে না, কেবল এমন একটি ফাংশন যা আপনি ভাবেন যে ধীর হতে পারে এবং আপনি পরীক্ষা করতে চান। এছাড়াও, আমি নিশ্চিত হয়ে ওঠার জন্য সবসময় jsben.ch এবং jsbench.me ব্যবহার করি। ক্লিকহ্যান্ডলার প্রসঙ্গে আপনাকে কিছু কোড উপহাস করতে হবে। পছন্দ করুন let event;এটি একটি অপরিজ্ঞাত ত্রুটি নিক্ষেপ করবে।
ncesar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.