Мутация объекта глубокого вложенного состояния VueJS2 и Vuex - переменная состояния утверждений не определена - PullRequest
1 голос
/ 04 апреля 2019

Я пытался обновить state.describeFields.user и получаю Ошибка при рендеринге: TypeError: Невозможно прочитать свойство 'user' из неопределенного "

Часть кода, от которой умирает ошибка: state.describeFields[payload.obj] = payload.data; где payload.obj - это либо «пользователь», либо «учетная запись»

Это небольшая цепочка вызовов, которая, как я полагаю, вызывает проблему, но я не настолько силен, чтобы понять все последствия. Как добраться ... Спасибо вам, ребята.

Цепочка Daisy начинается с этого. $ Store.dispatch ('setCurrentIntegration', {data: {stuff: 'here'}})

Что должно произойти, это:

  1. обновление state.integration (работает)

  2. получить новые элементы из indexeddb (retrieveLocalDescribeFields) для каждого из state.objects значений и сохранить их в state.describeFields по ключу свойства (по иронии судьбы фактически сохраняет их в состояние, но затем выдает ошибки)

  3. если данные не поступают из retrieveLocalDescribeFields, тогда отправляйтесь в удаленный API для сбора данных (код никогда не попадает сюда, но работает до того, как я переместил все это в vuex)

Я попытался сгруппировать обещания, решив более конкретно, я попробовал console.log для state.describeFields и payload.data в функции с ошибками, и оба вывода данных на консоль ожидаемые.

export default {
  state: {
    integration: {},
    objects: ["user", "account"],
    describeFields: { user: [], account: [] }
  },
  getters: {
    getCurrentIntegration(state) {
      return state.integration;
    },
    getCurrentDescribeFields: state => obj => {
      return state.describeFields.hasOwnProperty(obj)
        ? state.describeFields[obj]
        : [];
    }
  },
  actions: {
    setCurrentIntegration({ commit, dispatch, state }, payload) {
      return new Promise(resolve => {
        commit("updateCurrentIntegration", payload);
        let promises = [];
        state.objects.forEach(obj => {
          promises.push(dispatch("retrieveLocalDescribeFields", { obj: obj }));
        });
        resolve(Promise.all(promises));
      });
    },
    setCurrentDescribeFields({ commit }, payload) {
      return new Promise(resolve => {
        commit("updateCurrentDescribeFields", payload);
        resolve(true);
      });
    },
    setClearDescribeFields({ commit }) {
      return new Promise(resolve => {
        commit("updateClearDescribeFields");
        resolve(true);
      });
    },
    retrieveLocalDescribeFields({ commit, dispatch, state, getters }, payload) {
      return new Promise(resolve => {
          // go get data from indexeddb...
          // dexis call omitted

        if (theFields.length) {
          resolve(
            commit("updateCurrentDescribeFields", {
              obj: payload.obj,
              data: theFields
            })
          );
        } else {
          resolve(dispatch("retrieveRemoteDescribeFields", payload));
        }
      });
    },
    retrieveRemoteDescribeFields({ commit, state, getters }, payload) {
      return new Promise(resolve => {
          // go get data from remote api...
          // axios call omitted

        commit("updateCurrentDescribeFields", {
          obj: payload.obj,
          data: res.data.records
        });
        resolve(true);
      });
    }
  },
  mutations: {
    updateClearDescribeFields(state) {
      state.describeFields = { user: [], account: [] };
    },
    updateCurrentIntegration(state, payload) {
      state.integration = payload.data;
    },
    updateCurrentDescribeFields(state, payload) {
      state.describeFields[payload.obj] = payload.data;
    }
  }
};

1 Ответ

0 голосов
/ 04 апреля 2019

OK.-hangs head in shame-

Проблема заключалась в том, что компонент-брат был изменен в результате setCurrentDescribedFields (компонент разбиения на страницы).

Это была та часть, которая ошибалась.Этот след просто произошел от мутаций в магазине.Гах!

Спасибо за быструю помощь.Цени это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...