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

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

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

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

Q&A

3回答

9235閲覧

【Vue.js】選択した要素を削除したい

frtne

総合スコア29

Vue.js

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

0グッド

0クリップ

投稿2019/07/07 16:19

編集2019/07/07 23:28

Vue.js初学者です。

解決したいこと

・「削除」を押した時、「削除」を押した要素だけを削除したい(現状、どの「削除」をクリックしても、最後から消えていく)
・todoリストを参考にしているため、「todos」などのkeyを使っているが
単純に「ボタンをクリックしたら、フォームの枠がどんどんと増える」という仕様にしたい
(ユーザーが任意に入力するものはなし)
なので、そもそも配列を準備する必要がないのかもしれない

サンプルコード

<template> <div class="test"> <div v-for="(todo, index) in todos" :key="todo" v-bind="todo" :class="{'isDelete':index > 0}"> <span v-if="index > 0" @click="dI(index)">「削除」</span> <label>ほげ{{index+1}}</label> <input type="radio"/> </div> <button @click="aI">増やすボタン</button> </div> </template> <script> export default { name: 'test', data() { return { todos: [''], }; }, methods: { aI() { this.todos.push(''); }, dI(index) { this.todos.splice(index, 1); }, }, }; </script>

補足

<実装済>
・ボタンを押したらフォームを追加
・2番目以降は、削除を表示する

<試みたこと>
・dI(index) {
this.todos.splice(index, 1);
},で何番目かを取得して、削除出来ないか

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

:key="todo" の部分でtodoが全て空文字列なので、要素の区別がついていないんじゃないかなという気がします。
spliceで削除するのは有効なはずです。

投稿2019/07/07 22:10

otolab

総合スコア765

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

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

frtne

2019/07/08 15:10

ご回答ありがとうございます!
guest

0

削除を行い再描画がかかった時に

<label>ほげ{{index+1}}</label>

のindex番号が更新されてしまうので、以下のように

<label>ほげ{{todo.id+1}}</label>

にしてあげればいいのではないでしょうか?

私も初学者なので的外れな事を言っていたらすみません。

投稿2020/05/12 15:10

MakotoKato

総合スコア18

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

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

0

otolabさんが記載している通り、:keyが空文字のため、繰り返しの処理の中ですべて同じ""となります。
配列にidを設定するなどして、:keyに指定してみてはいかがでしょうか?

vue

1 2 3<template> 4 <div class="test"> 5 <div v-for="(todo, index) in todos" :key="todo.id" v-bind="todo" 6 :class="{'isDelete':index > 0}"> 7 <span v-if="index > 0" @click="dI(index)">「削除」</span> 8 <label>ほげ{{index+1}}</label> 9 <input type="radio"/> 10 </div> 11 <button @click="aI">増やすボタン</button> 12 </div> 13</template> 14 15<script> 16 17data() { 18 return { 19 todos:[ 20 {id:1,name:''} 21 ], 22 }; 23}, 24 25methods: { 26 aI() { 27 let max = this.todos.reduce(function(a,b) { 28 return a > b.id ? a : b.id 29 },0) 30 31 this.todos.push({ 32 id:max + 1, 33 name:'', 34 }) 35 }, 36 37 dI(index) { 38 this.todos.splice(index, 1); 39 }, 40} 41 42</script> 43

投稿2019/07/08 01:04

LanHma

総合スコア192

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

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

frtne

2019/07/08 15:12

ご回答ありがとうございます。 [code] <template> <div class="test"> <div v-for="(todo, index) in todos" :key="todo.id" v-bind="todo" :class="{'isDelete':index > 0}"> <span v-if="index > 0" @click="dI(index)">「削除」</span> <label>ほげ{{index+1}}</label> <input type="radio"/> </div> <button @click="aI">増やすボタン</button> </div> </template> <script> export default { name: 'test', data() { return { todos: [ { id: 1, name: '' }, ], }; }, methods: { aI() { const max = this.todos.reduce((anc, bnc) => (anc > bnc.id ? anc : bnc.id), 0); this.todos.push({ id: max + 1, name: '', }); }, dI(index) { this.todos.splice(index, 1); }, }, }; </script> [/code] 上記で試してみました(自動補完されている箇所もあり)が、まだ削除したい要素ではなく 新しいもの順に消えて行ってしまいます。。。 何か原因わかりますでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問