개발 블로깅/오늘의 TIL

[2019.08.23] 오늘의 TIL - [Next.js] global Style의 이해

Hello이뇽 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을 적용시킬 수 있다.


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

반응형