আপনি (বাধ্যতামূলক) কাজ (আইএনএস) এর ভার্সন এবং আপনি হুক ব্যবহার করতে চান কিনা তার সংস্করণের উপর নির্ভর করে এখানে তিনটি উত্তর রয়েছে।
আগেরটা আগে:
এটা তোলে বুঝতে কাজ প্রতিক্রিয়া গুরুত্বপূর্ণ, তাই আপনি যে জিনিসগুলিতে সঠিকভাবে (protip কি করতে পারেন: এটা হয় সুপার চলমান মূল্য মাধ্যমে টিউটোরিয়াল ব্যায়াম প্রতিক্রিয়া প্রতিক্রিয়া উপর ওয়েবসাইটের ভাল লেখা, এবং একটি উপায় যে আসলে ব্যাখ্যা কাজ করার জন্য কভার সব মূলসূত্র। কিছু)। "যথাযথভাবে" এর অর্থ হ'ল আপনি একটি অ্যাপ্লিকেশন ইন্টারফেস লিখছেন যা কোনও ব্রাউজারে রেন্ডার হওয়ার মতো হয়; সমস্ত ইন্টারফেসের কাজ প্রতিক্রিয়াতে ঘটে, "আপনি যদি ওয়েব পৃষ্ঠা লিখছেন তবে আপনি কী ব্যবহার করছেন" তে নয় (এই কারণেই অ্যাপ্লিকেশনগুলি "অ্যাপ্লিকেশনগুলি হয়," ওয়েব পৃষ্ঠাগুলি "নয়)।
প্রতিক্রিয়া অ্যাপ্লিকেশন দুটি জিনিস ভিত্তিতে রেন্ডার করা হয়:
- যে কোনও পিতা-মাতার দ্বারা ঘোষিত উপাদানগুলির বৈশিষ্ট্যগুলি সেই উপাদানটির একটি উদাহরণ তৈরি করে, যা পিতামাতার তার জীবনকাল জুড়ে পরিবর্তন করতে পারে, এবং
- উপাদানটির নিজস্ব অভ্যন্তরীণ অবস্থা, যা এটি নিজের জীবনকালক্রমে নিজেকে পরিবর্তন করতে পারে।
আপনি প্রতিক্রিয়াটি ব্যবহার করার সময় আপনি যা স্পষ্টভাবে করছেন না তা হ'ল এইচটিএমএল উপাদান তৈরি করে এবং সেগুলি ব্যবহার করে: যখন আপনি কোনও প্রতিক্রিয়া ব্যবহার করতে বলুন <input>
, উদাহরণস্বরূপ, আপনি কোনও এইচটিএমএল ইনপুট উপাদান তৈরি করছেন না , আপনি প্রতিক্রিয়াটিকে ইনপুট অবজেক্ট তৈরি করতে বলছেন এটি HTML ইনপুট উপাদান হিসাবে রেন্ডার হিসাবে ঘটে থাকে এবং যার ইভেন্টের হ্যান্ডলিংটি এইচটিএমএল উপাদানটির ইনপুট ইভেন্টগুলিতে দেখায় কিন্তু নিয়ন্ত্রণ করা হয় না ।
যখন ব্যবহার প্রতিক্রিয়া কি করছেন অ্যাপ্লিকেশন UI উপাদান আছে যা যা ব্যবহারকারীর কোনো ভূমিকা কম্পোনেন্ট রাষ্ট্রীয় পরিবর্তন, সঙ্গে (প্রায়ই manipulable) ডেটা ব্যবহারকারীর উপস্থাপন উৎপাদিত হয় পারে নতুন রাষ্ট্র প্রতিফলিত আপনার আবেদন ইন্টারফেস অংশ একটি rerender হতে পারে। এই মডেলটিতে, রাজ্য সর্বদা চূড়ান্ত কর্তৃত্ব হয়, "ইউআই লাইব্রেরিটি এটি রেন্ডার করতে ব্যবহৃত হয় না" যা ওয়েবে ব্রাউজারের ডিওএম হয়। এই প্রোগ্রামিং মডেলটিতে ডিওএম প্রায় একটি চিন্তাভাবনা: এটি কেবলমাত্র নির্দিষ্ট UI কাঠামো যা প্রতিক্রিয়া ব্যবহার করে।
সুতরাং একটি ইনপুট উপাদান ক্ষেত্রে, যুক্তিটি হ'ল:
- আপনি ইনপুট উপাদান টাইপ করুন,
- আপনার ইনপুট উপাদানটিতে এখনও কিছুই ঘটেনি, ইভেন্টটি প্রতিক্রিয়া দ্বারা বাধা পেয়েছিল এবং ততক্ষনে মারা যায় ,
- ইভেন্ট হ্যান্ডলিংয়ের জন্য আপনি যে ফাংশনটি সেট করেছেন তাতে ইভেন্টটিকে ফরোয়ার্ড করুন,
- এই ফাংশন একটি রাষ্ট্র আপডেটের সময় নির্ধারণ করতে পারে ,
- যদি এটি হয়, প্রতিক্রিয়া সেই রাষ্ট্র আপডেটটি চালায় (অবিচ্ছিন্নভাবে!) এবং
render
আপডেটের পরে একটি কল ট্রিগার করবে , তবে কেবলমাত্র রাষ্ট্রীয় আপডেট রাষ্ট্র পরিবর্তন করে।
- শুধুমাত্র পরে এই রেন্ডার হয়ে গেছে UI 'তে প্রদর্শনী যে আপনি "একটি চিঠি টাইপ করা" হবে।
এটি মিলি সেকেন্ডের ক্ষেত্রে ঘটে থাকে, যদি কম না হয়, তবে দেখে মনে হচ্ছে আপনি "পৃষ্ঠায় কেবলমাত্র একটি ইনপুট উপাদান ব্যবহার করে" ব্যবহার করে একইভাবে ইনপুট উপাদানটি টাইপ করেছেন, তবে এটি একেবারেই নয় ঘটেছিলো.
সুতরাং, এর সাথে, প্রতিক্রিয়ার উপাদানগুলির থেকে কীভাবে মূল্যবোধ পাওয়া যায় সে সম্পর্কে:
ES5 সহ 15 এবং নীচে প্রতিক্রিয়া জানান
জিনিসগুলি সঠিকভাবে করতে, আপনার উপাদানটির একটি রাষ্ট্রীয় মান রয়েছে যা একটি ইনপুট ক্ষেত্রের মাধ্যমে দেখানো হয় এবং আমরা ইউআই উপাদানটি পরিবর্তন ইভেন্টগুলিকে পুনরায় উপাদানটিতে প্রেরণ করে এটি আপডেট করতে পারি:
var Component = React.createClass({
getInitialState: function() {
return {
inputValue: ''
};
},
render: function() {
return (
//...
<input value={this.state.inputValue} onChange={this.updateInputValue}/>
//...
);
},
updateInputValue: function(evt) {
this.setState({
inputValue: evt.target.value
});
}
});
সুতরাং আমরা ব্যবহার করতে প্রতিক্রিয়া বলুন updateInputValue
যা ব্যবহারকারীর কোনো ভূমিকা হ্যান্ডেল করতে ফাংশন, ব্যবহার setState
রাষ্ট্র আপডেট করে এবং সত্য নির্দিষ্ট সময় নির্ধারণের জন্য যে render
মধ্যে কল this.state.inputValue
মানে হল যখন এটা রাষ্ট্র আপডেট করার পরে rerenders, ব্যবহারকারী তারা যা টাইপ করা উপর ভিত্তি করে আপডেট টেক্সট দেখতে হবে।
মন্তব্যের ভিত্তিতে সংযোজন
প্রদত্ত যে ইউআই ইনপুটগুলি রাষ্ট্রীয় মানগুলিকে উপস্থাপন করে (বিবেচনা করুন কোনও ব্যবহারকারী যদি মাঝের দিকে তাদের ট্যাবটি বন্ধ করে দেয় এবং ট্যাবটি পুনরুদ্ধার করা হয় তবে কী ঘটেছিল তা বিবেচনা করুন they তাদের পূরণ করা সমস্ত মানগুলি কি পুনরুদ্ধার করা উচিত? যদি তাই হয় তবে তা রাষ্ট্র)। এটি আপনাকে বড় আকারের দশ বা এমনকি একশো ইনপুট ফর্মের মতো মনে হতে পারে তবে প্রতিক্রিয়াটি আপনার ইউআইকে একটি রক্ষণাবেক্ষণযোগ্য উপায়ে মডেলিং করা সম্পর্কে: আপনার 100 টি স্বাধীন ইনপুট ক্ষেত্র নেই, আপনার সাথে সম্পর্কিত ইনপুটগুলির গ্রুপ রয়েছে, তাই আপনি প্রতিটি ক্যাপচার করেন কোনও উপাদানগুলিতে গ্রুপ করুন এবং তারপরে গ্রুপগুলির সংগ্রহ হিসাবে আপনার "মাস্টার" ফর্মটি তৈরি করুন।
MyForm:
render:
<PersonalData/>
<AppPreferences/>
<ThirdParty/>
...
এটি দৈত্য একক ফর্ম উপাদানগুলির চেয়ে বজায় রাখা আরও সহজ। রাজ্য রক্ষণাবেক্ষণ সহ উপাদানগুলিতে গোষ্ঠীগুলিকে বিভক্ত করুন, যেখানে প্রতিটি উপাদান একবারে কয়েকটি ইনপুট ক্ষেত্র ট্র্যাক করার জন্য দায়ী।
আপনার মনে হতে পারে যে এই সমস্ত কোডটি লিখতে "ঝামেলা" হয়েছে তবে এটি একটি মিথ্যা সাশ্রয়: বিকাশকারীরা যারা আপনি নন, ভবিষ্যতে আপনিও এই সমস্ত ইনপুটগুলি সুস্পষ্টভাবে আঁকড়ে দেখলে উপকার পাবেন, কারণ এটি কোড পাথগুলি সনাক্ত করতে অনেক সহজ করে তোলে। তবে আপনি সর্বদা অনুকূলিত করতে পারেন। উদাহরণস্বরূপ, আপনি একটি রাষ্ট্র লিঙ্কার লিখতে পারেন
MyComponent = React.createClass({
getInitialState() {
return {
firstName: this.props.firstName || "",
lastName: this.props.lastName || ""
...: ...
...
}
},
componentWillMount() {
Object.keys(this.state).forEach(n => {
let fn = n + 'Changed';
this[fn] = evt => {
let update = {};
update[n] = evt.target.value;
this.setState(update);
});
});
},
render: function() {
return Object.keys(this.state).map(n => {
<input
key={n}
type="text"
value={this.state[n]}
onChange={this[n + 'Changed']}/>
});
}
});
অবশ্যই, এর উন্নত সংস্করণ রয়েছে, তাই https://npmjs.com হিট করুন এবং আপনার পছন্দ মতো একটি প্রতিক্রিয়া স্থিতির সংযোগ সমাধান অনুসন্ধান করুন। ওপেন সোর্সটি বেশিরভাগই অন্যেরা ইতিমধ্যে কী করেছে তা সন্ধান করার জন্য এবং নিজেকে স্ক্র্যাচ থেকে সবকিছু লেখার পরিবর্তে এটি ব্যবহার করে।
প্রতিক্রিয়া 16 (এবং 15.5 ট্রানজিশনাল) এবং 'আধুনিক' জেএস
প্রতিক্রিয়া হিসাবে 16 (এবং 15.5 দিয়ে নরম শুরু) createClass
কলটি আর সমর্থিত নয় এবং শ্রেণি সিনট্যাক্স ব্যবহার করা দরকার। এটি দুটি জিনিস পরিবর্তিত করে: সুস্পষ্ট শ্রেণীর বাক্য গঠন, তবে this
প্রাসঙ্গিক বাঁধাই যা createClass
"ফ্রি" করতে পারে, তাই জিনিসগুলি এখনও কাজ করে তা নিশ্চিত করার জন্য this
আপনি onWhatever
হ্যান্ডলারের বেনাম ফাংশন সংরক্ষণের প্রসঙ্গে "ফ্যাট অ্যার" স্বরলিপি ব্যবহার করছেন তা নিশ্চিত করুন as onChange
কোড এখানে আমরা ব্যবহার:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
inputValue: ''
};
}
render() {
return (
//...
<input value={this.state.inputValue} onChange={evt => this.updateInputValue(evt)}/>
//...
);
},
updateInputValue(evt) {
this.setState({
inputValue: evt.target.value
});
}
});
আপনি দেখতে পেয়েছেন লোকেরা bind
তাদের সমস্ত ইভেন্ট হ্যান্ডলিং ফাংশনগুলির জন্য তাদের নির্মাতাকে ব্যবহার করে:
constructor(props) {
super(props);
this.handler = this.handler.bind(this);
...
}
render() {
return (
...
<element onclick={this.handler}/>
...
);
}
এটা করবেন না।
আপনি যে কোনও সময় ব্যবহার bind
করছেন না কেন, "আপনি এটি ভুল করছেন" প্রবাদটি প্রযোজ্য। আপনার শ্রেণি ইতিমধ্যে বস্তু প্রোটোটাইপ সংজ্ঞায়িত করে, এবং ইতিমধ্যে উদাহরণ প্রসঙ্গটি সংজ্ঞায়িত করে। bind
এর উপরে কিছু রাখবেন না ; কনস্ট্রাক্টরে আপনার সমস্ত ফাংশন কলগুলি নকল করার পরিবর্তে সাধারণ ইভেন্ট ফরোয়ার্ডিং ব্যবহার করুন, কারণ সেই সদৃশটি আপনার বাগের পৃষ্ঠকে বাড়িয়ে তোলে এবং ত্রুটিগুলি সনাক্ত করা আরও বেশি শক্ত করে তোলে কারণ আপনি যেখানে আপনার কোডটি কল করেছেন তার পরিবর্তে সমস্যাটি আপনার কনস্ট্রাক্টরে থাকতে পারে। পাশাপাশি অন্যদের উপর রক্ষণাবেক্ষণের বোঝা চাপিয়ে দেওয়া যা আপনার সাথে কাজ করতে (রয়েছে বা চয়ন করুন)।
হ্যাঁ, আমি জানি প্রতিক্রিয়া ডক্স বলছে এটি ঠিক আছে। এটা না, এটা করবেন না।
হুক সহ ফাংশন উপাদান ব্যবহার করে 16.8 প্রতিক্রিয়া জানান
১ 16.৮ এর প্রতিক্রিয়া অনুসারে ফাংশন উপাদানটি (যেমন আক্ষরিক অর্থে কেবল একটি ফাংশন যা কিছুকে props
যুক্তি হিসাবে গ্রহণ করে তা ব্যবহার করা যেতে পারে যেমন এটি কোনও উপাদান বর্গের উদাহরণ, কোনও শ্রেণি না লিখেই) হুক ব্যবহারের মাধ্যমেও রাষ্ট্র দেওয়া যেতে পারে ।
আপনার যদি পূর্ণ শ্রেণীর কোডের প্রয়োজন না হয় এবং একটি একক উদাহরণের ফাংশনটি করে, তবে আপনি এখন useState
নিজেকে একটি একক রাষ্ট্রের পরিবর্তনশীল পেতে এবং তার আপডেট ফাংশনটি ব্যবহার করতে পারেন , যা উপরের উদাহরণগুলির মতো মোটামুটি একইভাবে কাজ করে, ব্যতীত except setState
ফাংশন কল:
import { useState } from 'react';
function myFunctionalComponentFunction() {
const [input, setInput] = useState(''); // '' is the initial state value
return (
<div>
<label>Please specify:</label>
<input value={input} onInput={e => setInput(e.target.value)}/>
</div>
);
}
পূর্বে শ্রেণি এবং ফাংশন উপাদানগুলির মধ্যে অনানুষ্ঠানিক পার্থক্য ছিল "ফাংশন উপাদানগুলির স্টেট থাকে না", সুতরাং আমরা আর এটির পিছনে আড়াল করতে পারি না: ফাংশন উপাদান এবং শ্রেণীর উপাদানগুলির মধ্যে পার্থক্য খুব ভালভাবে বিভিন্ন পৃষ্ঠায় ছড়িয়ে পাওয়া যায় লিখিত প্রতিক্রিয়া ডকুমেন্টেশন (আপনার জন্য সুবিধার্থে ভুল ব্যাখ্যা করার জন্য কোনও শর্টকাট ওয়ান লাইনের ব্যাখ্যা নয়!) যা আপনার পড়া উচিত যাতে আপনি কী করছেন তা জানতে পারেন এবং যাতে আপনি নিজের প্রোগ্রামের সমাধানের জন্য সেরাটি বেছে নিয়েছিলেন (যা তার জন্যই হোক না কেন) সমাধান করতে পারেন know আপনার যে সমস্যা রয়েছে তার বাইরে
this.onSubmit.bind(this);