본문 바로가기
[항해99] TIL

13일차 (Styled components, Globalstyles, React Hook)

by @kkkk_biiin 2023. 8. 28.
728x90

Styled components

// 1. styled.div, styled.p와 같은 형식으로 태그 앞에 styled를 붙여서 만든다.
// 2. 형식은 html 형식을 따른다.

const StyledBox = styled.div`
  width: 100px;
  height: 100px;
  border: 1px solid ${(props) => props.borderColor}; // 함수임
  margin: 20px;
`;

const boxList = ["red", "blue", "green", "yellow"];

// 색을 넣으면 이름을 반환하는 함수
const getBoxName = (color) => {
  switch (color) {
    case "red":
      return "rex box";
    default:
      return "black box";
  }
};

function App() {
  return (
    <>
      {boxList.map((box) => {
        return <StyledBox borderColor={box}>{getBoxName(box)}</StyledBox>;
      })}
    </>
  );
}

 

Globalstyles

// 프로젝트 전체를 아우르는 스타일
// 이것을 index.js에 import 하여 사용함
import { createGlobalStyle } from "styled-components";

const GlobalStyle = createGlobalStyle`
  body {
    font-family: "Helvetica", "Arial", sans-serif;
    line-height: 1.5;
  }
`;

export default GlobalStyle;

 

UseState(React Hook)

1. 기존 업데이트 방법은 배치 업데이트가 됨(한꺼번에 모아서 한 번만 반영)
2. 배치 업데이트 -> 랜더링이 잦은 문제를 해결하기 위함

// 함수형 업데이트
onClick={() => setNum((current) => current + 1) }

 

Use effect(React Hook)

1. 랜더링 될 때마다 특정한 작업을 수행해야 할 때 설정하는 훅
2. 컴포넌트가 화면에 보여졌을 때
3. 컴포넌트가 화면에서 사라졌을 때 = clean up
4. 의존성 배열: 이 배열에 값을 넣으면 그 값이 바뀔 때만 useeffect를 실행

 useEffect(() => {
    console.log("hi");

    return() =>{
      console.log('bye')  // Clean up 부분
    }
  }, [이 값이 변경될 때만 useEffect 실행]);

 

Useref(reference)

1. 특정 dom을 선택해야할 때 사용
2. 객체 형태로 출력(current : 초기값)
3. 저장공간으로 활용
    1) state와 비슷한 역할 -> state는 변화가 일어나면 다시 렌더링이 일어나면서 내부 변수들은 초기화 됨
    2) ref에 저장된 값은 렌더링을 일으키지 않음
    3) 정리: state는 리렌더링이 필요할 때만, ref는 리렌더링이 발생 안될 때 사용
4. 특징: 렌더링이 되기 전까지 값이 변경되지 않고, 될 때 한꺼번에 반영

활용: 렌더링 되자마자 특정 input이 focusing 돼야 할 때 사용

// 아이디가 10글자 입력되면 pw input 창으로 focus되는 코드
function App() {
  const idRef = useRef("");
  const pwRef = useRef("");

  const [id, setId] = useState("");
  useEffect(() => {
  	// idRef에 초점 맞추기
    idRef.current.focus();
  }, []);

  useEffect(() => {
  	// id의 길이가 10 이상이 되면 pwRef에 초점 맞추기
    if (id.length >= 10) {
      pwRef.current.focus();
    }
  }, [id]); // id값이 바뀔때만 실행

  return (
    <div>
      <div>
        id:{" "}
        <input
          value={id}
          onChange={(event) => {
            setId(event.target.value);
          }}
          type="text"
          // 참조할 수 있게 해줌
          ref={idRef}
        />
      </div>
      <div>
        pw: <input type="password" ref={pwRef} />
      </div>
    </div>
  );
}

 

useContext(React Hook)

Props drilling 문제점: 오류가 발생할 경우 추적이 어려워짐
필수 개념
	1. createContext: context 객체 생성
	2. Consumer: context 변화 감지
	3. Provider: context 전달 

주의 사항: 렌더링 문제가 발생
=> Provider에서 제공한 value가 달라진다면 useContext를 사용하고 있는 모든 컴포넌트가 리렌더링 됨

Provider: 자식 컴포넌트에 props를 넘겨주지 않아도 됨
<FamilyContext.Provider value={{houseName: houseName, pocketMoney: pocketMoney }}>
    <Father />
</FamilyContext.Provider>

// 받는 자식 컴포넌트 -> data에 context를 받아와서 사용
const data = useContext(FamilyContext);
728x90

'[항해99] TIL' 카테고리의 다른 글

15일차 (Redux)  (0) 2023.08.30
14일차 (최적화 React hook, Virtual DOM)  (0) 2023.08.29
3주차 WIL(Props)  (0) 2023.08.28
12일차 (React 컴포넌트 중복 제거)  (0) 2023.08.28
11일차 (SEO, CRA, Component, Props, 불변성)  (0) 2023.08.25