Ich habe eine Wrapper-Komponente geschrieben, die für diesen Zweck wiederverwendet werden kann und auf den hier akzeptierten Antworten aufbaut. Wenn Sie jedoch nur eine Zeichenfolge übergeben müssen, fügen Sie einfach ein Datenattribut hinzu und lesen Sie es aus e.target.dataset (wie einige andere vorgeschlagen haben). Standardmäßig bindet mein Wrapper an alle Requisiten, die eine Funktion sind, und beginnt mit 'on'. Die Daten-Requisiten werden nach allen anderen Ereignisargumenten automatisch an den Aufrufer zurückgegeben. Obwohl ich es nicht auf Leistung getestet habe, haben Sie die Möglichkeit, die Klasse nicht selbst zu erstellen, und es kann folgendermaßen verwendet werden:
const DataButton = withData('button')
const DataInput = withData('input');
oder für Komponenten und Funktionen
const DataInput = withData(SomeComponent);
oder wenn Sie es vorziehen
const DataButton = withData(<button/>)
erklären, dass außerhalb Ihres Containers (in der Nähe Ihrer Importe)
Hier ist die Verwendung in einem Container:
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>
);
}
}
Hier ist der Wrapper-Code '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;
}, {});
}