【问题标题】:"this.grades.push is not a function" When trying to add a Grade to an array“this.grades.push 不是函数”尝试将成绩添加到数组时
【发布时间】:2020-08-05 06:23:34
【问题描述】:

您好,我正在创建一个 web 应用程序,我可以在其中列出我的成绩并取其平均值,但我无法使用按钮将任何成绩添加到我的数组中。当我单击添加按钮时,我收到错误消息:

TypeError: this.grades.push is not a function

at VueComponent.addGrade (Calculator.vue?1876:54)

at click (eval at ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-

我也在尝试将成绩保存在本地存储中。我做错了什么?

我正在使用 Vue.js 和 js 做任何事情。 代码如下:

<template>
  <div>
    <h2>Grade-Calculator</h2>
    <div>
      <ul>
        <li v-for="(g,idx) in grades" :key="idx">
          {{idx+1}}. Grade : {{g}}
          <button v-on:click="delGrade()">Delete</button>
        </li>
      </ul>
      <div>
        <label>New Grade:</label>
        <input type="text" v-model="newGrade" />
        <button v-on:click="addGrade()">Add</button>
      </div>
      <br />
      <div>
        <p>Average: {{ calcAvg() | round}}</p>
      </div>
    </div>
  </div>
</template>
<!-- The Script-->
<script>
export default {
  data: () => ({
    grades: [],
    newGrade: 0,
    avg: 0,
    formattedNumber: ""
  }),
  name: "Home",
  props: {},

  methods: {
    calcAvg: function() {
      let sum = 0;
      for (var i = 0; i < this.grades.length; i++) {
        let num = parseInt(this.grades[i]);
        sum = sum + num;
      }
      console.log(sum);
      console.log(this.grades.length);
      return sum / this.grades.length;
    },
    addGrade: function() {
      if (this.grades == null) {
        this.grades = [];
      }
      this.grades.push(this.newGrade);
      this.newGrade = 0;
      localStorage.setItem("grades", this.grades);
    },
    delGrade: function() {
      var idx = this.grades.indexOf(this.grades);
      this.grades.splice(idx);
      localStorage.removeItem("grades");
      localStorage.setItem("grades", this.grades);
    }
  },
  mounted() {
    this.grades = localStorage.getItem("grades");
  },
  filters: {
    round: function(value) {
      value = parseFloat(value).toFixed(2);
      //this.formattedNumber = this.avg.toFixed(2);
      return value;
    }
  }
};
</script>

【问题讨论】:

    标签: javascript arrays vue.js vue-component


    【解决方案1】:

    网络存储存储字符串,所以问题出在mounted

    this.grades = localStorage.getItem("grades");
    

    现在,this.grades 是一个字符串,它没有 push 方法。

    将您的数组存储为 JSON:

    localStorage.setItem("grades", JSON.stringify(this.grades));
    

    并在检索时对其进行解析:

    this.grades = JSON.parse(localStorage.getItem("grades")) || [];
    

    如果项目不在存储中,|| [] 部分会为您提供一个空白数组(getItem 返回null,它将转换为"null",然后由JSON.parse 解析回null ,这是假的)。

    【讨论】:

    • addGrades 现在可以工作了,谢谢。但它不会将成绩保存在本地存储中。当我重新加载页面时,本地存储被删除。有什么相关的吗?
    • @JEA - 我已经修改了代码以保存答案中显示的成绩,它应该可以工作。
    • 它将它保存在本地存储中,但是当我重新加载网站时,本地存储会被清除。
    • @JEA - localStorage 在加载页面时不会被清除,因此代码中的某些内容必须清除它。你需要找到那是什么。假设 mounted 中的代码已更新为 this.grades = JSON.parse(localStorage.getItem("grades")) || []; 并且该代码在您的组件安装时运行(我不使用 Vue.js),那么问题中的代码中没有任何内容可以清除它。
    • 感谢找到问题。
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2014-04-21
    • 1970-01-01
    • 2023-03-28
    • 2014-03-28
    • 2022-12-18
    相关资源
    最近更新 更多