[Next.js] Styled Components

jsha·2023년 7월 18일
0
  <body> 
    <ThemeProviderContainer theme={theme}>{children}</ThemeProviderContainer>
  </body>

이런식으로 ThemeProviderContainer로 감싸게 되면 적용하고자 하는 테마색은 잘 적용되지만,
렌더링 될 때 html 코드가 먼저 렌더링 되므로 잠시 스타일이 적용되지 않은 상태가 화면에 나타나게 된다.

Next.js에서는 이에 대한 해결책을 공식문서에서 이렇게 안내하고 있다.
공식문서 참고

'use client'
 
import React, { useState } from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { ServerStyleSheet, StyleSheetManager } from 'styled-components'
 
export default function StyledComponentsRegistry({
  children,
}: {
  children: React.ReactNode
}) {
  // Only create stylesheet once with lazy initial state
  // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
  const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())
 
  useServerInsertedHTML(() => {
    const styles = styledComponentsStyleSheet.getStyleElement()
    styledComponentsStyleSheet.instance.clearTag()
    return <>{styles}</>
  })
 
  if (typeof window !== 'undefined') return <>{children}</>
 
  return (
    <StyleSheetManager sheet={styledComponentsStyleSheet.instance}>
      {children}
    </StyleSheetManager>
  )
}

공식문서의 경로와 똑같이 lib이라는 폴더를 생성하여 registry라는 파일을 생성하여 위의 코드를 넣어주었다.

<body>
  <StyledComponentsRegistry> // 감싸주기!
    <ThemeProviderContainer theme={theme}>{children}</ThemeProviderContainer>
  </StyledComponentsRegistry>
</body>

이런식으로 코드를 작성해주니까 스타일이 뒤늦게 적용되는 문제를 해결할 수 있었다.

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

글이 많은 도움이 되었습니다, 감사합니다.

1개의 답글

관련 채용 정보