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>

補足

調べている途中で直接的な答えにはなっていませんでしが、今後起こりうるかなと思い残しておきます。

© Hayato Kamiyama 2023 - Build with Next.js & Notion