why my redux state not updating

PrudhviD picture PrudhviD · Sep 17, 2016 · Viewed 10k times · Source

state not updating.when action is dispatched the state should update to isAuthenticated to true..but the state not updating..redux returning the initial state not the updated state.

export function setCurrentUser(user) {
      console.log(user);
      return {
        type: "SET_CURRENT_USER",
        user
      };
    }

   ...
    export function login(userData) {
      return dispatch => {
        return axios.post('/user/auth',userData).then((res) => {
          const { status, sessionId, username, error} = res.data;
          if(status === "success"){
            dispatch(setCurrentUser(sessionId));
          }else {
            dispatch(invalidUser(error));
          }
        });
      }
    }

//reducers

    import { SET_CURRENT_USER, INVALID_USER } from "../actions/types";
    import isEmpty from "lodash/isEmpty";

    const initialState = {
      isAuthenticated : false,
      user: {},
      error:{}
    };

    export default (state = initialState, action) => {
      switch(action.type){
        case SET_CURRENT_USER:
        return {
          ...state,
         isAuthenticated: !isEmpty(action.user),
         user:action.user
        }
        ...
        default: return state;
      }
    }

//component

onSubmit(e){
    e.preventDefault();
      this.setState({ errors: {}, isLoading:true });
      this.props.login(this.state).then(
      (res) => {
        console.log(this.props.userData);
        if(this.props.userData.isAuthenticated)
          this.context.router.push("greet");
        },

(err) => this.setState({ errors: err.response.data, isLoading: false }) );

  }

.....

function mapStateToProps(state) {
  return {
    userData: state.authReducers
  };
}

export default connect(mapStateToProps, { login })(LoginForm);

Answer

StateLess picture StateLess · Sep 17, 2016

You are not updating the payload data in your reducer

export default (state = initialState, action) => {
      switch(action.type){
        case SET_CURRENT_USER:
        return {...state, user: action.payload} //update user here
        }
        ...
        default: return state;
      }
    }

the above code uses es6 features and the assumption made is isAuthenticated and error are part of the initial state.

You are just returning the same JSON which is why your state is not updating.