怎么在.vue中获取异步数据

来源:14-1 课程总结

见信

2021-01-04

interface games: ListProp<
   ListProp<{
     teams: ListProp<GameProp>,
     loadeadTemid:string[]
   }>
 >
state:{
	games:{}
}
// mutation内初始化数据列表
      state.games[queryYear] = { ...state.games[queryYear] }
      state.games[queryYear][queryMonth] = { ...state.games[queryYear][queryMonth] }
      state.games[queryYear][queryMonth][teamId] = { ...state.games[queryYear][queryMonth][teamId] }

老师,我嵌套泛型俄罗斯套娃了,我的数据已经打平成对象了,但是初始化数据时我吐了, 不这样初始化就会报错
当时我做的思路是,做成日历的形式,根据日期,将数据插入日历中,数据结构为 games[年份][月份][队伍id],获取到该队伍该月的赛程,将数据缓存下来。
图片描述

getters: {
    getTeamSchedule: (state) => (teamid:string, year:number, month:number) => {
      if (state.games[year][month]) {
        return state.games[year][month][teamid]
      }
    }
  }
 我使用计算属性,调用state的过滤器,过滤数据,state.games[year]的值是undefined,所以一直在报无法从undefined上读取属性的错,这种我该怎么解决?
还有一点就是,我派发action进行异步调用时,无论是在onmounted中还是就是在setup中都是一样的报错,数据的确是放入了store.state中,但是我就是无法在.vue文件中取出。
写回答

2回答

linkscope

2021-01-06

如果你使用Vuex异步请求,光使用computed计算属性是不够的,因为Vuex存在延迟,也就是说你这边获取到了数据computed也不会即时更新。

常规做法是使用watch或者watchEffect监听你这个计算属性,从而达到异步数据接收,或者干脆直接在watchEffect里监听state变化。

0
4
见信
回复
linkscope
OK,thankyou
2021-01-07
共4条回复

张轩

2021-01-05

同学你好 由于没有源代码 所以只能按照大体思路回答一下

第一个问题,你应该先判断 state.games[year] 是否存在,然后再判断 state.games[year][month] 是否存在。因为第一个数据结构在开始就是是 undefined 啊。

第二个问题 发送 action 的时候报了什么错误?不太清楚你说的无法取出是什么意思。请提供详细一点的错误信息哈

1
1
见信
老师,我的思路跟你说的一样。问题我也成功解决了,只是,为了做缓存这一块,我现在的代码,形成了一个金字塔状,类似回调地狱那样,很不舒服。真的就是层层判断年数据是否存在,月数据是否存在,队伍数据是否存在,丑极了
2021-01-05
共1条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3142 学习 · 2313 问题

查看课程