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

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

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

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

868閲覧

setStateと再レンダリングの挙動について

nso

総合スコア8

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

1クリップ

投稿2021/11/23 02:49

以下のようなソースでsetCount(count+1)のようにしてレンダリング回数を見ていました。

countが増加しないのはわかるのですが、以下の画像のように、'rendered timer'の回数が1回多いように思います。

import { useEffect, useState } from 'react'; export const Timer = () => { const [count, setCount] = useState(0); console.log('rendered timer'); const time = () => { console.log('time'); console.log('count:', count); setCount(count + 1); }; useEffect(() => { console.log('use effect'); const interval = setInterval(time, 5000); console.log('use effect2'); return () => { clearInterval(interval); console.log('clear'); }; }, []); return <div>{count}</div>; };

イメージ説明
1回目:初回マウント時

2回目:setIntervalでtime関数内でsetCountが実行されたとき(countの増加によるstate変更)

3回目:state変更は無いのに再度レンダリングされている。原因不明

この3回目の'redered timer'のレンダリングはなぜ起こっているのでしょうか?

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

この3回目の'redered timer'のレンダリングはなぜ起こっているのでしょうか?

気にすべきではありません。

関数コンポーネントは冪等であるべきものであるので、「実行回数が想定より多い」で正しく動かないのであれば、そのコーディングのほうが間違いです。

(なお、useEffectは1度のレンダリングに対して1回実行されることが保証されていますが、関数コンポーネントの関数そのものは、1度のレンダリングで複数回実行される可能性もあります)

投稿2021/11/23 02:57

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問