আমি একটি মোড়কের উপাদানটি লিখেছি যা এই উদ্দেশ্যে গ্রহণযোগ্য উত্তরগুলির ভিত্তিতে পুনরায় ব্যবহার করা যেতে পারে। আপনার যা করার দরকার তা যদি একটি স্ট্রিং পাস করা হয় তবে কেবল একটি ডেটা-অ্যাট্রিবিউট যুক্ত করুন এবং এটি e.getget.dataset থেকে পড়ুন (অন্যদের মতো পরামর্শ দেওয়া হয়েছে)। ডিফল্টরূপে আমার মোড়ক কোনও ফাংশন এবং 'অন' দিয়ে শুরু হওয়া কোনও প্রোপকে আবদ্ধ করবে এবং অন্যান্য ইভেন্ট ইভেন্টের যুক্তির পরে স্বয়ংক্রিয়ভাবে ডেটা প্রপকে কলারের কাছে ফিরিয়ে দেবে। যদিও আমি এটি সম্পাদনার জন্য পরীক্ষা করেছি না, এটি আপনাকে নিজেই ক্লাস তৈরি করা এড়ানোর সুযোগ দেবে এবং এটি এটি ব্যবহার করা যেতে পারে:
const DataButton = withData('button')
const DataInput = withData('input');
অথবা উপাদান এবং ফাংশন জন্য
const DataInput = withData(SomeComponent);
বা আপনি যদি পছন্দ করেন
const DataButton = withData(<button/>)
ঘোষণা করুন যে আপনার ধারক বাহিরের বাইরে (আপনার আমদানির নিকটবর্তী)
এখানে একটি ধারক ব্যবহার করা হয়:
import withData from './withData';
const DataInput = withData('input');
export default class Container extends Component {
state = {
data: [
// ...
]
}
handleItemChange = (e, data) => {
// here the data is available
// ....
}
render () {
return (
<div>
{
this.state.data.map((item, index) => (
<div key={index}>
<DataInput data={item} onChange={this.handleItemChange} value={item.value}/>
</div>
))
}
</div>
);
}
}
এখানে ডেটা.জেএস সহ র্যাপার কোডটি রয়েছে:
import React, { Component } from 'react';
const defaultOptions = {
events: undefined,
}
export default (Target, options) => {
Target = React.isValidElement(Target) ? Target.type : Target;
options = { ...defaultOptions, ...options }
class WithData extends Component {
constructor(props, context){
super(props, context);
this.handlers = getHandlers(options.events, this);
}
render() {
const { data, children, ...props } = this.props;
return <Target {...props} {...this.handlers} >{children}</Target>;
}
static displayName = `withData(${Target.displayName || Target.name || 'Component'})`
}
return WithData;
}
function getHandlers(events, thisContext) {
if(!events)
events = Object.keys(thisContext.props).filter(prop => prop.startsWith('on') && typeof thisContext.props[prop] === 'function')
else if (typeof events === 'string')
events = [events];
return events.reduce((result, eventType) => {
result[eventType] = (...args) => thisContext.props[eventType](...args, thisContext.props.data);
return result;
}, {});
}