状态渲染前的 Vue.js/vuex getters 错误

Posted

技术标签:

【中文标题】状态渲染前的 Vue.js/vuex getters 错误【英文标题】:Vue.js/vuex getters error before state rendered 【发布时间】:2017-08-30 07:51:27 【问题描述】:

使用 webpack vue 模板和 vuex。我的商店中有一个突变

const mutations = 
addWeekDataList(state, a) 
    state.weekDataList = a;
,

在组件内的 ajax 请求中提交

axios.get('URL').then(function (response) 
let weekDataList = _.values(response);
that.$store.commit('addWeekDataList', weekDataList););

然后我的商店里有一个吸气剂

const getters = 
getWeekRunData: state => 
    return state.weekDataList[state.currentWeek].filter(activity => activity.type === 'Run' );
,

在组件的计算属性中调用

computed: 
    weekRunDataTime: function() 
        return Utils.convertSecsToHrsMins(Utils.addFields(this.weekRunData, 'moving_time'));
    ,
    ...mapGetters(
        weekRunData: 'getWeekRunData',
    ),
,

到目前为止没有错误,计算属性在准备好后返回它们的数据。但是,一旦我在组件模板中执行以下操作,就会出现错误...

 weekRunDataTime 
TypeError: state.weekDataList[state.currentWeek] is undefined

计算的属性,然后是 weekRunDataTime ,最终将呈现,但最初仍然显示错误,我该如何解决这个问题?确保 getter 仅在数据可用时运行?

【问题讨论】:

什么是state?通常访问 vuex store 之类的 this.$store.state... 是语法。 嗨@AmreshVenugopal state 在getter 和mutation 在store 里面,所以可以直接引用。 抱歉,我在阅读问题时犯了一个大错误。 state.weekDataList 的默认值是多少? 您已经注意到它失败了,因为还没有加载数据。如果没有数据,您可以使用 if else 或三元组来阻止代码执行。 我将其添加为记录的答案 【参考方案1】:

错误是因为state.weekDataList 未加载,所以state.weekDataList[0] 将未定义。 我遇到了两个解决方案,其中一个来自@AmreshVenugopal。一种是将样本数据集添加到数组中,第二种也是最优选的方法是将if 语句添加到getter 中,以便仅在加载数据后才加载。现在一切正常,没有错误。

const getters = 
getWeekRunData: state => 
    if(state.weekDataList.length) return state.weekDataList[state.currentWeek].filter(activity => activity.type === 'Run' );

【讨论】:

【参考方案2】:

添加初始数据将解决问题

const state = 
      user: something
    ;

【讨论】:

以上是关于状态渲染前的 Vue.js/vuex getters 错误的主要内容,如果未能解决你的问题,请参考以下文章

vue.js vuex store(参考)

如何使用 Vue.js + Vuex (createStore) 将“状态”变量保存到浏览器 localStorage

Vue.js/Vuex 登录:[vuex] 未知操作类型:postLogin。

Vue.js:vuex 操作中未捕获的承诺

Vue.js[vuex] 如何从突变中调度?

Vue.js、Vuex 与 Promises