Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 1x | import 'react-toastify/dist/ReactToastify.css'; import { colors, createTheme, CssBaseline, ThemeProvider } from '@mui/material'; import React from 'react'; import ga from 'react-ga4'; import { ToastContainer } from 'react-toastify'; import { links } from '@/constants'; import { Top } from '@/pages'; const AppTheme = createTheme({ palette: { mode: 'dark', primary: { main: colors.grey[900] }, }, typography: { button: { textTransform: 'none', }, }, }); const App = () => { // NOTE: React の再描画タイミング // 主に以下のタイミングで再描画が発生する // - コンポーネントが保持する状態 (useState や useReducer等) が更新された場合 // - コンポーネントが参照するコンテキスト (useContext) が更新された場合 // - コンポーネントに渡される引数 (props およびそれに内包される値) が更新された場合 // - 親コンポーネントが再描画された場合 ※ メモ化 (React.memo) されたコンポーネントは除外される // NOTE: React における副作用と useEffect // コンポーネントの本来の責務は描画だが、描画以外で実行しなければならない処理を React では「副作用」と呼ぶ // API 処理 (サーバからのデータ取得) やイベントハンドラ (DOM イベント) などはすべて副作用となる // 副作用を含む処理をコンポーネント内にそのまま定義した場合、再描画のたびに処理が呼び出され、過剰実行や無限ループに陥る可能性がある // useEffect は副作用が依存する値を指定する(指定の値が変更された時に実行する)ことで、再描画時の無条件実行を防ぐことができる // 依存する値を空 `[]` にした場合は、初回レンダリング時にのみ実行される React.useEffect(() => { /* istanbul ignore else */ if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test') { /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */ ga.initialize(process.env.REACT_APP_GOOGLE_ANALYTICS_ID!); ga.send({ hitType: 'pageview', page: links.self }); } }, []); return ( <ThemeProvider theme={AppTheme}> <CssBaseline /> <Top data-testid="App__Top" /> <ToastContainer draggable={false} closeButton={false} autoClose={5000} data-testid="App__ToastContainer" /> </ThemeProvider> ); }; export default App; |