TIL 116. Warring: Received 'false' for a non-boolean attribute '속성'

isk·2023년 7월 10일
0

TIL

목록 보기
117/122
post-custom-banner

styled-components를 사용하다 보면 가끔 아래의 경고 문구를 만나게 된다.

Warning: Received `true` for a non-boolean attribute `{속성}`.
If you want to write it to the DOM, pass a string instead: {속성}=“true” or {속성}={value.toString()}.

직역하면, '불리언타입이 아닌 곳에 false를 줬다. 문자열로 줘라' 라는 뜻이다.

그럼 왜 문자열로 주라는 걸까 생각해봤다.

// ...

return (
  <Div toggle={value}>
 	여긴 div 
  </Div>
)

// ...

const Div = styled.div<{toggle: boolean}>`
  /* ... */

  height: {({toggle}) => (toggle ? "60px" : "120px")};

  /* ... */
`;

보통 위 코드처럼 prop 주게 된다.
실제 DOM 엘리먼트에 전달하기 전에, styled-components 내부에서 비표준 속성을 자동으로 필터링한다.
필터링 되지 않는 것들은 표준 속성이므로 제대로된 타입의 값을 줘야한다.
제대로 된 값을 주지 않으면 경고 문구를 보게 된다.
실제로 div태그에 boolean값을 사용하는 속성은 없다. 대부분 문자열이나 숫자다.
그렇기 때문에 boolean값을 사용하려고 하면 경고 문구가 뜬다고 볼 수도 있겠다.

해결법은 의외로 간단하다.

// ...

return (
  <Div $toggle={value}>
 	여긴 div 
  </Div>
)

// ...

const Div = styled.div<{$toggle: boolean}>`
  /* ... */

  height: {({$toggle}) => ($toggle ? "60px" : "120px")};

  /* ... */
`;

$을 붙여주는 것으로, 실제 DOM에 prop가 전달되는 것을 막을 수 있다.

post-custom-banner

0개의 댓글