前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー