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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

解決済

1回答

5283閲覧

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

akaru_00

総合スコア2

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

0グッド

2クリップ

投稿2020/07/15 05:24

編集2020/07/16 05:37

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

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

HTML

1 <select id="year" v-model="year" @change="get_days"> 2 <option v-for="i in 100" :value="i + 1920">{{ i + 1920 }}{{ nengo }}</option> 3 </select> 4 <label>年</label>

Vue.js

1 new Vue({ 2 el: '#app', 3 data: { 4 year: 2020, 5 month: 1, 6 date: 1 7 }, 8 computed: { 9 nengo: function () { 10 const nengoes = []; 11 for (let i = 2020; i > 1920; i--) { 12 if (i > 2018) { 13 nengoes.push = "(令和" + (i - 2018) + "年)"; 14 } else if (i > 1988) { 15 nengoes.push = "(平成" + (i - 1988) + "年)"; 16 } else if (i > 1925) { 17 nengoes.push = "(昭和" + (i - 1925) + "年)"; 18 } else if (i > 1911) { 19 nengoes.push = "(大正" + (i - 1911) + "年)"; 20 } 21 } 22 return nengoes; 23 } 24 } 25 });

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rubytomato

2020/07/15 08:36

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

2020/07/16 05:39

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

2020/07/16 06:49

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

回答1

0

ベストアンサー

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

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

javascript

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

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

javascript

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

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

1つ目の修正方法

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

javascript

1export default { 2 data() { 3 return { 4 year: 2000, 5 month: 1, 6 date: 1, 7 }; 8 }, 9 filters: { 10 nengo(y) { 11 let result; 12 if (y > 2018) { 13 result = `${y} (令和${y-2018}年)`; 14 } else if (y > 1988) { 15 result = `${y} (平成${y-1988}年)`; 16 } else if (y > 1925) { 17 result = `${y} (昭和${y-1925}年)`; 18 } else if (y > 1911) { 19 result = `${y} (大正${y-1911}年)`; 20 } 21 return result; 22 } 23 } 24};

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

html

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

2つ目の修正方法

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

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

javascript

1export default { 2 data() { 3 return { 4 year: 2000, 5 month: 1, 6 date: 1, 7 nengoes: [] 8 }; 9 }, 10 mounted() { 11 this.nengoes = this.genereate(); 12 }, 13 methods: { 14 genereate() { 15 const nengoes = []; 16 for (let y=2020; y>1920; y--) { 17 if (y > 2018) { 18 nengoes.push( {"year": y, "label": `${y} (令和${y-2018}年)`} ); 19 } else if (y > 1988) { 20 nengoes.push( {"year": y, "label": `${y} (平成${y-1988}年)`} ); 21 } else if (y > 1925) { 22 nengoes.push( {"year": y, "label": `${y} (昭和${y-1925}年)`} ); 23 } else if (y > 1911) { 24 nengoes.push( {"year": y, "label": `${y} (大正${y-1911}年)`} ); 25 } 26 } 27 return nengoes; 28 } 29 } 30};

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

html

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

1つ目と2つ目の違い

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

投稿2020/07/16 06:47

rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akaru_00

2020/07/16 07:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問