Next.jsでSVGのレンダリングエラーになったときの解決方法
date
Jan 3, 2023
repo_url
slug
svg-rendering-error
status
Published
summary
type
Post
thumbnail_url
tags
nextjs
typescript
outer_link
ダークモードの切り替えボタン用にheroiconsを使用したのですが、コンソールエラーが出ました。
以下が該当のコードです。テーマによってアイコンを出し分けています。(色々省略してあります)。
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
{theme === 'light' ? <MoonIcon/> : <SunIcon/>}
</button>
以下がエラー内容
Warning: Prop d did not match
色んな記事を漁った結果、以下の記事で解決できました。
原因
Next.jsでSSRする場合、SVGのレンダリングにlocalStorageの変数を用いるらしく、
SSRでlocalStorageを使うのはよろしくないよね、ということでエラーを吐くそう。
対策
useEffectを利用して、クライアントサイドでレンダリングされてからSVGアイコンをレンダリングさせる。
const [loaded, setLoaded] = useState(false);
useEffect(() => {
setLoaded(true);
}, [setLoaded]);
//...
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
{loaded && theme === 'light' ? <MoonIcon/> : <SunIcon/>}
</button>
補足
調べている途中で直接的な答えにはなっていませんでしが、今後起こりうるかなと思い残しておきます。