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

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

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

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

JavaScript

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

Q&A

解決済

1回答

880閲覧

【Vue.js】undo機能を実装したい

hati-mitu

総合スコア7

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2021/01/16 16:01

編集2021/01/17 14:48

Vue.jsのTODOアプリでundo機能を実装中です。

新規追加→もどる→新規追加、とすると戻れなくなります。
オブジェクトのコピーや参照の問題なのかな?と仮説を立てていますが、うまくいかずに困っています。
コードは全てcodepenにあります。何がおかしいのか、どのようにすればうまく行くのか、アドバイスを頂けたら嬉しいです。
A Pen by hatimitu

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

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

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

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

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

guest

回答1

0

ベストアンサー

仮説として立てられていた通りとなります。

undo関数内でundoStackの要素を参照コピーされています。
そのため、登録時にundoStackの空配列として用意されていた配列に新しいタスクが追加されてしまい想定していない挙動となっていました。

undoStackの状態変化

初期: [[]]
登録: [[], [<登録1>]]
戻る: [[]]
→ 配列[1]の[<登録1>]を削除し、配列[0]の[]を参照コピー
**登録: [[<登録2>], [<登録2]>] **
→ tasksの配列とundoStackの配列[0]の参照が同じため、
[登録2]が配列[0]に追加され、さらに配列[1]に[登録2]が登録される
**戻る: [[<登録2>]] **
→ 配列[1]が削除され、配列[0]に登録2が残り続ける


(わかりにくい説明で申し訳ありませんm(_ _)m)

解消するためには、戻るボタン押下時の配列[0]のコピーをディープコピーとする必要があります。
以下で解消できると思います。

Javascript

1undo (){ 2 const stackCounts = this.undoStack.length 3 if (this.canUndo) { 4 const previousTasks = this.undoStack[stackCounts-2] 5 this.tasks = JSON.parse(JSON.stringify(previousTasks)) // ディープコピー 6 this.undoStack.pop() 7}

投稿2021/01/16 17:25

Twoshi

総合スコア354

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

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

hati-mitu

2021/01/17 00:47

ありがとうございます!!!解決できて理解もできました。とても助かりました????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問