스타일 구성 요소 구문을 지원하도록 CSS-in-JS 확장

previous post 에서 우리는 css 감정을 함수처럼 만들었고 이 블로그 게시물에서는 다음 스타일 구성 요소 구문을 지원하도록 css 함수를 확장할 것입니다.

const Button = styled('button')(
  {
    backgroundColor:  "blue",
    color: "white"
  }
)


API를 탐색할 때 유의해야 할 몇 가지 사항은 다음과 같습니다.

// On breaking into parts: 
const Button = // <-- Part: 3
styled('button') // <-- Part: 1
({ backgroundColor: 'blue' }) // <-- Part: 2



  • 파트 1: styled 함수는 생성되어야 하는 tagName 즉,

  •  styled('button') <-- 1
    
    // is equivalent to
    
    <button>
    


  • 파트 2: styled(tagName)는 이 style-object 요소의 스타일을 지정하는 데 사용할 tagName를 수락하는 함수를 반환합니다.

  • ({ backgroundColor: "blue" }) <-- Part 2
    
    // is converted to 
    
    css({ backgroundColor: "blue" }) 
    
    // and passed to the component as
    
    <button className={css(...)} />
    


  • 완료 호출은 지정된 스타일로 Button를 렌더링하는 React 구성 요소button를 반환합니다.

  • Rendering a button using style-component like syntax

    위의 점에서 우리는 styled 함수의 대략적인 껍질을 작성할 수 있습니다.

    // Part 1: styled('button'): element of type tagName to render
    function styled(tagName) { 
      // Part 2: style('button')({ color: 'white' }) takes in the style object and applies these styles to `tagName=button` component
    
      return function applyStyles(styleObject) { 
          // Part 3: `Button` react component 
          return function Component(props) { 
              // ...styling and element creation... 
              // Mark: 1
          }
      }
    }
    


    이제 Mark: 1에서 다음을 수행해야 합니다.
  • React.createElement 유형의 tagName를 사용하여 요소를 생성합니다.
  • style-objectcss 함수에 전달하여 이름을 생성합니다. 소품에 이미 일부 className이 포함될 수 있으므로 이러한 className을 함께 구성하십시오.

  • // continue from Mark: 1
    
    const clonedProps = clone(props);
    // a copy of props is required as by default react makes props immutable
    // and if we want to modify any props we need to make a copy for our use
    
    // compute a className for styleObject
    const generatedClassName = css(styleObject);
    
    // compose className 
    const className = generatedClassName + props.className ? + ` ${props.className}` : '';
    
    // reassign composed className
    clonedProps.className = className;
    
    // create element of type `tagName` with props = `clonedProps` and `style=generateClassName`
    const element = React.createElement(tagName, clonedProps);
    
    // The `element` is of type `tagName` and of `styles=styleObject` this is one we want to render
    
    return element;
    


    이것이 CSS-in-JS 라이브러리의 style-components 버전의 모습입니다. clone 함수는 다음과 같이 간단할 수 있습니다.

    const clone = (obj) => Object.assign({}, obj);
    


    CSS-in-JS에 대한 추가 정보:
  • Why CSS-in-JS?
  • CSS: Isolation vs Abstraction
  • Build your own emotion like CSS-in-JS library
  • Styler GitHub
  • Styler Codesandbox
  • 좋은 웹페이지 즐겨찾기