[解決済み] ReactアプリのsetInterval
2022-03-09 09:09:04
質問
Reactはまだかなり初心者なのですが、少しずつ削っていって、行き詰まったことが出てきました。
私はReactで"timer"コンポーネントを作ろうとしていますが、正直なところ、このやり方が正しいのか(あるいは効率的なのか)、よくわかりません。以下のコードでは、オブジェクトを返すように状態を設定しました。
{ currentCount: 10 }
と弄り回しています。
componentDidMount
,
componentWillUnmount
および
render
で、10→9のカウントダウンしかできない。
2つに分けて質問します。私は何を間違えているのでしょうか?また、setTimeoutを使用する際に、より効率的な方法はありますか?
componentDidMount
&です。
componentWillUnmount
)?
よろしくお願いします。
import React from 'react';
var Clock = React.createClass({
getInitialState: function() {
return { currentCount: 10 };
},
componentDidMount: function() {
this.countdown = setInterval(this.timer, 1000);
},
componentWillUnmount: function() {
clearInterval(this.countdown);
},
timer: function() {
this.setState({ currentCount: 10 });
},
render: function() {
var displayCount = this.state.currentCount--;
return (
<section>
{displayCount}
</section>
);
}
});
module.exports = Clock;
解決方法は?
あなたのコードには4つの問題があります。
- timerメソッドで、現在のカウントを常に10に設定しています。
- renderメソッドで状態を更新しようとした場合
-
を使用しない。
setState
メソッドで実際に状態を変更します。 - ステートにintervalIdを保存していない
直してみましょう。
componentDidMount: function() {
var intervalId = setInterval(this.timer, 1000);
// store intervalId in the state so it can be accessed later:
this.setState({intervalId: intervalId});
},
componentWillUnmount: function() {
// use intervalId from the state to clear the interval
clearInterval(this.state.intervalId);
},
timer: function() {
// setState method is used to update the state
this.setState({ currentCount: this.state.currentCount -1 });
},
render: function() {
// You do not need to decrease the value here
return (
<section>
{this.state.currentCount}
</section>
);
}
この場合、タイマーは10から-Nまで減少することになります。もし、タイマーが0まで減少するようにしたい場合は、少し修正したものを使用します。
timer: function() {
var newCount = this.state.currentCount - 1;
if(newCount >= 0) {
this.setState({ currentCount: newCount });
} else {
clearInterval(this.state.intervalId);
}
},
関連
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React JSX内のループ
-
[解決済み] JavaScriptでsetIntervalの呼び出しを停止する
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] Reactコンポーネントに条件付きで属性を追加するにはどうすればよいですか?
-
[解決済み] React jsのonClickはメソッドに値を渡すことができない
-
[解決済み] setTimeoutかsetIntervalか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】リソースはドキュメントと解釈されるが、MIMEタイプはapplication/zipで転送される
-
[解決済み】 Uncaught Reference Error: stLight is not defined (in Chrome only)
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】Vueが定義されていない