Prop `style` did not match 에러 해결

Sheryl Yun·2023년 2월 4일
0

Next.js

목록 보기
5/6

Next.js에서 자동 + 수동 + 무한 슬라이드를 구현하는 도중 jsx안에 inline으로 transform을 넣었더니 다음과 같은 에러가 발생했다.

Prop style did not match. Server: transform~ Client: transform~

React였으면 나지 않았을 에러같지만 Next.js는 서버사이드렌더링을 하는 경우 서버에서 내려주는 html과 클라이언트 쪽의 html이 일치하지 않으면 에러가 발생한다.

이와 비슷하게 Hydration UI 에러도 있었다.

stackoverflow의 도움으로 다음처럼 해결했다.

// 에러가 발생한 곳
// width와 height가 useMediaQuery = isDesktop일 때 서버와 클라이언트에서의 상태가 다름

return (
	<div
          className={styles.slide}
          ref={slideRef}
          style={{
            width: `${ 
              (isDesktop ? 920 : 592) *
              COPIED_NUM
            }px`,
            transform: `translateX(${ 
              -1 *
              (isDesktop ? 920 : 592) *
                slideIndex)
            }px)`,
            transition: 'all 500ms ease-in-out',
          }}
        >
        ...
        </div>
)
// 에러 해결
// isServer라는 플래그를 주어 처음에 렌더링할 때 
// 유일하게 에러가 발생하던 isDesktop인 경우에만 true로 설정, 그 외에는 false 설정

  const [isServer, setIsServer] = useState(true);

  useEffect(() => {
    if (isDesktop) {
      setIsServer(true);
    } else {
      setIsServer(false);
    }
  }, []);
  
  ...

return (
	<div
          className={styles.slide}
          ref={slideRef}
          style={{
            width: `${
              (isServer || isDesktop ? 920 : isTablet || !isServer ? 592 : 0) *
              COPIED_NUM
            }px`,
            transform: `translateX(${
              -1 *
              ((isServer || isDesktop ? 920 : isTablet || !isServer ? 592 : 0) *
                slideIndex)
            }px)`,
            transition: 'all 500ms ease-in-out',
          }}
        >
)

설정하고 나니 에러가 사라졌다

profile
데이터 분석가 준비 중입니다 (티스토리에 기록: https://cherylog.tistory.com/)

0개의 댓글