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

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

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

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

JavaScript

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

Q&A

解決済

3回答

3080閲覧

Vue.jsでclearIntervalが動作しない

DKI

総合スコア11

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2021/03/28 04:28

編集2021/03/29 07:22

clearIntervalでsetIntervalしている処理を止めたいが、うまく実装できない。

JavaScript

1<template> 2<v-app> 3 4 5 <v-btn 6 v-if="isActive == true" 7 class="pa-5 ml-3" 8 depressed 9 color="blue lighten-4" 10 @click="shuffle(); active();"> 11 スタート 12 </v-btn> 13 14 <v-btn 15 v-else 16 class="pa-5 ml-3" 17 depressed 18 color="red lighten-4" 19 @click="stop(); active();"> 20 ストップ 21 </v-btn> 22 23 24 25 </div> 26 </v-app> 27</template> 28 29<script> 30 31 32export default { 33 name: 'App', 34 35 components: { 36 37 }, 38 39 40 random_number: null, 41 isActive: true 42 }), 43 methods: { 44 reload(){ 45 const self = this 46 clearInterval(self.repeat); 47 console.log("reload"); 48 49 }, 50 active(){ 51 this.isActive = !this.isActive; 52 }, 53 shuffle(){ 54 var repeat = setInterval(function loop() { 55 this.random_number = Math.floor(Math.random() * this.message.length); 56 }.bind(this), 100); 57 repeat; 58 } 59 60 }, 61 mounted: { 62 }, 63 destroyed: { 64 stop() { 65 clearInterval(this.repeat); 66 } 67 } 68}; 69</script> 70

処理はmethodsの中になります。

やってみたこと

・clearIntervalはsetintervalの戻り値を引数にしなければならないと出てきたため、setIntervalを変数に定義し、引数に入れる→clearInterval動作しない
https://developer.mozilla.org/ja/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval

追記
ストップボタンを押した際にsetIntervalがとまるようにしたい

わかる方いたら回答お願いいたします。

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

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

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

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

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

guest

回答3

0

自己解決

js

1 var repeat = setInterval(function loop() { 2 if(this.isActive == false){ 3 this.random_number = Math.floor(Math.random() * this.message.length); 4 }else{ 5 clearInterval(repeat); 6 } 7 }.bind(this), 100); 8 repeat;

これで解決しました!

投稿2021/03/29 07:20

DKI

総合スコア11

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

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

0

shuffle の中の repeat は shuffle の外から参照できません。
repeat をデータの中に移動してそいつを参照するようにします。

js

1data () { 2 return { 3 repeat: null 4 } 5}, 6methods: { 7 shuffle () { 8 this.repeat = setInterval(... 9 }, 10 stop () { 11 clearInterval(this.repeat) 12 } 13}

https://jsfiddle.net/po0f4L2y/

投稿2021/03/28 23:44

neko_daisuki

総合スコア2090

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

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

0

destroyedはコンポーネントが消えたあとなのでbeforeDestroyでクリア処理をする必要がある

投稿2021/03/28 04:36

mikkame

総合スコア5036

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

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

DKI

2021/03/28 04:41

回答ありがとうございます。 beforeDestroy: { stop() { clearInterval(this.repeat); } と変更して@clickで呼び出していますが、うまく機能しません。 具体的にはボタンのストップの表示も変更されず、setIntervalも止まりません。 beforeDestroyの書き方が間違っているのでしょうか??
DKI

2021/03/28 04:55

methodsの中にbeforeDestroyを記載するのですね。 methods: { reload(){ const self = this clearInterval(self.repeat); console.log("reload"); }, active(){ this.isActive = !this.isActive; }, shuffle(){ var repeat = setInterval(function loop() { this.random_number = Math.floor(Math.random() * this.message.length); }.bind(this), 100); repeat; }, beforeDestroy() { clearInterval(this.repeat); this.random_number = Math.floor(Math.random() * this.message.length); console.log("reload"); } このようにして、btnで@clickで呼び出しましたが、止まりませんでした、、、
mikkame

2021/03/28 06:23 編集

関数の呼び出し方がおかしいですよね。beforeDestroyはmethodsの中じゃないですよ
DKI

2021/03/28 07:08

そうなんですか!すみません。 methodの外にmethodsと同じように定義すれば良いでしょうか? beforeDestroy: { stop() { clearInterval(this.repeat); this.random_number = Math.floor(Math.random() * this.message.length); console.log("reload"); } } こんな感じに書いてみましたが、うまくいきませんでした。 ここの記載はどこがおかしいでしょうか?? 参考 https://b1tblog.com/2019/10/18/vue-lifecycle/
DKI

2021/03/28 07:11

また、思ったのですが、clearIntervalも結局ボタンを押した際に実行するため、ライフサイクルはあまり関係ないのではないでしょうか?? methodsで記載して、ボタンを押した際に実行されるようにすれば問題ないかと思いました。 その方法でも実装できてはいないですが、beforeDestroyが問題ではない気がしました。
mikkame

2021/03/28 07:12

stop() { // do something } って関数の実行じゃないですよね。オブジェクトに対しての関数の定義ですよね
DKI

2021/03/28 07:37

はい、、 つまりどのように書けば良いのでしょうか???
mikkame

2021/03/28 08:32

> beforeDestroy: { > stop() { > clearInterval(this.repeat); > } こうやって書いたらbeforeDestroyというプロパティにstopというプロパティの関数を追加する ってことですよね。beforeDestroyはオブジェクトではなく、Functionである必要があると思うのですが?
DKI

2021/03/28 13:58

ありがとうございます! beforeDestroy: function(){ const self = this clearInterval(self.repeat); this.random_number = Math.floor(Math.random() * this.message.length); console.log("reload"); } このように設定するということでしょうか?? この際stopボタンが押された時にbeforeDestroyを起動するにはどう処理を書けば良いでしょうか?
mikkame

2021/03/28 14:09 編集

そもそもなんですが、コンポーネントが削除された時にタイマーを止めたいってわけじゃなかったんですか? ちょっと私には難しいのでこれ以上のコメントは辞めます
DKI

2021/03/28 14:17

はい!ストップボタンを押した際にsetIntervalが止まるようにしたいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問