Lösung ein mapPropsToHandler und event.target.
Funktionen sind Objekte in js, daher ist es möglich, ihnen Eigenschaften zuzuweisen.
function onChange() { console.log(onChange.list) }
function Input(props) {
onChange.list = props.list;
return <input onChange={onChange}/>
}
Diese Funktion bindet eine Eigenschaft nur einmal an eine Funktion.
export function mapPropsToHandler(handler, props) {
for (let property in props) {
if (props.hasOwnProperty(property)) {
if(!handler.hasOwnProperty(property)) {
handler[property] = props[property];
}
}
}
}
Ich bekomme meine Requisiten einfach so.
export function InputCell({query_name, search, loader}) {
mapPropsToHandler(onChange, {list, query_name, search, loader});
return (
<input onChange={onChange}/>
);
}
function onChange() {
let {query_name, search, loader} = onChange;
console.log(search)
}
In diesem Beispiel wurden sowohl event.target als auch mapPropsToHandler kombiniert. Es ist besser, Funktionen nur an Handler anzuhängen, nicht an Zahlen oder Zeichenfolgen. Zahl und Zeichenfolgen können mit Hilfe von DOM-Attributen wie übergeben werden
<select data-id={id}/>
eher als mapPropsToHandler
import React, {PropTypes} from "react";
import swagger from "../../../swagger/index";
import {sync} from "../../../functions/sync";
import {getToken} from "../../../redux/helpers";
import {mapPropsToHandler} from "../../../functions/mapPropsToHandler";
function edit(event) {
let {translator} = edit;
const id = event.target.attributes.getNamedItem('data-id').value;
sync(function*() {
yield (new swagger.BillingApi())
.billingListStatusIdPut(id, getToken(), {
payloadData: {"admin_status": translator(event.target.value)}
});
});
}
export default function ChangeBillingStatus({translator, status, id}) {
mapPropsToHandler(edit, {translator});
return (
<select key={Math.random()} className="form-control input-sm" name="status" defaultValue={status}
onChange={edit} data-id={id}>
<option data-tokens="accepted" value="accepted">{translator('accepted')}</option>
<option data-tokens="pending" value="pending">{translator('pending')}</option>
<option data-tokens="rejected" value="rejected">{translator('rejected')}</option>
</select>
)
}
Lösung zwei. Veranstaltungsdelegation
siehe Lösung eins. Wir können den Ereignishandler aus der Eingabe entfernen und ihn seinem übergeordneten Element zuweisen, das auch andere Eingaben enthält, und mithilfe der Hilfedelegationstechnik können wir die Funktionen event.traget und mapPropsToHandler erneut verwenden.