Объединить два состояния в магазине Vuex

У меня есть магазин Vuex с двумя состояниями.

  • заметки (заметки, синхронизированные с сервером/БД)
  • localNotes (которые не были синхронизированы с сервером/БД, при синхронизации с сервером/БД они будут перемещены в состояние «заметки»)

Я использую эти состояния, чтобы показать заметки в списке с геттером. Этот геттер объединяет два объекта и возвращает объекты слияния.

Проблема, с которой я столкнулся сейчас, заключается в том, что если я добавлю новую заметку в одно из состояний, она не будет отображаться в списке заметок, потому что получатель не выбирает «изменение». Я думаю, это происходит потому, что я возвращаю переменную вместо функции.

Это мой геттер:

const getters = {
    notesObject: (state, getters, rootState, rootGetters) => {
        let result = {};
        let mergedObject = {...state.notes, ...state.localNotes};
        Object.keys(mergedObject).forEach(key => {
            const item = mergedObject[key];
            if (rootGetters['tags/activeKey'] === null) {
                result[key] = item
            } else if (item.tag_id === rootGetters['tags/activeKey']) {
                result[key] = item
            }
        });
        return result;
    },
};

Пример объекта:

example: {
            5: {
                title: 'Testing title',
                text: 'text'
            },
            6: {
                title: 'Testing title',
                text: 'text'
            }
        }

Я надеюсь, что кто-то может помочь мне найти лучшее решение для этого. Я думал об использовании наблюдателя, но я знаю, что этого нужно избегать.

Решение состояло в том, чтобы позволить наблюдателю объединить два состояния в новое состояние. Тогда геттеру не нужно объединять два объекта

Можете ли вы показать, как вы добавляете новые заметки? Я не вижу никаких проблем с кодом, которым вы поделились.

elad frizi 17.02.2019 21:14

Как выглядит ваша мутация?

Connor 17.02.2019 21:14

это мутация: state.localNotes[payload.id] = payload;

TheMrkt 17.02.2019 21:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
3 347
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Система Vue реактивность не обнаруживает добавление новых свойств. Попробуйте использовать Vue.set(object, key, value) при добавлении новых заметок.

В вашей функции мутации замените state.localObject[payload.id] = payload; на Vue.set(state.localObject, payload.id, payload); Тогда геттер должен работать правильно.

Должен ли я всегда использовать Vue.set и Vue.delete для добавления и удаления объекта?

TheMrkt 17.02.2019 21:22

В общем, это хороший совет, которому стоит следовать, когда вы сталкиваетесь с этими ограничениями.

Connor 17.02.2019 23:26

Другие вопросы по теме