Можно ли указатели на старые объекты состояния в React Redux? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть приложение реагирования, использующее избыточность с объектом состояния, которое выглядит следующим образом:

{
    personal: { firstName: 'Lance', lastName: 'Uppercut' },
    phones: [
        { id: 1, number: '111-222-3333' },
        { id: 2, number: '444-555-6666' }
    ]
}

Скажем, что произошло действие, которое изменило только свойство personal, оставив только phones.Нужно ли копировать весь массив phones в редуктор, или можно оставить указатель на старый массив, поскольку он не изменился?

Другими словами, все в порядке?

return Object.assign({}, state, {
    personal: { firstName: 'Rock', lastName: 'Strongo' },
    phones: state.phones
});

или мне тоже нужно скопировать массив?

return Object.assign({}, {
    personal: { firstName: 'Rock', lastName: 'Strongo' },
    phones: state.phones.map(p => Object.assign({}, p))
});

Это также относится к ссылкам на объекты.Если phones где такой вложенный объект, как этот

{
    personal: { firstName: 'Lance', lastName: 'Uppercut' },
    phones: {
        '1': { number: '111-222-3333', areaCode: '619' },
        '2': { number: '444-555-6666', areaCode: '512' }
    }
}

, можно ли добавить новый объект состояния, указывающий на ссылку на старый?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Лучший способ - создать новую копию состояния и изменить только поле, которое вы хотите изменить, а именно:

return { ...state, personal: { firstName: 'Rock', lastName: 'Strongo' } });

(Это использование спредаоператор es6, который возвращает новую копию объекта состояния и изменяет только поле personal, которое короче и чище, чем старый способ Object.assign).

0 голосов
/ 19 ноября 2018

Вы можете обновить только то, что изменилось, и оно содержит структуры.

Поскольку состояние уже включает phones, а его нет, вам нужно только объединить измененный личный текст:

return Object.assign({}, state, {
    personal: { firstName: 'Rock', lastName: 'Strongo' }
});

Или используя объект распространения :

return {
    ...state,
    personal: { firstName: 'Rock', lastName: 'Strongo' }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...