Ich habe versucht, meiner Anwendung einen Status hinzuzufügen, der gerade einen booleschen Wert gespeichert hat, wenn ein Ereignis vergangen ist. Ich kann nicht herausfinden, was ich hier falsch mache.
Reduzierer:
import * as actionTypes from '../constants/action-types.js';
const initialState = [{
eventPassed: false
}];
export default function eventPassed(state = initialState, action) {
switch (action.type) {
case actionTypes.EVENT_PASSED:
return true;
default:
return state;
}
}
Aktion:
import * as actionTypes from '../constants/action-types';
export function eventPassed(eventPassed) {
return {
type: actionTypes.EVENT_PASSED,
payload: { eventPassed: eventPassed }
};
}
Behälter um die Komponente:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import Example from '../components/example.jsx';
import { eventPassed } from '../actions/app-actions';
class ExampleContainer extends Component {
render() {
return (
<Example {...this.props} />
);
}
}
const mapDispatchToProps = (dispatch) => ({
actions: bindActionCreators({
eventPassed
}, dispatch)
});
const mapStateToProps = (state) => ({
eventPassed: state.eventPassed
});
export default connect(mapStateToProps, mapDispatchToProps)(ExampleContainer);
Komponente:
import React, { Component, PropTypes } from 'react';
class Example extends Component {
constructor() {
super();
this.action = this.action.bind(this);
}
componentDidMount() {
this.props.actions.eventPassed(true);
}
action() {
console.log(this.props.eventPassed);
}
render() {
return (
<div>
<button onClick={this.action}>Action</button>
</div>
);
}
}
export default Example;
Wenn ich versuche, "this.props.eventPassed" in der<Example />
Komponente zu protokollieren, wird mir " undefined " angezeigt. Fehlt etwas? Dies scheint die einfachste Verwendung des Shops in redux zu sein.
Warum wird this.props.eventPassed als "undefined" protokolliert ?:
Die Aktionsfunktion (
eventPassed
), auf die Sie an dieser Stelle zugreifen möchten, existiert nicht unterthis.props.actions.eventPassed
. Es existiert eigentlich nur aufthis.props.actions
.Dies liegt daran, dass Sie die Aktionsmethode an den Wert 'actions' .__ gebunden haben. in Ihren mapDispatchToProps. Dies ermöglicht wiederum den Zugriff auf die
eventPassed
Aktion überthis.props.actions
.Da this.props.actions auf
eventPassed
verweist, versucht es auf .__ zuzugreifen.this.props.actions.eventPassed
Sie versuchen, auf die Eigenschaft zuzugreifen von 'eventPassed' für die AktioneventPassed
. Das Ergebnis ist das, wenn Sie melden sich für diese Eigenschaft an, Sie erhalten "undefined"
mapDispatchToProps
muss einen Wert zurückgeben
Eine Pfeil-Funktion mit einem Blocktext gibt keinen Wert automatisch zurück und muss daher definiert werden. Ihre Funktion muss also so aussehen:
mapDispatchToProps = (dispatch) => {
return { actions: bindActionCreators(eventPassed, dispatch) }
}
Ausgangszustand ist ein Array, das ein Objekt enthält:
const initialState = [{
eventPassed: false
}];
Da Sie später versuchen, es als object { eventPassed: true}
und nicht als Array von Objekten [ { eventPassed: true } ]
zu referenzieren, sollte es Folgendes sein:
const initialState = {
eventPassed: false
};
Der Reducer muss den korrekten aktualisierten (aber nicht mutierten) Status zurückgeben:
export default function eventPassed(state = initialState, action) {
switch (action.type) {
case actionTypes.EVENT_PASSED:
return {
...state,
eventPassed: action.payload
};
default:
return state;
}
}
Sie haben anfangs einen Zustand zurückgegeben, der kein Objekt mehr ist (oder im ursprünglichen Fall ein Array von Objekten), sondern nur den Wert von true
.
In Ihrer Variablen reducer
initialisieren Sie Ihren Status mit dem Array von object mit der Eigenschaft eventPassed
. In der Zwischenzeit geben Sie nur den Boolean-Wert zurück basierend auf der payload
, die mit der folgenden Aktion verschickt wurde:
import * as actionTypes from '../constants/action-types.js';
const initialState = {
eventPassed: false
};
export default function eventPassed(state = initialState, action) {
switch (action.type) {
case actionTypes.EVENT_PASSED:
return {
...state,
eventPassed: action.payload
};
default:
return state;
}
}
In Ihrer component
müssen Sie möglicherweise Folgendes ändern:
this.props.eventPassed
bis this.props.actions.eventPassed