Вопрос о том, как javascript может обновить запись объекта с использованием квадратных скобок, содержащих ключ в качестве средства доступа к свойству - PullRequest
0 голосов
/ 13 июля 2020

на основе учебника на youtube (https://www.youtube.com/watch?v=hiiaHyhhwBU&t=1195s) Я пишу приложение чата, используя перехватчики реакции, в частности useReducer (). Но я не понимаю, как в случае переключения возвращается обновленная версия состояния, сохраняющая только два элемента и не добавляющая третий элемент в initState:

const initState = {
    general: [
        {from: 'ciro', msg: 'bella'},
        {from: 'ciro', msg: 'bella'},
        {from: 'ciro', msg: 'bella'}
    ],
    private: [
        {from: 'gennaro', msg: 'hello'},
        {from: 'gennaro', msg: 'hello'},
        {from: 'gennaro', msg: 'hello'}
    ]
}

const reducer = (state, action) => {
    const { topic, from, msg } = action.payload;

    switch(action.type) {
        case 'RECEIVE_MESSAGE':
            return {
                ...state,
                [topic]: [
                    ...state[topic],
                    {
                        from: from,
                        msg: msg
                    }
                ]
            }
        default:
            return state;
    }
} 

Интересно, как [topic ] может обновлять список сообщений, соответствующий топи c, поскольку он не связан напрямую с ... состоянием? а как в ... состояние не просто добавить третий элемент? Я нахожу это очень запутанным.

            return {
                ...state,
                [topic]: [
                    ...state[topic],
                    {
                        from: from,
                        msg: msg
                    }
                ]
            }

Спасибо за вашу помощь

1 Ответ

1 голос
/ 13 июля 2020

Вы можете обратиться к этой документации:

В основном, когда вы спрашиваете:

как в состояние ... не просто добавляется третий элемент?

Это потому, что:

Свойства остального / спреда для предложения ECMAScript (ES2018) добавили свойства спреда к литералам объекта. Он копирует собственные перечислимые свойства из предоставленного объекта в новый объект. Поверхностное клонирование (за исключением прототипа) или слияние объектов теперь возможно с использованием более короткого синтаксиса, чем Object.assign ().

Если у объектов есть свойство с таким же именем, то самое правое свойство объекта перезаписывает предыдущее.

Что касается:

Интересно, как [тема] может обновлять список сообщений, соответствующий топи c?

Я думаю, что это: Квадратные скобки Javascript Ключ объекта очень ясно, если это не так, пожалуйста, не стесняйтесь спрашивать.

...