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

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

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

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

Q&A

解決済

2回答

4067閲覧

Vue.jsの算出プロパティに関して

stack-overflow

総合スコア29

Vue.js

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

0グッド

0クリップ

投稿2018/05/30 09:26

お世話になります。

現在、公式ガイドを見ながらVue.jsを勉強中なのですが、
下記URLの算出プロパティの章で躓いてしまい質問させていただきました。
算出プロパティとウォッチャ

下記は、ガイドにあるdataオブジェクトのプロパティを、computed内で参照している例なのですが、
dataが配列の場合はどのようにcomputed内で参照すればよいのか?というところで躓いております。

html

1<div id="demo">{{ fullName }}</div>

javascript

1var vm = new Vue({ 2 el: '#demo', 3 data: { 4 firstName: 'Foo', 5 lastName: 'Bar' 6 }, 7 computed: { 8 fullName: function () { 9 return this.firstName + ' ' + this.lastName 10 } 11 } 12})

下記は、今回やりたいことを簡単にしたサンプルなのですが、
dataが以下のような配列の場合は、どのようにすれば、fullNameを表示させられますでしょうか?

html

1<div id='demo'> 2 <ul v-for="user in users"> 3 <li>姓:{{ user.lastName }}</li> 4 <li>名:{{ user.firstName }}</li> 5 <li>フルネーム:{{ user.fullName }} ← これを表示させたい</li> 6 </ul> 7</div>

javascript

1<script> 2 var User = function(lastName, firstName) { 3 this.lastName = lastName; 4 this.firstName = firstName; 5 }; 6 var users = []; 7 users.push(new User('小室','哲哉')); 8 users.push(new User('小林','武士')); 9 10 var vm02 = new Vue({ 11 el: '#demo', 12 data: { 13 users: users 14 }, 15 computed: { 16 fullName: function () { 17 return this.firstName + ' ' + this.lastName 18 } 19 } 20 }); 21</script>

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

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

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

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

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

guest

回答2

0

ベストアンサー

template内ではcomputed propertyは単なる1つの値ですから、各userに対して別々の値が生まれることはありません。

Userクラスにフルネームを得るメソッドを定義するか、vueのmethodを使うのが無難だと思います。

methodを使う例
JSFiddle Demo

js

1 methods: { 2 getFullName(user) { 3 return `${user.firstName} ${user.lastName}` 4 }, 5 }

html

1 <ul v-for="user in users"> 2 <li>姓:{{ user.lastName }}</li> 3 <li>名:{{ user.firstName }}</li> 4 <li>フルネーム:{{ getFullName(user) }}</li> 5 </ul>

投稿2018/05/30 11:36

karamarimo

総合スコア2551

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

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

stack-overflow

2018/05/31 01:54

回答ありがとうございます。 methodsなら引数を渡せるので、やりたいことが実現できました! Demoまでご用意いただきありがとうございます! 大変わかりやすかったです(^^)
guest

0

無理です。
理由はサンプルにあるものは、firstNameとlastNameをプロパティに持つオブジェクトでそのオブジェクトに対してfirstNameとlastNameを可呼応したプロパティを追加する形で算出プロパティを定義しています。
ところが、質問者のソースでは、firstNameとlastNameをプロパティに持つオブジェクトの配列をプロパティに持つオブジェクトに対して追加しようとしていますので、fullNameで参照すべきオブジェクトが不明な状態になっています。
HTML側のソースでいうところの、<ul v-for="user in users">のタグ範囲の外に追加しようとしているといいうことです。そのため、usersは見れてもv-forループの中のuserは外部からは特定できないため算出プロパティとしては定義不可能となります。

やりたいことを実現しようとするなら以下のイメージになるかと思います。

JavaScript

1 var User = function(lastName, firstName) { 2 this.lastName = lastName; 3 this.firstName = firstName; 4 this.fullName = this.firstName + ' ' + this.lastName; 5 };

VueでViewModel以外にcomputedが使えるかどうかはわかりませんので、v-forの中身を別コンポーネントにしてそちらでViewModelを定義してしまうか、JavaScriptの比較的新しい言語仕様でプロパティを実装し、そちらで結合したfullNameを用意するかのどちらかになるかと思われます。

あと、全く関係ないのですが、v-forの中身間違えていませんか?
このままだと<li>はlastNameとfirstNameとfullNameはuserごとのデータでなく全userの各項目が同列に並ぶのでリストとしてはわかりづらいものになりそうです

  • user1.lastName
  • user1.firstName
  • user1.fullName
  • user2.lastName
  • user2.firstName
  • user2.fullName
  • user3.lastName
  • user3.firstName
  • user3.fullName

投稿2018/05/30 10:04

len_souko

総合スコア1348

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

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

stack-overflow

2018/05/31 01:55

回答ありがとうごいます。 >firstNameとlastNameをプロパティに持つオブジェクトの配列をプロパティに持つオブジェクトに対して追加しようとしていますので、fullNameで参照すべきオブジェクトが不明な状態になっています。 ご指摘いただいたこちらの箇所の理解が足りておりませんでした。 今回は、computedではなく、methodsでやりたいことを実現いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問