reagieren js mapStateToProps löst Uncaught TypeError: Cannot read property 'map' of undefined
Habe ich eine index.js das macht alle Tabellen in der Datenbank.
_renderAllTables() {
const { fetching } = this.props;
let content = false;
if(!fetching) {
content = (
<div className="tables-wrapper">
{::this._renderTables(this.props.allTables)}
</div>
);
}
return (
<section>
<header className="view-header">
<h3>All Tables</h3>
</header>
{content}
</section>
);
}
_renderTables(tables) {
return tables.map((table) => {
return <Table
key={table.id}
dispatch={this.props.dispatch}
{...table} />;
});
}
render() {
return (
<div className="view-container tables index">
{::this._renderAllTables()}
</div>
);
}
}
const mapStateToProps = (state) => (
state.tables);
export default connect(mapStateToProps)(HomeIndexView);
Änderte ich mapStateToProps aus dem obigen code folgenden code.
const mapStateToProps = (state) => ({
tables: state.tables,
currentOrder: state.currentOrder,
});
Der Grund, warum ich geändert, code, den ich verwenden wollte ein Staat von currentOrder. Ich habe einen Staat, der zeigt, ob der Tisch besetzt ist oder nicht. Also, um zu verwenden, die ich Hinzugefügt currentOrder in mapStateToProps. Allerdings löst es Uncaught TypeError: Cannot read property 'map' of undefined..
Wie kann ich Zustände von den anderen Komponenten? irgendwelche Vorschläge dafür??
Vielen Dank im Voraus..
--reducer.js
const initialState = {
allTables: [],
showForm: false,
fetching: true,
formErrors: null,
};
export default function reducer(state = initialState, action = {}) {
switch(action.type){
case Constants.TABLES_FETCHING:
return {...state, fetching: true};
case Constants.TABLES_RECEIVED:
return {...state, allTables: action.allTables, fetching: false};
case Constants.TABLES_SHOW_FORM:
return {...state, showForm: action.show};
case Constants.TALBES_RESET:
return initialState;
case Constants.ORDERS_CREATE_ERROR:
return { ...state, formErrors: action.errors };
default:
return state;
}
}
- Der einzige Aufruf
map()
hier funktioniert aufthis.props.allTables
und ich sehe keine Stelle, die Einstellung, die zu nichts. Natürlich wird es dann undefiniert sein. Aber ich bin mir nicht sicher, was die eigentliche Frage ist, da tht Titel sagt eine, die Frage spricht über "Staaten, die aus anderen Komponenten" etc. Könnten Sie das klären? - Oh, ich dachte, es war nicht zu arbeiten, denn ich habe versucht, um die Staaten von anderen Komponenten... also ich muss festgelegt dieser.Requisiten.allTables etwas.. bin ich im Recht?
- Natürlich. Es kann nicht magisch wissen, was Sie versuchen zu tun, eine Eigenschaft, die Sie nicht definieren,
- Danke, so in diesem.Requisiten.allTable ist-Daten aus Datenbank per httpGet... Für diesen Fall, wie soll ich es definieren, um die Darstellung aller Tabellen richtig???
- Sie haben reducer für diese Aktion? Ich denke, das problem ist es
- Sie sicher, dass
action.allTables
wieder richtige array-Tabelle-Objekt? - Ja, ich hab 16 arrays, die Ihre id und Nummer..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist, dass vor dem abrufen erfolgreich
tables
, die Komponente gerendert wird mitstate.tables
istundefined
.Erste von allen, beste Praxis ist die Verwendung von Selektoren eher als json-Pfad wie
state.tables
, werden in einem separatenselectors.js
- Datei mitreselect
lib wie folgt:Zweitens, werden Sie brauchen, um hinzuzufügen, reducer, lassen Sie uns davon ausgehen,
FETCH_ALL_TABLES
Aktion mitcombineReducers
ausredux
lib und die meisten wichtig zu initialisierentables
array mit[]
bevor die Aktion ausgelöst wird, so dass wie folgt definiert wird:und in Ihrem
index.js
, möglicherweise möchten update: esarray
aber kehren Sie einobject
? es istarray
so sollten Sie Sie wieder einarray
Warum sind Sie Typ ändern?const mapStateToProps = (state) => ({ tables: selector.tablesSelector(state), currentOrder: state.currentOrder, });
this.props
nur in der ersten Zeile in_renderAllTables
Methodethis.props.allTables
kurz vor der übergabe an_renderTables
payload
in Ihremreducer
this.props.allTables
zuthis.props.tables.allTables
this.props.allTables
zuthis.props.tables.allTables
und es funktioniert!Sollten Sie immer überprüfen, wenn die variable, die Sie zuordnen möchten definiert ist.