ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2019.08.23] 오늘의 TIL - [Next.js] global Style의 이해
    개발 블로깅/오늘의 TIL 2019. 8. 23. 01:10

    next.js에서 여러 페이지 및 컴포넌트에 global 방식으로 스타일을 적용할 수 있다.

    아래 예시를 봐보자.

    components/nav.js

    import React from 'react'
    
    const Nav = () => (
      <div>
        <a>첫번째 컴포넌트 입니다.</a>
      </div>
    )
    
    export default Nav;
    

    a 태그 하나가 들어있는 간단한 컴포넌트이다.

    pages/index.js

    import React from 'react'
    import Nav from '../components/nav'
    
    const Home = () => (
      <div>
        <a>index 페에지 입니다.</a>
        <Nav />
    
        <style jsx>{`
         a {
            color: #067df7;
            text-decoration: none;
            font-size: 13px;
            text-align: center;
            margin: 10px 0;
          }
        `}</style>
      </div>
    )
    
    export default Home;
    

    index.js 페이지에서도 a 태그를 가지고 있다.

    그리고 바로 a태그 바로 밑에 nav 컴포넌트를 가져와서 사용하였다.

    nav 컴포넌트 하단에는 a태그에 스타일을 적용하고 있다.

     

    결과 화면

     

    결과를 확인해보니, index.js 페이지 파일에 있는 a 태그 요소에만 적용이 되었다.

    만약 하위 컴포넌트에도 해당 스타일을 적용하려면 style을 global로 선언해주어야 한다.

    # global style 선언 방식

    <style jsx global>
    
    </style>

     

    index.js 페이지 파일을 수정해보자.

    import React from 'react'
    import Nav from '../components/nav'
    
    const Home = () => (
      <div>
        <a>index 페에지 입니다.</a>
        <Nav />
    
        <style jsx global>{`
         a {
            color: #067df7;
            text-decoration: none;
            font-size: 13px;
            text-align: center;
            margin: 10px 0;
          }
        `}</style>
      </div>
    )
    
    export default Home;
    

     

    결과 화면

     

    최상위 index.js 페이지에서 선언한 style이 하위 컴포넌트에도 적용된 것을 확인할 수 있다.

     

    최하위 컴포넌트로 사용할 nav2.js 파일을 하나 더 생성해보자.

    components/nav2.js

    import React from 'react';
    
    const nav2 = () => (
      <div>
        <a href='/'>최하위 컴포넌트 입니다.</a>
      </div>
    )
    export default nav2;

    똑같이 a태그를 사용한 컴포넌트이다.

    components/nav.js

    import React from 'react'
    import Nav2 from './nav2';
    
    
    const Nav = () => (
      <div>
        <a>첫번째 컴포넌트 입니다.</a>
        <Nav2 />
      </div>
    )
    
    export default Nav
    

    최하위 컴포넌트 nav2.js 파일을 가져와서 사용한다.

    결과 화면

    최상위 페이지 index.js 파일에 선언한 style이 nav, nav2 컴포넌트에 전부 적용된 것을 확인할 수 있다.

     

    '<style jsx global>' 태그를 최상위 페이지가 아닌, 중간 컴포넌트에서 선언하면?

     

    최상위 페이지 index.js에 선언한 global style을 삭제하고, 중간 컴포넌트인 nav.js 파일에 선언해보자.

    pages/index.js

    import React from 'react'
    import Nav from '../components/nav'
    
    const Home = () => (
      <div>
        <a href='/'>index 페이지 입니다.</a>
        <Nav />
      </div>
    )
    
    export default Home
    

    index.js페이지에서 선언하던 global style을, 하위인 nav컴포넌트로 이동시킨다.

    components/nav.js

    import React from 'react'
    import Nav2 from './nav2';
    
    
    const Nav = () => (
      <div>
        <a>첫번째 컴포넌트 입니다.</a>
        <Nav2 />
        <style jsx global>{`
          a {
            color: #067df7;
            text-decoration: none;
            font-size: 13px;
            text-align: center;
            margin: 10px 0;
          }
        `}</style>
      </div>
    )
    
    export default Nav
    

     

    결과화면

    중간 컴포넌트인 nav컴포넌트에 선언을 하니, 상위 하위 구분 없이 전부 적용되는 것을 확인할 수 있다.

     

    이러한 특징을 이용해서, 우리는 index.js라는 특정 페이지뿐 아니라, 모든 페이지에도 global하게 적용할 수 있다.

    components/Layout.js

    import React from 'react'
    import Header from './Header';
    import Title from './Title';
    
    const Layout = ({children}) => (
      <div>
        <Header />
        {children}
        <style jsx global>{`
          ...
        `}</style>
      </div>
    )
    
    export default Layout;
    

     

    바로 next.js 에서 흔히 사용하는 Layout 컴포넌트에 직접 global style을 적용하는 것이다.

    그러면 모든 페이지는 Layout을 이용하므로, 모든 페이지 및 컴포넌트에 style을 적용시킬 수 있다.


    스타일만 선언한 외부 파일을 가져와서 쓰는 방식도 있는데, 이건 다음에 기회 되면 작성해야겠다..!

    반응형

    댓글

Designed by Tistory.