Next.jsでシステムを作っていますが、router.push
で自身のページのパスを指定して実行した時にToo many re-renders
エラーが出ます。
ソースコード
実際はもっとたくさんありますが、主要なファイルは2つあります。/user/settings/account
または/user/settings/security
にアクセスした状態でSettingsComponent.tsx
にあるリンクをクリックすると必ずエラーが発生します。
js:pages/user/settings/[tab].tsx
1import styles from '../../../styles/CommonPageBase.module.scss' 2import { MouseEvent, useEffect } from 'react'; 3import { GetServerSideProps } from 'next' 4import Header from '../../../components/global/Header'; 5import { useTranslation } from 'react-i18next'; 6import PropsPicker, { CommonProps } from '../../../models-server/data/props'; 7import SettingsComponent from '../../../components/page/user/SettingsComponent'; 8 9export default function Settings(props: CommonProps) { 10 const [ t, i18n ] = useTranslation(); 11 i18n.changeLanguage(props.lang); 12 13 return ( 14 <div className={`${styles.theme1} theme1`}> 15 <SettingsComponent props={props}/> 16 </div> 17 ) 18} 19 20// getServerSideProps
js:pages/user/settings/SettingsComponent.tsx
1import styles from './Settings.module.scss' 2import { useTranslation } from 'react-i18next'; 3import { useRouter } from 'next/dist/client/router'; 4import Link from 'next/link'; 5import { CommonPropsWrapper } from '../../../models-server/data/props'; 6 7export default function SettingsComponent(props: CommonPropsWrapper) { 8 const [ t, i18n ] = useTranslation(); 9 10 return ( 11 <div className={`${styles.theme1} theme1`}> 12 <div className={styles.settings}> 13 <Link href='/user/settings/account'>アカウント</Link> 14 <Link href='/user/settings/security'>セキュリティ</Link> 15 </div> 16 </div> 17 ) 18}
なおこのシステムではreCAPTCHAを使っているため、_app.tsx
にて以下の設定をおこなっています。
js:_app.tsx
1function MyApp({ Component, pageProps }: AppProps) { 2 return ( 3 <GoogleReCaptchaProvider reCaptchaKey={RECAPTCHA_SITE_KEY}> 4 <Component {...pageProps} /> 5 </GoogleReCaptchaProvider> 6 ); 7}
実現したいこと
SettingsComponent.tsx
にあるLink
が正しく動作するようにしたいです。
発生している問題・エラーメッセージ
/user/settings/account
にアクセスした状態で「セキュリティ」のリンクをクリックすると/user/settings/security
に遷移するはずですが、以下の2つが発生します。まずToo many re-renders
をなんとかしたいです。
/user/settings/account
と/user/settings/security
どちらも/user/settings/[tab].tsx
を参照するため、router.pathname
は変わりません。このときにrouter.push
しようとすると、自分の環境ではエラーが必ず発生します。
1 of 2 unhandled errors Unhandled Runtime Error Error: Too many re-renders. React limits the number of renders to prevent an infinite loop. Call Stack renderWithHooks node_modules\react-dom\cjs\react-dom.development.js (14997:0) updateFunctionComponent node_modules\react-dom\cjs\react-dom.development.js (17356:0) beginWork node_modules\react-dom\cjs\react-dom.development.js (19063:0) HTMLUnknownElement.callCallback node_modules\react-dom\cjs\react-dom.development.js (3945:0) Object.invokeGuardedCallbackDev node_modules\react-dom\cjs\react-dom.development.js (3994:0) invokeGuardedCallback node_modules\react-dom\cjs\react-dom.development.js (4056:0) beginWork$1 node_modules\react-dom\cjs\react-dom.development.js (23964:0) performUnitOfWork node_modules\react-dom\cjs\react-dom.development.js (22776:0) workLoopSync node_modules\react-dom\cjs\react-dom.development.js (22707:0) renderRootSync node_modules\react-dom\cjs\react-dom.development.js (22670:0) performSyncWorkOnRoot node_modules\react-dom\cjs\react-dom.development.js (22293:0) eval node_modules\react-dom\cjs\react-dom.development.js (11327:0) unstable_runWithPriority node_modules\scheduler\cjs\scheduler.development.js (468:0) runWithPriority$1 node_modules\react-dom\cjs\react-dom.development.js (11276:0) flushSyncCallbackQueueImpl node_modules\react-dom\cjs\react-dom.development.js (11322:0) flushSyncCallbackQueue node_modules\react-dom\cjs\react-dom.development.js (11309:0) scheduleUpdateOnFiber node_modules\react-dom\cjs\react-dom.development.js (21893:0) updateContainer node_modules\react-dom\cjs\react-dom.development.js (25482:0) legacyRenderSubtreeIntoContainer node_modules\react-dom\cjs\react-dom.development.js (26037:0) Object.render node_modules\react-dom\cjs\react-dom.development.js (26103:0) renderReactElement node_modules\next\dist\client\index.js (494:21) doRender node_modules\next\dist\client\index.js (801:4) _callee$ node_modules\next\dist\client\index.js (390:18) tryCatch node_modules\next\dist\compiled\regenerator-runtime\runtime.js (45:15) Generator.invoke [as _invoke] node_modules\next\dist\compiled\regenerator-runtime\runtime.js (274:0) prototype.<computed> [as next] node_modules\next\dist\compiled\regenerator-runtime\runtime.js (97:0) asyncGeneratorStep node_modules\next\dist\client\index.js (29:28) _next node_modules\next\dist\client\index.js (47:16) eval node_modules\next\dist\client\index.js (52:12) new Promise <anonymous> eval node_modules\next\dist\client\index.js (44:15) render node_modules\next\dist\client\index.js (381:19) Router.subscription [as sub] node_modules\next\dist\client\index.js (354:47) Router.set node_modules\next\dist\shared\lib\router\router.js (1156:20) _callee$ node_modules\next\dist\shared\lib\router\router.js (861:28) tryCatch node_modules\next\dist\compiled\regenerator-runtime\runtime.js (45:15) Generator.invoke [as _invoke] node_modules\next\dist\compiled\regenerator-runtime\runtime.js (274:0) prototype.<computed> [as next] node_modules\next\dist\compiled\regenerator-runtime\runtime.js (97:0) asyncGeneratorStep node_modules\next\dist\shared\lib\router\router.js (37:28) _next node_modules\next\dist\shared\lib\router\router.js (55:16)
2 of 2 unhandled errors Unhandled Runtime Error TypeError: Cannot read properties of undefined (reading 'logging') Call Stack Array.<anonymous> https://www.gstatic.com/recaptcha/releases/CHIHFAf1bjFPOjwwi5Xa4cWR/recaptcha__ja.js (246:215) Array.<anonymous> https://www.gstatic.com/recaptcha/releases/CHIHFAf1bjFPOjwwi5Xa4cWR/recaptcha__ja.js (144:497) <unknown> https://www.gstatic.com/recaptcha/releases/CHIHFAf1bjFPOjwwi5Xa4cWR/recaptcha__ja.js (145:404)
補足情報(FW/ツールのバージョンなど)
express
を使っていますが、Next.js
でカスタムサーバーは使用していません。
json:package.json
1 "dependencies": { 2 "@fortawesome/fontawesome-svg-core": "^6.1.1", 3 "@fortawesome/free-brands-svg-icons": "^6.1.1", 4 "@fortawesome/free-solid-svg-icons": "^6.1.1", 5 "@fortawesome/react-fontawesome": "^0.2.0", 6 "accept-language": "^3.0.18", 7 "cookie": "^0.4.2", 8 "cookie-parser": "^1.4.5", 9 "express": "^4.17.1", 10 "i18next": "^20.4.0", 11 "next": "^12.2.2", 12 "normalize.css": "^8.0.1", 13 "react": "17.0.2", 14 "react-dom": "17.0.2", 15 "react-google-recaptcha-v3": "^1.10.0", 16 "react-i18next": "^11.11.4", 17 "uuid": "^8.3.2" 18 }, 19 "devDependencies": { 20 "@types/cookie": "^0.4.1", 21 "@types/cookie-parser": "^1.4.2", 22 "@types/express": "^4.17.13", 23 "@types/node": "^16.4.13", 24 "@types/react": "^17.0.16", 25 "@types/react-dom": "^17.0.9", 26 "@types/uuid": "^8.3.1", 27 "eslint": "7.32.0", 28 "eslint-config-next": "11.0.1", 29 "sass": "^1.37.5", 30 "typescript": "^4.3.5" 31 }

回答1件
あなたの回答
tips
プレビュー