मैंने एक रैपर घटक लिखा था जिसे इस उद्देश्य के लिए पुन: उपयोग किया जा सकता है जो यहां स्वीकृत उत्तरों पर बनाता है। यदि आपको केवल एक स्ट्रिंग पास करने की आवश्यकता है, तो बस एक डेटा-विशेषता जोड़ें और इसे e.target.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>
);
}
}
यहाँ आवरण कोड 'withData.js:
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;
}, {});
}