개발 이야기/Front-end

React Styling

sonoa 2023. 4. 8. 09:32
반응형

React Styling

  • 삼항 연산자를 이용해서 조건에 맞게 스타일링을 줄 수 있다.
  • 조건부 스타일링
  • inline 은 우선순위가 높기 때문에 선호하지 않는다.
<form onSubmit={formSubmitHandler}>
  <div className="form-control">
    <label style={{ color: !isValid ? "red" : "black" }}>Course Goal</label>
    <input
      style={{
        borderColor: !isValid ? "red" : "black",
        background: !isValid ? "salmon" : "transparent",
      }}
      type="text"
      onChange={goalInputChangeHandler}
    />
  </div>
  <Button type="submit">Add Goal</Button>
</form>

동적으로 CSS 클래스 설정하기

  • CSS 에 필요한 스타일을 만들고
.form-control.invalid input {
  border-color: red;
  background-color: rgb(212, 174, 174);
}

.form-control.invalid label {
  color: red;
}
  • 조건식을 이용해서, 조건에 맞는 className 을 추가하는 형식으로 동적인 스타일링으로 한다
<div className={`form-control ${!isValid ? 'invalid' : ''}`}>

정적인 Styled Components

  • 스타일이 적용된 컴포넌트에만 스타일이 적용된다.
  • 다른 컴포넌트에는 영향을 끼치지 않는다.
  • 설치하기 npm install --save styled-components
import styled from "styled-components";

// 템플릿 리터럴
const Button = styled.button`
  font: inherit;
  padding: 0.5rem 1.5rem;
  border: 1px solid #8b005d;
  color: white;
  background: #8b005d;
  box-shadow: 0 0 4px rgba(0, 0, 0, 0.26);
  cursor: pointer;

  &:focus {
    outline: none;
  }

  &:hover,
  &:active {
    background: #ac0e77;
    border-color: #ac0e77;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.26);
  }
`;

동적인 Styled Components

const FormControl = styled.div`
  margin: 0.5rem 0;

  & label {
    font-weight: bold;
    display: block;
    margin-bottom: 0.5rem;
  }

  & input {
    display: block;
    width: 100%;
    border: 1px solid #ccc;
    font: inherit;
    line-height: 1.5rem;
    padding: 0 0.25rem;
  }

  & input:focus {
    outline: none;
    background: #fad0ec;
    border-color: #8b005d;
  }

  &.invalid input {
    border-color: red;
    background-color: rgb(212, 174, 174);
  }

  &.invalid label {
    color: red;
  }
`;
  • 해당 컴포넌트에 styled.div 를 만들고, 필요한 css 를 넣어준다
<FormControl className={!isValid && "invalid"}>
  <label>Course Goal</label>
  <input type="text" onChange={goalInputChangeHandler} />
</FormControl>
  • 필요한 부분에 넣은 후, className={!isValid && 'invalid'} 를 이용해서 해당하는 경우에 따라 스타일링을 바꿔준다.
  • `` 안에서도 props 를 사용할 수 있다.
const FormControl = styled.div`
  margin: 0.5rem 0;

  & label {
    font-weight: bold;
    display: block;
    margin-bottom: 0.5rem;
    color: ${(props) => (props.invalid ? "red" : "black")}
  }

  & input {
    display: block;
    width: 100%;
    border: 1px solid ${(props) => (props.invalid ? "red" : "#ccc")};
    background: ${(props) => (props.invalid ? "red" : "transparent")}
    font: inherit;
    line-height: 1.5rem;
    padding: 0 0.25rem;
  }

  & input:focus {
    outline: none;
    background: #fad0ec;
    border-color: #8b005d;
  }
`;

<FormControl invalid={!isValid}>
  <label>Course Goal</label>
  <input type="text" onChange={goalInputChangeHandler} />
</FormControl>;
반응형

'개발 이야기 > Front-end' 카테고리의 다른 글

TypeScript 복습  (0) 2023.04.14
Next.js #2  (0) 2023.04.13
Next.js  (0) 2023.04.07
React 라이브러리 #8  (0) 2023.04.06
React 라이브러리 #7  (0) 2023.04.05