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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2185閲覧

Vue.js セレクトボックスでemitを使いたい

ebiebifry

総合スコア8

Vue.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/05/22 05:56

編集2018/05/22 08:20

前提・実現したいこと

vue.jsでツールの制作を行っています。
https://codepen.io/ebifly/pen/RywWvg
上記リンクを参照して頂けると分かりやすいかと思うのですが
1.「名前を入力」→「追加」で入力した名前をリスト化
2.リスト化されたものがセレクトボックスに追加される
3.セレクトボックスで選ばれたものの「status」が「b」 に変更される
という動きを実現したいのですが、3の実装が上手く行かずアドバイスを頂きたいです。

発生している問題・エラーメッセージ

発生している問題としては、選択した名前に対応するインデックス番号が上手く渡せていないということだと思います。

該当のソースコード

js

1//名前の入力に関する記述 2 Vue.component('name-item', { 3 template: '\ 4 <div>\ 5 <button v-on:click="$emit(\'remove\')">X</button>\ 6 <div class="bl_userBlock">\ 7 <p>status:{{ status }}</p>\ 8 </div>\ 9 <input v-if="edit" v-model="newName" v-on:keyup.enter=\'updateName\' v-on:blur=\'updateName\'>\ 10 <span v-else="" v-on:click="editToggle">{{ title }}</span>\ 11 </div>\ 12 ', 13 props: ['title', 'id', 'img', 'status'], 14 data: function data() { 15 return { 16 edit: false, 17 newName:'', 18 }; 19 }, 20 methods: { 21 editToggle: function () { 22 this.edit = true; 23 }, 24 updateName: function updateName() { 25 this.$emit('update-name', this.id, this.newName) 26 this.edit = false; 27 } 28 } 29 }); 30 31//セレクトボックスに関する記述 32 Vue.component('name-list',{ 33 template:'\ 34 <select name="name-list" v-model="selected" @change="changeB">\ 35 <option value="">該当なし</option>\ 36 <option\ 37 v-for="(name, index) in names"\ 38 :value="name.title"\ 39 >{{ name.title }}\ 40 </option>\ 41 </select>\ 42 ', 43 props: ['names'], 44 data: function data() { 45 return { 46 selected: '', 47 }; 48 }, 49 methods: { 50 changeB: function changeB(){ 51 this.$emit('change-b', this.id) 52 } 53 } 54 }); 55 56//親 57 var vm = new Vue({ 58 el: '#main', 59 data: { 60 newNameText: '', 61 nextImg: 1, 62 nextId: 0, 63 names: [] 64 }, 65 methods: { 66 addNewName: function () { 67 if (this.newNameText !== '') { 68 if (this.nextImg > 10) { 69 this.nextImg = 1 70 } 71 this.names.push({ 72 img: this.nextImg++, 73 nameid: this.nextId++, 74 title: this.newNameText, 75 //statusをnamesにpushしています 76 status: 'a' 77 }) 78 } 79 this.newNameText = '' 80 }, 81 gameStart: function () { 82 this.gamestart = false; 83 }, 84 updateName: function updateName(id, name){ 85 this.names[id].title = name 86 }, 87 //statusの変更に関する記述 88 changeB: function changeB(id){ 89 this.names[id].status = 'b' 90 } 91 } 92 }) 93 94vm.$mount('#main');

上記が全体のコードですが問題としては

js

1 Vue.component('name-list',{ 2  ~~中略~~ 3 methods: { 4 changeB: function changeB(){ 5 this.$emit('change-b', this.id) 6 } 7 } 8 });

name-listコンポーネント内のメゾットにてthis.idと入っている箇所に選択した要素のインデックス番号が渡せていないので

js

1var vm = new Vue({ 2 el: '#main', 3  ~~中略~~ 4 changeB: function changeB(id){ 5 this.names[id].status = 'b' 6 } 7 } 8 })

親要素のnames[]の[]に数値が入らず変更が反映されないのだと思います。

試したこと

試しに、

js

1 Vue.component('name-list',{ 2  ~~中略~~ 3 methods: { 4 changeB: function changeB(){ 5 this.$emit('change-b', this.id) 6 } 7 } 8 });

上記のthis.idに適当な数値を入力してみると動くのでidをいい感じに取得出来ればいいのだと思います。
アドバイスのほどよろしくお願いいたします。

追記

追記・修正依頼の方にidという変数がdataにもpropsにも無いという指摘を受けたので下記のコードペンにて修正しました。
https://codepen.io/ebifly/pen/RywWvg

html

1<div> 2 changeB 3 <name-list 4 :names="names" 5 <!--idのバインドを追加しました--> 6 :id="names.id" 7 @change-b="changeB" 8 ></name-list> 9</div>

js

1 2 Vue.component('name-list',{ 3 template:'\ 4 <select name="name-list" v-model="selected" @change="changeB">\ 5 <option value="">該当なし</option>\ 6 <option\ 7 v-for="(name, index) in names"\ 8 :value="name.title"\ 9 >{{ name.title }}\ 10 </option>\ 11 </select>\ 12 ', 13//propsにidを追加しました 14 props: ['names', 'id'], 15 data: function data() { 16 return { 17 selected: '', 18 }; 19 }, 20 methods: { 21 changeB: function changeB(){ 22 this.$emit('change-b', this.id) 23 } 24 } 25 }); 26 27 var vm = new Vue({ 28 el: '#main', 29 data: { 30 newNameText: '', 31 nextImg: 1, 32 nextId: 0, 33 names: [] 34 }, 35 methods: { 36 addNewName: function () { 37 if (this.newNameText !== '') { 38 if (this.nextImg > 10) { 39 this.nextImg = 1 40 } 41 this.names.push({ 42 img: this.nextImg++, 43 //idのデータを追加しました。 44 id: this.nextId++, 45 title: this.newNameText, 46 status: 'a' 47 }) 48 } 49 this.newNameText = '' 50 }, 51 updateName: function updateName(id, name){ 52 this.names[id].title = name 53 }, 54 changeB: function changeB(id){ 55 this.names[id].status = 'b' 56 } 57 } 58 }) 59 60vm.$mount('#main');

この状態でも上手く動かないので、参照の仕方がおかしいのでしょうか?
アドバイスよろしくお願いしますm(_ _)m

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

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

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

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

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

euledge

2018/05/22 07:43

質問者さんが、最後に書いているように this.idが Vue.component('name-list') の中で参照できないのが原因ですよね、このコンポネントの中で idという変数がdataにもpropsにも定義されていないので参照できないのではないでしょうか?
ebiebifry

2018/05/22 08:21

追記・修正の依頼ありがとうございますm(_ _)m追記しましたのでまたアドバイスを頂けますと幸いです。。。
guest

回答1

0

ベストアンサー

  • option の value には name.id を指定する
  • changeB メソッドにてイベントオブジェクトから値を取得する

こんな感じでできると思います。

js

1 Vue.component('name-list',{ 2 template:'\ 3 <select name="name-list" v-model="selected" @change="changeB">\ 4 <option value="">該当なし</option>\ 5 <option\ 6 v-for="(name, index) in names"\ 7 :value="name.id"\ 8 >{{ name.title }}\ 9 </option>\ 10 </select>\ 11 ', 12 props: ['names', 'id'], 13 data: function data() { 14 return { 15 selected: '', 16 }; 17 }, 18 methods: { 19 changeB: function changeB(e){ 20 this.$emit('change-b', e.target.value); 21 } 22 } 23 });

投稿2018/05/22 12:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ebiebifry

2018/05/23 01:12

回答ありがとうございます! 上記の方法で上手く動くようになりましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問