質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

Vueのドロップダウンを使って西暦と和暦を合わせて一項目にして表示したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 242

akaru_00

score 2

こんにちは。プログラミング初心者のため初歩的な質問ですが答えていただけるとうれしいです。
【やりたいこと】
Vue.jsのドロップダウンで生年月日をユーザーに選択させるとき、100年分の生年を西暦+和暦(例: 2020(令和2年)  2019(令和1年) 2018年(平成31年)......)にして表示させたいのですが上手くいかず…アドバイスを頂けると幸いです。よろしくお願いいたします。

【エラー】
特に出ておりません。
コンソールでnengoesを出力すると値が一つしか入っていないのでnengo()の繰り返しが上手くできていないのかなと思いますが試行錯誤の上わかりませんでした。

  <select id="year" v-model="year" @change="get_days">
            <option v-for="i in 100" :value="i + 1920">{{ i + 1920 }}{{ nengo }}</option>  
        </select>
        <label></label>
 new Vue({
            el: '#app',
            data: {
                year: 2020,
                month: 1,
                date: 1
            },
            computed: {
                nengo: function () {
                    const nengoes = [];
                    for (let i = 2020; i > 1920; i--) {
                        if (i > 2018) {
                            nengoes.push = "(令和" + (i - 2018) + "年)";
                        } else if (i > 1988) {
                            nengoes.push = "(平成" + (i - 1988) + "年)";
                        } else if (i > 1925) {
                            nengoes.push = "(昭和" + (i - 1925) + "年)";
                        } else if (i > 1911) {
                            nengoes.push = "(大正" + (i - 1911) + "年)";
                        }
                    }
                    return nengoes;
                }
            }
        });


イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • rubytomato

    2020/07/15 17:36

    1点ほど確認させてください。

    > 表示させたいのですが上手くいかず…

    ということですが、ドロップダウンリストはどのように表示されているのでしょうか?
    確認したいのでドロップダウンリストのスクリーンショットを撮って質問に貼っていただけませんか?

    キャンセル

  • akaru_00

    2020/07/16 14:39

    メッセージありがとうございます。いまの状況のスクショを上げました。和暦が全く表示されない状況です。
    西暦+和暦(2020(令和2年)、2019(令和1年)、2018(平成31年)...)となればいいなと思っています。よろしくお願いいたします。

    キャンセル

  • rubytomato

    2020/07/16 15:49

    スクリーンショットの添付ありがとうございました。回答致しましたのでご確認ください。
    なおVue.jsのコードは単一コンポーネントファイルでの書き方になっていますので、適宜読み替えをお願いします。

    キャンセル

回答 1

checkベストアンサー

0

コンソールでnengoesを出力すると値が一つしか入っていないのでnengo()の繰り返しが上手くできていないのかなと思いますが試行錯誤の上わかりませんでした。

配列への要素の追加の仕方が間違っているため、上記のような結果になっています。

nengoes.push = "(令和" + (i - 2018) + "年)";

正しくは下記のようにpush("...")と記述します。

nengoes.push("(令和" + (i - 2018) + "年)");

ただし、ここを直しても和暦を表示させることはできません。
和歴を表示させるには別の箇所も修正しないといけませんが、修正方法を2つほど提示させて頂きます。

1つ目の修正方法

フィルターという機能を使う方法です。
下記のようにnengoという関数を定義して

export default {
  data() {
    return {
      year: 2000,
      month: 1,
      date: 1,
    };
  },
  filters: {
    nengo(y) {
      let result;
      if (y > 2018) {
        result = `${y} (令和${y-2018}年)`;
      } else if (y > 1988) {
        result = `${y} (平成${y-1988}年)`;
      } else if (y > 1925) {
        result = `${y} (昭和${y-1925}年)`;
      } else if (y > 1911) {
        result = `${y} (大正${y-1911}年)`;
      }
      return result;
    }
  }
};

表示の部分でnengoフィルターを使って和暦を表示させるようにします。
下記の{{ (i + 1920) | nengo }}がフィルターを使っている部分です。(i + 1920)の結果がnengoフィルターの引数になります。

<select id="year" v-model="year">
  <option v-for="i in 100" :value="i + 1920" :key="i">{{ (i + 1920) | nengo }}</option>
</select>
<label>{{ year }}年</label>

2つ目の修正方法

こちらは事前に100年分の西暦と和暦をペアにしたオブジェクトの配列を生成し、それを使ってv-forループする方法です。
この例では{"year": 2020, "label": "2020 (令和2年)"}のように、yearプロパティに西暦、labelプロパティにセレクトボックスに表示させるテキストをセットしています。

下記のように100年分の配列を生成するgenerate関数を定義ます。
そしてマウントされるタイミングでgenerate関数を呼び出して配列を生成し、

export default {
  data() {
    return {
      year: 2000,
      month: 1,
      date: 1,
      nengoes: []
    };
  },
  mounted() {
    this.nengoes = this.genereate();
  },
  methods: {
    genereate() {
      const nengoes = [];
      for (let y=2020; y>1920; y--) {
        if (y > 2018) {
          nengoes.push( {"year": y, "label": `${y} (令和${y-2018}年)`} );
        } else if (y > 1988) {
          nengoes.push( {"year": y, "label": `${y} (平成${y-1988}年)`} );
        } else if (y > 1925) {
          nengoes.push( {"year": y, "label": `${y} (昭和${y-1925}年)`} );
        } else if (y > 1911) {
          nengoes.push( {"year": y, "label": `${y} (大正${y-1911}年)`} );
        }
      }
      return nengoes;
    }
  }
};

それをv-forで表示させます。

<select id="year" v-model="year">
  <option v-for="nengo in nengoes" :key="nengo.year" :value="nengo.year">{{ nengo.label }}</option>
</select>
<label>{{ year }}年</label>

1つ目と2つ目の違い

1つ目の修正方法ではドロップダウンリストをクリックするたびにnengoフィルター関数が100件分実行されます。
2つ目の修正方法では事前に一度だけ配列を生成するので、ドロップダウンリストのクリック時にフィルター関数を100件分実行するというコストは発生しません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/16 16:12

    ウワーーーーーッ!!できました!!!初歩的な質問にも関わらず大変丁寧なご回答本当にありがとうございます!嬉しいです!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る