Saya menulis komponen pembungkus yang dapat digunakan kembali untuk tujuan ini yang dibangun berdasarkan jawaban yang diterima di sini. Jika semua yang perlu Anda lakukan adalah meneruskan sebuah string, maka tambahkan saja atribut data dan bacalah dari e.target.dataset (seperti yang disarankan beberapa orang lain). Secara default pembungkus saya akan mengikat ke prop apa pun yang merupakan fungsi dan dimulai dengan 'on' dan secara otomatis meneruskan prop data kembali ke pemanggil setelah semua argumen acara lainnya. Meskipun saya belum mengujinya untuk kinerja, itu akan memberi Anda kesempatan untuk menghindari membuat kelas sendiri, dan itu dapat digunakan seperti ini:
const DataButton = withData('button')
const DataInput = withData('input');
atau untuk Komponen dan fungsi
const DataInput = withData(SomeComponent);
atau jika Anda suka
const DataButton = withData(<button/>)
nyatakan bahwa Di luar wadah Anda (dekat impor Anda)
Berikut ini adalah penggunaan dalam wadah:
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>
);
}
}
Ini adalah kode wrapper '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;
}, {});
}