代码之家  ›  专栏  ›  技术社区  ›  sol

VueJS2和Vuex深层嵌套状态对象突变-声明状态变量未定义

  •  0
  • sol  · 技术社区  · 6 年前

    我一直在努力更新 state.describeFields.user render中出错:TypeError:无法读取“undefined”的属性“user”

    state.describeFields[payload.obj] = payload.data; payload.obj 是“用户”或“帐户”

    这是一个菊花链的调用,我认为这是造成问题的原因,但我不够强大的一个开发人员理解所有的含义。到达那里。。。多亏了你们。

    1. 更新state.integration(works)

    2. 从indexeddb获取新项目( retrieveLocalDescribeFields )对于每个 state.objects 值并将它们保存到state.describeFields by property key(讽刺的是,实际上会将它们保存到state,但随后会出错)

    3. 如果没有数据从 检索速度描述字段 然后转到远程api来收集数据(在我将所有这些移到vuex之前,代码从未在这里出现,但确实可以工作)

    我尝试了将承诺分组,更具体地说,我尝试了console.log on state.describeFields和payload.data在出错的函数中,这两个函数都将预期的数据输出到console。

    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;
        }
      }
    };
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   sol    6 年前

    好 啊。 -hangs head in shame-

    是那块错了。这个痕迹正好可以追溯到商店。嘎!