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

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

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

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1868閲覧

Vue.jsで配列を元にv-forでレンダリングした要素の削除時の挙動について

ichitamu

総合スコア5

Vue.js

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/06/11 13:13

編集2020/06/11 14:32

前提・実現したいこと

Vue.jsを使って、楽譜を読む練習をするツールを作成しようとしています。
まずは、音符を作成する処理と、音符を削除する処理を作成しました。

https://jsfiddle.net/ichi3270/97k63zew/16/

現時点では、ADDボタンを押したら音符が作られ、DELETEボタンを押したら先頭の音符が削除されるようにしています。

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

想定どおり、音符の作成と音符の削除ができているのですが、
複数の音符が画面上に表示されている場合に、DELETEボタンで先頭の音符を削除すると、うしろにある音符の位置が変わってしまい困っています。(ガクッと前進してしまう)
(上記 jsfiddle で、ADDボタンを数回押す → DELETEボタンを押す をするとご確認いただけます)

該当のソースコード

HTML

1<template v-for="item in notes"> 2 <li class="note-wrap" v-show="item.show" v-bind:style="item.styles" v-bind:ref="item.refId"> 3 <div class="sign">{{ item.sign }}</div> 4 <div class="note"></div> 5 </li> 6</template>

CSS

1.note-wrap { 2 animation-name: moveNotes; 3 animation-duration: 10s; 4 animation-fill-mode: forwards; 5 animation-timing-function: linear; 6} 7 8@keyframes moveNotes { 9 0% { 10 transform: translateX(100%); 11 } 12 100% { 13 transform: translateX(-15px); 14 } 15}

javascript

1var app = new Vue({ 2 el: '#app', 3 data: { 4 noteId: 0, // 次生成するnoteのID 5 notes: [], // noteデータ配列 6 }, 7 methods: { 8 // *** ノート生成処理 *** 9 createNote: function () { 10 // ランダムで音程を決定 11 const pitch = Math.floor(Math.random() * (45 + 1)) 12 let sign = ""; 13 // 臨時記号を算出 14 switch (pitch % 12) { 15 case 2: 16 case 4: 17 case 6: 18 case 9: 19 case 11: 20 sign = "♯" 21 } 22 const offsetMap = [0, 7.5, 7.5, 15, 15, 22.5, 22.5, 30, 37.5, 37.5, 45, 45] // (E → D#)半音毎の譜面上の上昇px数 23 const offsetTop = 195 - (Math.floor(pitch / 12) * 52.5) - offsetMap[(pitch % 12)] // 譜面最上部からのY位置を算出 24 // 作成処理 25 this.notes.push({ 26 id: this.noteId, // NoteのID 27 refId: `Note_${this.noteId}`, // Dom直接参照用のID 28 show: true, // true:存在 false:削除済 29 pitch: pitch, // 音程 30 sign: sign, // 臨時記号♯♭ 31 styles: { top: `${offsetTop}px` } // css(譜面上辺からの縦距離) 32 }) 33 34 // idカウントアップ 35 this.noteId += 1 36 }, 37 38 // *** ノート削除処理 *** 39 removeNote: function () { 40 this.notes.splice(0,1); 41 }, 42 } 43})

試したこと

音符削除処理のremoveNoteについて、配列の要素削除ではなく、配列の作り直し(下記)も試してみましたが、結果は同じでした。

javascript

1// 試したが結果は変わらず 2this.notes = this.notes.filter(item => item.id !== noteId)

要素を削除せずに、論理削除(v-showで非表示にする)であれば、スムーズに描画されますが、データが削除されずに増えていくのはあまり希望どおりではありません。

javascript

1this.notes.find(item => item.id === noteId ).show = false

論理削除ではない方法で、解決できる方法がありましたらご教示いただけますと幸いです。
宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

templateでkey使えないって怒られるので

<template>部分だけ抜粋

vue

1 <template> 2 <li class="note-wrap" v-for="item in notes" :key="item.id" v-show="item.show" v-bind:style="item.styles" v-bind:ref="item.refId"> 3 <div class="sign">{{ item.sign }}</div> 4 <div class="note"></div> 5 </li> 6 </template>

でいかがでしょう。

投稿2020/06/11 16:01

rururu3

総合スコア5545

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

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

ichitamu

2020/06/12 01:14

早速のご回答ありがとうございました!いただいたご提案で解決いたしました。 :key についてご教示いただいたおかげで、作成中の他の部分で表示がズレるものも解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問