🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

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

Q&A

解決済

2回答

2504閲覧

Nuxt Vue 最後のclickからn秒待ってから処理をする関数の書き方でこまった。

MOTOMUR

総合スコア195

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

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

0グッド

1クリップ

投稿2021/01/26 03:02

編集2021/01/27 01:51

nuxtで最後にボタンを押して5秒待ってから処理を開始するプログラムを書こうと思ったのですが、以下のコードではうまくいきません。
console.log(date, "date");でログが終わってしまいます。
dataの中身を変更してしまっているので再レンダリングされてしまっているのが原因かと思ったのですが、回避方法が思いつきませんでした。

<template> <div id="app"> <button @click="waitFunc">push</button> </div> </template> <script> export default { name: "App", data: function () { return { start: "", started: false, timer: 0, count: 0, PassageID: "", }; }, methods: { waitFunc: function () { this.count++; this.setStart(); console.log("pushed!", this.start); if (!this.started) this.startManeger(); }, setStart: function () { this.start = new Date(); this.timer = 0; }, startManeger: function () { console.log("started maneger"); this.PassageID = setInterval(this.detector(), 20); }, detector: function () { let date = (new Date() - this.start) / 1000; console.log(date, "date"); let time = this.timer + 1; if (date === time) { this.timer++; console.log(this.timer, "timer"); } if (this.timer >= 5) { console.log("5sec"); //押されず5秒経過 clearInterval(this.PassageID); this.PassageID = ""; this.timer = 0; //send count this.count = 0; this.start = ""; this.started = false; } }, }, }; </script>

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

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

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

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

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

guest

回答2

0

ベストアンサー

色々突っ込みどころがあるので、順を追って説明します。

まず、setIntervalを多重起動しないようにthis.startedを使って判定しているようですが、
this.startedがtrueになるタイミングが存在しません。
ケアレスミスなのでしょうが、念の為。

次に、setIntervalの第一引数に渡すのは関数です。
元のコードでは関数を実行した戻り値(undefined)を渡してしまっています。
これだとthis.detectorが一回実行されるだけで、定期実行はされません。

これを踏まえて、startManagerを修正して下さい。

javascript

1startManeger: function () 2{ 3 console.log("started maneger"); 4 this.started = true; 5 this.PassageID = setInterval(this.detector, 20); 6},

setIntervalで、必ず指定した間隔で実行される事を期待しないで下さい。何かの拍子で普通にずれます。
秒数の比較は整数に直してからやりましょう。
あと、経過秒数を入れる変数名にdateというのはさすがに変では?

javascript

1detector: function () 2{ 3 let date = Math.floor( (new Date() - this.start) / 1000 ); 4 ...

以上です。

投稿2021/01/27 00:58

編集2021/01/27 01:04
AT_2nd

総合スコア266

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

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

MOTOMUR

2021/01/27 01:54

数多くのご指摘ありがとうございます。無事、動作するようになりました。
guest

0

setTimeoutを利用して、5秒後に処理を実行するのはいかがでしょうか?

Javascript

1 data() { 2 return { 3 timeoutID: '' 4 } 5 }, 6 methods: { 7 waitFunc() { 8 clearTimeout(this.timeoutID) 9 this.timeoutID = setTimeout(() => { 10 // 5秒後に実行したい処理を記述 11 }, 5000); 12 } 13 }

投稿2021/01/26 16:29

Twoshi

総合スコア354

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

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

MOTOMUR

2021/01/26 23:54

回答ありがとうございます! 「最後のクリックから」5秒後という部分が今度は抜けてしまいます
Twoshi

2021/01/27 00:28

ご確認いただきありがとうございます。 > 「最後のクリックから」5秒後という部分が今度は抜けてしまいます こちらはどのような意味になりますでしょうか? ご質問内容には「最後のクリックから」5秒後と記載されている箇所が見当たらないのですが、、、
MOTOMUR

2021/01/27 01:52

タイトルに書いて本文に記入漏れしてました。申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問