Ich fing an zu lernen reakt-redux-unveränderlich paar Tage und ich bin immer noch ziemlich verwirrt über die Strukturierung meiner Anwendung. Ich habe PHP (Symfony/Laravel MVC Hintergrund), so ist es nicht einfach, mich mit einigen Javascript-Konzepten zu beschäftigen.React Redux Verantwortlichkeiten
1) Ich habe Linien WrapperComponent:
export default function (props) {
const style = {position: "relative"};
const lines = props.lines;
return (
<div className='wrapper' style={style}>
{lines.map(line => (
<Line key={line.get("id")} {...line.toObject()} />
))}
<Board />
</div>
);
}
2) Das zu WrapperContainer verbunden ist
import Wrapper from '../components/WrapperComponent';
export default connect(
function mapStateToProps(state) {
return {
lines: state.lines.map(line => {
return line.set("board", {
width: state.board.get("width"),
height: state.board.get("height")
});
})
};
},
function mapDispatchToProps(dispatch) {
return {};
}
)(Wrapper);
3) Dann gibt es AddLine Aktion
export function addLine(type) {
return {
type: types.ADD_LINE,
payload: {
id: 3, top: 0, left: 0, diffX: 0, diffY: 0, type: type, board: {
width: 0,
height: 0
}, active: false
}
};
}
4), dass die Gespräche zu LinesReducer
export default function LinesReducer(state = initialState, action) {
switch (action.type) {
case types.ADD_LINE:
return state.push(
Map(action.payload)
);
default:
return state;
}
}
5) Damit WrapperContainer auf Veränderungen in Staat und hören können wieder machen die Linien
export default connect(
function mapStateToProps(state) {
return {
lines: state.lines.map(line => {
return line.set("board", {
width: state.board.get("width"),
height: state.board.get("height")
});
})
};
},
function mapDispatchToProps(dispatch) {
return {};
}
)(Wrapper);
Nun meine Frage:
Wo finde ich Logik über die AddLine die Tat umgesetzt?
Wenn ich eine Zeile erstellen möchte ich seine ID setzen UND ich möchte seine Breite gleich wie Breite/Höhe einer anderen Komponente festlegen.
Ich denke, dass Aktionen nur Informationen von einem Ort zu einem anderen übertragen sollten.
Dann denke ich ... vielleicht sollte die Logik bei LinesReducer leben. Aber Lines Reducer hat keinen Zugriff auf den globalen Status der Anwendung, daher weiß ich nicht, welche Breite/Höhe die neue Zeile haben sollte.
Dann gibt es WrapperContainer. Der Container enthält Informationen über den Status aller Anwendungen, sodass es sinnvoll erscheint, jede Zeile zu durchlaufen und IDs festzulegen, wenn sie nicht festgelegt sind, und ihre Breite/Höhe und andere Informationen zu aktualisieren.
Aber das scheint mir nicht richtig. Ich dachte über einen Ort nach, der Informationen über den globalen Zustand der Anwendung sammeln würde, dann würde er neue Zeile basierend auf diesen Informationen hinzufügen und nichts anderes würde diese Zeile jemals wieder berühren. Außer für eine andere Aktion.
Ist das der richtige Ansatz? Ich möchte tatsächlich die Linienbreite/-höhe ändern, wenn sich die Höhe/Breite einer anderen Komponente ändert, so dass Container für mich am sinnvollsten ist.
EDIT:
Vielleicht:
1) ID in Aktion gesetzt, wenn die Linie tatsächlich erstellt wird (ich weiß nur nicht, wie viele Zeilen gibt es bereits so weiß ich nicht wirklich Welche ID sollte ich einstellen?
2) setze width/height im Container, wenn Zeilen an Requisiten übergeben werden (aber wenn ich die Zeilen in einem anderen Container rendern will, müsste ich den Code dort duplizieren, außer ich erstelle einige.) "globale" Funktion, die das Übergeben von Zeilen an Komponentenstützen in Containern behandelt)
Cool danke. :) Aber wenn ich 5 Zeilen sagen darf. Ich möchte 6. hinzufügen. ActionCreator weiß nicht, wie viele Zeilen es in der Anwendung gibt. Wie lege ich die ID einer neuen Zeile fest? (Ich möchte es 6) Auch ich möchte die Breite aller Linien gleich wie die Breite einer anderen Komponente in meiner Anwendung festlegen. Wieder weiß actionCreator nicht, welche Informationen zu setzen sind. – Michal
Ihr Aktions-Creator funktioniert nicht, aber Sie können Middlewares verwenden, um Ihre Aktions-Ersteller über den aktuellen Status zu informieren. Sehen Sie sich [dieses Beispiel] (https://github.com/gaearon/redux-thunk#injecting-a-custom-argument) mit 'redux-thunk' an. Der Aktionsgenerator 'fetchUser' hat Zugriff auf' getState', von dem er über die Zeilen erfahren sollte. –
Ich habe die Antwort aktualisiert, um diese Info einzuschließen. –