Ich habe Probleme herauszufinden, wie man Widget-Reduzierungen zusammenstellt und die Bäume im Tandem-Modus verarbeitet, so dass ich später den resultierenden Redux-Speicher für die Reduzierungen mithilfe von react-redux auf Requisiten im Renderbaum abbilden kann.Wie man gekapselten ui Zustand in einem redux Speicher auf Stützen mit react-redux abbildet?
Angenommen, ein Setup wie folgt. Ich versuche, eine NameWidget zu machen, dass ich überall in jedem App verwenden können:
NameView.jsx:
...
render() {
return <div> Name: {this.props.name} </div>;
}
...
====
NameAction.js:
...
export const CHANGE_NAME = 'CHANGE_NAME';
...
export function changeNameAction(newName) {
return {
type: CHANGE_NAME,
payload: newName,
};
}
====
NameReducer.js:
import { CHANGE_NAME } from './NameAction';
function ui(state = {name: ''}, action) {
switch(action.type) {
case(CHANGE_NAME):
return Object.assign({}, state, {name: action.payload});
break;
default:
return state;
}
}
export default ui;
====
NameWidget.js:
import { connect } from 'react-redux';
import { NameView } from './NameView';
const mapStateToProps = (state) => {
return {
name: state.name,
};
};
const NameWidget = connect(
mapStateToProps
)(NameView);
export default NameWidget;
Wenn ich NameWidget direkt verwende, werde ich keine Probleme haben em:
NameApp.jsx:
import { createStore } from 'redux';
import app from './NameReducers';
let store = createStore(app);
...
function render() {
return (
<Provider store={store}>
<NameWidget/>
</Provider>
);
}
Allerdings sehe ich nicht, wie man dieses modulare macht. Ich kann dieses Widget eigentlich nicht in etwas anderes einfügen. Angenommen, ich wollte, dies zu tun:
EncapsulatingView.jsx:
...
render() {
return (
<div>
<NameWidget/>
<SomeOtherReduxWidget/>
</div>
);
}
...
====
EncapsulatingReducer.js:
import { combineReducers } from 'redux'
import nameWidget from '../name/NameReducer';
import someOtherWidget from '../someOther/SomeOtherReduxWidgetReducer';
export default combineReducers({nameWidget, someOtherWidget});
(Ich gehe davon aus, dass der verbleibende Code einschließlich connect() und creates() zum Einkapseln * liegt auf der Hand.)
fast funktioniert, solange alle Aktionen über alle eingekapselten Ansichten eindeutige Typen haben. Aber das Problem ist NameWidgets mapStateToProps; es muss von oben ändern, um einen neuen Weg zu seinem Abschnitt des Speichers zu verwenden:
...
const mapStateToProps = (state) => {
return {
name: state.nameWidget.name,
};
};
...
Und so weiter - je nachdem, wie Vorfahren combineReducers(), um ihre immer großartigere Super Widgets und Anwendungen zu definieren, die Nachkommen irgendwie müssen ändern, wie sie mapStateToProps() kompensieren. Dies bricht die Kapselung und Wiederverwendbarkeit von Code, und ich sehe nicht, wie ich es in react-redux umgehen kann. Wie kann ich Widgets definieren, indem ich combineReducers() zusammenfasse und den resultierenden Speicher dann den Requisiten dieser Widgets zuordne, und zwar auf einmal schreibende und überall verwendbare Weise?
(Apropos nichts, es scheint merkwürdig, dass wiederholt combinedReducers() eine Form erstellt, die von unten nach oben ist, aber dass mapStateToProps() stattdessen einen Top-Down-Ansatz "absoluter Pfad" zum Nachschlagen in diese Form annimmt.)
Haben Sie auf den Export dieser Plan Code zu einem anderen Projekt oder wollten Sie das Widget in einer anderen Umgebung im selben Projekt erneut verwenden? – Gennon
Kurzfristig ist projektspezifisch, aber wenn es ein gutes Muster/eine gute Lösung gibt, würde es hoffentlich beides unterstützen. – jdowdell
Habt ihr mal [redux-form] (http://redux-form.com/5.3.1/#/getting-started) gesehen, wo sie einen definierten Namen (form) als eigenen Wurzelreduzierer benutzen? Auf diese Weise werden die Komponenten state.form für alle Werte betrachten. – Gennon