LoginSignup
0
0

More than 1 year has passed since last update.

componentが勝手に二重renderされちゃう

Posted at

始めに

最初にReactを勉強していた時に、ログを確認したら絶対1回しか出力されないうはずのログが
2回出力されていることがわかりました。特に問題とかにはならなかったため、無視してきたが、
ソースが長くなることにより、ログを見るのがむずくて探してみた。

renderが二重されちゃう

import React from 'react'
export default function List() {
    const todos= [
        {id: 1, text: 'Drink Water'},
        {id: 2, text: 'Wash Car'}
    ]
    
    const Item = (props) => {
        console.log(props);
        return <li>{props.id}{props.text}</li>
    }

    const todoList = todos.map((todo) => 
        <Item key={todo.id} id={todo.id} text={todo.text}/>
    )  

    return (
        <>
            {todoList}
        </>
    )
}

普通だと上記を実行させたらtodosのobjectが2回出力すると予想されますが、
image.png
console画面を見るとなぜか2回出力され、2回renderされてしまうことがわかります。
一体なぜでしょか?
それはReact.StrictModeです。

React.StrictMode

StrictModeとは、Applicationの潜在的な問題を発覚するためのツールです。
これは、開発モードでは活性化して、productionモードでは影響を受けないそうです。 render段階のライフサイクルメソッド(constructor、render、setStateupdate function...)は何度も呼び出されることがあるため、副作用を含まないことが重要です。 そうでなければメモリ漏れなど多様な問題を起こしかねない!
しかし、このような問題は予測通りに動作しないため、発見するのが難しいです。 それで、StrictModeが問題を見つけることはできないですが、いくつかの機能を意図的に二重呼び出しして発見できるようにしてくれます。

その機能に該当するのは以下!

・Class component constructor, render, and shouldComponentUpdate methods
・Class component static getDerivedStateFromProps method
・Function component bodies
・State updater functions (the first argument to setState)
・Functions passed to useState, useMemo, or useReducer

React.StrictModeを解除するにはindex.jsのStrictModeを無効にしておけば二重呼び出されません。

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  // StrictModeに囲まれているコンポーネントが対象!  
  <React.StrictMode> 
    <App />
  </React.StrictMode>
);

参考したサイト

https://mariosfakiolas.com/blog/my-react-components-render-twice-and-drive-me-crazy/
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0