Wo genau sollte ich mit dem Problem umgehen, dass diese Komponente nicht mit dem gewünschten state
geladen wird?Wie Eigenschaften von Objekten in React rendern?
Mein Render-Methode den folgenden Fehler verursacht ...
Uncaught TypeError: Cannot read property 'email' of undefined
... obwohl die JSON.stringify
Linie zeigt mir, dass die E-Mail-Eigenschaft hat (schließlich) existieren.
Die console.log
down in mapStateToProps
bestätigt, dass der Zustand zunächst ohne die Eigenschaft user
geladen wird (wodurch der Fehler verursacht wird).
Siehe meinen naiven Versuch, dies in meiner Konstruktor-Methode zu lösen. Es funktioniert nicht.
Was ist der richtige Weg, um mit dieser Situation umzugehen? Einige bedingte innerhalb der Rendermethode? Versuchte das auch, aber immer noch kein Glück.
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import * as actions from '../actions';
class Feature extends Component {
constructor(props){
super(props);
this.state = {
'auth': {
'user':{
email:'',
id:''
}
}
}
}
componentWillMount() {
this.props.fetchMessage(); // puts the user object into state
}
render() {
return (
<div className="feature">
Here is your feature
{JSON.stringify(this.props.user , null, 2)}
{this.props.user.email}
</div>
);
}
}
function mapStateToProps(state) {
console.log('state',state);
return { user: state.auth.user }
}
export default connect(mapStateToProps, actions)(Feature);
/////////// Aktion /////////
export function fetchMessage(){
return function(dispatch){
axios
.get(ROOT_URL, {
headers: {
authorization: localStorage.getItem('token')
}
})
.then((response) => {
dispatch({
type: FETCH_MESSAGE,
payload: response.data.user
})
})
}
}
/////////////// // Minderer /////////////
var authReducer = (state={}, action) => {
console.log('action.payload',action.payload);
switch(action.type){
case AUTH_USER: return {...state, error: '', authenticated: true};
case UNAUTH_USER: return {...state, error: '', authenticated: false};
case AUTH_ERROR: return {...state, error: action.payload};
case FETCH_MESSAGE: return {...state, user: {
email: action.payload.email,
id: action.payload._id
}};
default: return state;
};
};
Es wäre es Ihnen leichter machen zu helfen, wenn Sie Ihre Aktionen und Reduzierungen Code hinzufügen könnte. – jpdelatorre
getan - aber meine JSON.stringify Zeile sagt mir, dass der Zustand korrekt aktualisiert wird. Es ist nur der Bruchteil einer Sekunde zwischen dem Laden von Komponenten und dem Aktualisieren des Zustands, der mir das Problem verursacht. – dwilbank