Ich bin immer noch sehr viel eine Reaktion/redux noob. Auf einer Seite habe ich eine Tonne Texteingaben. Nach einer Weile begann zu bemerken, ich meine Aktion Dateifunktionen das gleiche tun haben, aber für verschiedene Eingänge:Gemeinsame Aktionen und Reduzierungen mit react/redux
export function setInputName(string) {
return {
type: 'SET_CURRENT_NAME',
payload: {value: string}
};
}
export function setInputCity(string) {
return {
type: 'SET_CURRENT_CITY',
payload: {value: string}
};
}
Mit meinem Minderer sieht aus wie:
export function currentName(state='', {type, payload}) {
switch (type) {
case 'SET_CURRENT_NAME':
return payload.value;
default:
return state;
}
}
export function currentCity(state='', {type, payload}) {
switch (type) {
case 'SET_CURRENT_CITY':
return payload.value;
default:
return state;
}
}
Und meine Komponente hatte diese mehrere Eingänge:
Das ist nicht sehr trocken und ich dachte sofort, dass ich etwas falsch gemacht habe. Gibt es eine gute Möglichkeit, eine gemeinsame setInputValue
Aktion für alle Texteingaben auf jeder Seite und Komponente meiner App zu haben? Ich möchte auch einen gemeinsamen Reduzierer für jeden Eingang verwenden. Vielen Dank.
UPDATE
Hier ist mein Brutto Beispiel, das funktioniert, aber ich fühle mich wie das immer noch ein bisschen gewunden ist, und es muss ein besserer Weg sein. Grundsätzlich überprüfe ich im Reduktor, ob dieser Eingang verwendet wurde und dem Zustand noch hinzugefügt wurde. Wenn nicht, füge ich es hinzu. Wenn ja, aktualisiere ich einfach seinen Wert. EDIT Ich habe gelogen dies funktioniert eigentlich nicht.
// actions
export function updateTextInput(name, value) {
return {
type: 'SET_CURRENT_TEXT_INPUT',
payload: {name: name, value: value}
};
}
// reducer
export function currentTextInput(state=[], {type, payload}) {
switch (type) {
case 'SET_CURRENT_TEXT_INPUT':
let newState = state;
let curInput = state.findIndex(function(elem) {
return elem.name === payload.name;
});
if (curInput === -1) {
newState.push({name: payload.name, value: payload.value});
} else {
newState[curInput].value = payload.value;
}
return newState;
default:
return state;
}
}
// component
...
render() {
let {updateTextInput, currentTextInput} = this.props;
return (
<div>
<input
type="text"
placeholder="Name"
onChange={(e) => updateTextInput('name', e.currentTarget.value)}
value={currentTextInput.name}
/>
<input
type="text"
placeholder="City"
onChange={(e) => updateTextInput('city', e.currentTarget.value)}
value={currentTextInput.city}
/>
</div>
);
}
...
Dies klärt die Dinge ziemlich ein bisschen. Was wäre, wenn ich mehrere nicht verwandte Formulare auf einer Seite hätte und nicht über ein bestimmtes Modell verfügte? Könnte ich immer noch eine gemeinsame Aktion/Reduktion verwenden? Ohne ein gigantisches Modell für die ganze Seite zu haben. –
Jedes Modell sollte sein eigenes Reduzierstück haben, das sein eigenes Stück des Zustands erhält. Du könntest allerdings eine einzige Update-Funktion, die in den verschiedenen Reducern – slightlytyler