0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

vueのコードを修正する③ 〜dataプロパティを動的に追加〜

Last updated at Posted at 2022-04-10

vueのコードを修正する③

半年ほど前に、栄養価を確認できるレシピサイトをつくりました。
その為にがむしゃらに書きちらしてしまったコードを改善していきます。

この記事はその第三弾。

前回の記事の振り返り、

当初は、取得したレシピにhtmlで「q_x」クラスを紐付けて管理していました。
前回はこれを修正して、取得したレシピの所属するクラスにquantityプロパティを追加して、数量を管理することにしました。

dataプロパティを動的に追加

ただ、このままでは取得したレシピの数量を動的に増減することができません。
原因は以下のコードです。

  methods: {
〜以下略〜
    add_ingredient: function (post) {
      this.ingrd_sum.push(post);
    },

ingrd_sumという配列にpushで取得したレシピを格納していますが、このやり方だとvueは動的に配列の増減を検知してくれないようです。
参考:リアクティブの探求_配列に関して

なので以下に修正。

  methods: {
〜以下略〜
    add_ingredient: function (post) {
      this.allIngredients.splice(-1, 0, post);
    },

余談ですが、最初の引数を-1にすると配列の末尾の要素を指定できるんですねー。面白いなーと思いました。

これで、全ての取得したレシピの数量変化を動的に検知できるようになりました。

if文の削除

また、取得したレシピの数量をプロパティで表せるようになったので、「q_x」を紐付ける為の以下のif文もなくせます。
●修正元コード

        if (i == 0) {
          var bfr_num3 = this.q_0;
        } else if (i == 1) {
          var bfr_num3 = this.q_1;
        } else if (i == 2) {
          var bfr_num3 = this.q_2;
        } else if (i == 3) {
          var bfr_num3 = this.q_3;
        } else if (i == 4) {
          var bfr_num3 = this.q_4;
        } else if (i == 5) {
          var bfr_num3 = this.q_5;
        } else if (i == 6) {
          var bfr_num3 = this.q_6;
        } else if (i == 7) {
          var bfr_num3 = this.q_7;
        } else if (i == 8) {
          var bfr_num3 = this.q_8;
        } else if (i == 9) {
          var bfr_num3 = this.q_9;
        } else if (i == 10) {
          var bfr_num3 = this.q_10;
        } else {
          var bfr_num3 = 1;
        }

●修正後コード

      for (let ingrd in this.ingrd_sum) {
        let bfr_num3 = ingrd.quantity;
      }

途中経過

ここまでの修正でコードが以下のように短くなりました。

<div>
  <p>利用する材料</p>
  <ul v-for="item in ingrd_sum" :key="item.id">
    <li>{{ item.rname }}</li>
    <input v-model="item.quantity" />
  </ul>
</div>

〜省略〜

import axios from "axios";
export default {
  data: function () {
    return {
      show: false,
      post: {},
      posts: [],
      allIngredients: [],
      keyword: "",
      errors: "",
      uploadFile: null,
    };
  },

〜省略〜
  computed: {
    addNutrients: function () {
      let sum_nutrients = {
        Energy: "0",
        Protein: "0",
        Lipid: "0",
        Carbohydrate: "0",
        Dietary_fiber: "0",
        Potassium: "0",
        Calcium: "0",
        iron: "0",
        Zinc: "0",
        VitaminA: "0",
        VitaminB1: "0",
        VitaminB2: "0",
        VitaminC: "0",
        Salt_equivalent: "0",
      };
      let sn_keys = Object.keys(sum_nutrients);
      for (let ingrd in this.ingrd_sum) {
        let bfr_num3 = ingrd.quantity;
        for (let i = 0; i < 14; i++) {
          let sn_key = sn_keys[i];
          let num1 = parseFloat(sum_nutrients[sn_key]);
          let num2 = parseFloat(ingrd[sn_key]);
          let num3 = parseFloat(bfr_num3);
          if (Number.isNaN(num2)) {
            num2 = 0;
          }
          if (num3 < 0 || 1000 < num3) {
            num3 = 1;
          } else {
            num2 = num2 * num3;
          }
          sum_nutrients[sn_key] = num1 + num2;
          );
        }
      }
      return sum_nutrients;
    },
  },

〜省略〜

  methods: {
〜省略〜
    add_ingredient: function (post) {
      this.allIngredients.splice(-1, 0, post);
    },

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?