Распространение объекта не копирует объект должным образом - PullRequest
0 голосов
/ 08 мая 2018

У меня странная проблема с использованием объекта распространения. Вот мой код:

const AuthenticationReducer = (state = {
authenticationObj: {
    "isAuthenticating": true, "isAuthentic": false, "subscriberId": "NA", "username": "NA",
    "firstName": "NA", "lastName": "NA", "enabled": "1", "email": "NA", isAuthorized: false
}, lastPasswordCheckStatus: undefined, isSuccessfulChangePassword:undefined,loginUserCheckStatus: undefined, createUserCheckstatus: undefined,
confirmUserCheckstatus: undefined, isSuccessfulChangeEmail:undefined, userContactInfo: {
    country: undefined,
    address1:undefined,
    address2:undefined,
    city:undefined,
    postalCode:undefined,
    phoneNumber: undefined
}
 }, action) => {

switch (action.type) {
    case SET_USER_CONTACT_INFO:
        console.log(JSON.stringify(state));
        state = {
            ...state,
            authenticationObj: {
                ...state.authenticationObj, userContactInfo: action.payload.userContactInfo
            }
        };
        console.log(JSON.stringify(state));
        console.log(action.payload.userContactInfo);

}
return state;
 };
    export default AuthenticationReducer;

Перед вызовом SET_USER_CONTACT_INFO состояние выглядит следующим образом:

{
"authenticationObj": {
    "isAuthenticating": false,
    "isAuthentic": true,
    "subscriberId": 4424,
    "username": "cccc",
    "firstName": "null",
    "lastName": "null",
    "email": "cccc",
    "isAuthorized": true
},
"userContactInfo": {}
}

Как вы видите "userContactInfo": {} является пустым объектом, который имеет смысл сейчас, как только запрос SET_USER_CONTACT_INFO отправлен, я получаю:

{
"authenticationObj": {
    "isAuthenticating": false,
    "isAuthentic": true,
    "subscriberId": 4424,
    "username": "vvvv",
    "firstName": "null",
    "lastName": "null",
    "email": "vvv",
    "isAuthorized": true,
    "userContactInfo": {
        "country": "Canada",
        "address1": "ssss",
        "address2": "sss",
        "city": "ssss",
        "postalCode": "ss",
        "phoneNumber": "sss"
    }
  },
    "userContactInfo": {}
 }

Я получаю оба userContactInfo один пустой и один с информацией. Это действительно странно, я ожидаю, что userContactInfo с новой информацией заменяется пустой. что не так с моим кодом? любая помощь?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Это: состояние = { ...государство, authenticationObj: { ... state.authenticationObj, userContactInfo: action.payload.userContactInfo } }; * * Тысяча одна

Должно быть: состояние = { ...государство, userContactInfo: { ... state.userContactInfo action.payload.userContactInfo } };

Вы сказали сценарию вставить action.payload.userContactInfo в authenticationObj, тогда как он должен быть размещен как одноуровневый элемент к нему.

Извините, это коротко, я написал это на своем телефоне.

0 голосов
/ 08 мая 2018

Я ожидаю, что userContactInfo с новой информацией заменяется пустой.

Два userContactInfo находятся на разных уровнях. Один находится на верхнем уровне, рядом с authenticationObj, другой - в значении authenticationObj, которое вы легко можете увидеть, взглянув на отступ. Кроме того, объект не может иметь два свойства с одинаковым именем.

{
  "authenticationObj": {
    "isAuthenticating": false,
    "isAuthentic": true,
    "subscriberId": 4424,
    "username": "vvvv",
    "firstName": "null",
    "lastName": "null",
    "email": "vvv",
    "isAuthorized": true,
    "userContactInfo": {         // <root>.authenticationObj.userContactInfo
      "country": "Canada",
      "address1": "ssss",
      "address2": "sss",
      "city": "ssss",
      "postalCode": "ss",
      "phoneNumber": "sss"
    }
  },
  "userContactInfo": {}          // <root>.userContactInfo
}

т.е. Вы сливаете объект на неправильном уровне. Кажется, что вы хотите, это

state = {
  ...state,
  userContactInfo: action.payload.userContactInfo
};
...