我的 vue.js 代码反复从服务器获取数据

My vue.js code is getting data repeatedly from the server

我是Vue.js的新手,不完全理解(请不要介意缩进)

  methods:{
getdata() {
  if (this.myPage.month === 5) {
    axios.get("http://www.amock.io/api/maymock").then(response => {
      this.Month = response.data.checkInData.Month;
      this.Stat = response.data.checkInData.CheckedInStat;
      this.TotalTarget = response.data.checkInData.TotalTarget;
      this.$emit("TotTarget", this.TotalTarget);
      this.TargetForMonth = response.data.checkInData.CurrentAchieved;
      this.$emit("TotCount", this.TargetForMonth);
  })
}
  if (this.myPage.month === 4) {
    axios.get("http://www.amock.io/api/aprilmock").then(response => {
      this.Month = response.data.checkInData.Month;
      this.Stat = response.data.checkInData.CheckedInStat;
      this.TotalTarget = response.data.checkInData.TotalTarget;
      this.$emit("TotTarget", this.TotalTarget);
      this.TargetForMonth = response.data.checkInData.CurrentAchieved;
      this.$emit("TotCount", this.TargetForMonth);
  })
     }

   },
},

computed: {
attributes() {
  this.getdata();
  let checkindata = [];
  if (this.Click === 0) {
    var entry = new Object();
    (entry.highlight = "red"), (entry.dates = new Date());
    checkindata.push(entry);
    for (var day = 0; day < this.Stat.length; ++day) {
      entry = new Object();
      (entry.highlight = this.Stat[day] === 0 ? "red" : "green"),
        (entry.dates = new Date(2020, this.Month, day + 1));
      checkindata.push(entry);
    }
  }
  if (this.Click === 1) {
    var entry1 = new Object();
    (entry.highlight = "green"), (entry.dates = new Date());
    checkindata.push(entry1);
    for (day = 0; day < this.Stat.length; ++day) {
      entry1 = new Object();
      (entry.highlight = this.Stat[day] === 0 ? "red" : "green"),
        (entry.dates = new Date(2020, this.Month, day + 1));
      checkindata.push(entry1);
    }
  }
  return checkindata;
 }
},

  data() {
return {
  myPage: {},
  Stat: [],
  Month: null,
  TotalTarget: null,
  TargetForMonth: null,
  responded: null
  };
}

我正在使用 v-calendar 插件并通过属性函数将数据传递给日历。但是,我希望方法 getdata 在变量 myPage.month 更改时从提供的 link 获取数据,并且它应该只执行一次。 myPage 是如何变化的,这里没有给出,因为它是动态的日历插件。目前,它正在无限次执行此操作,这很麻烦。有什么办法可以解决吗?

您正在计算的 属性 中调用 getData()。这是不正确的;你不应该在计算的 属性 中改变状态,更不用说每次需要重新计算 属性 时都会调用它。

这是你应该用观察者来做的事情。只需观察 myPage.month 变化,然后调用 getData() 响应这些变化。

像这样:

watch: {
  'myPage.month': {
    immediate: true,
    handler() {
      this.getData();
    }
  }
}

其他一些改进:

  • 而不是 new Object() 只需执行 {}
  • (x = 1), (y = 2) 这样的代码应该是 2 个单独的语句(由 ; 分隔,而不是 ,)最好在单独的行上。 () 不是必需的。
  • 实际上你可以像这样一次性构建对象:
var entry = {
  highlight: "red",
  dates: new Date(),
};
checkindata.push(entry);
  • 尽量减少重复代码:
getData() {
  let api;
  switch (this.myPage.month) {
    case 4: api = 'aprilmock'; break;
    case 5: api = 'maymock'; break;
    default: return;
  }

  axios.get(`http://www.amock.io/api/${api}`).then(response => {
    this.Month = response.data.checkInData.Month;
    this.Stat = response.data.checkInData.CheckedInStat;
    this.TotalTarget = response.data.checkInData.TotalTarget;
    this.$emit("TotTarget", this.TotalTarget);
    this.TargetForMonth = response.data.checkInData.CurrentAchieved;
    this.$emit("TotCount", this.TargetForMonth);
  });
}