Myalog/Study
[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 사전직무교육 Day 4
myalog
2024. 8. 25. 14:15
사전직무교육 Day4
오늘은 프로젝트 캠프 넷째날
하지만 새벽에 갑작스런 옆구리 통증과 오한으로 인해 응급실 행이 되었다..
부득이하게 오프라인으로도 온라인으로도 수업을 아예 참여하지 못하게 된 상황이다 😭
그래서 오늘은 수업 자료를 토대로 정리한 내용을 블로깅하려고 한다..
✅ React 컴포넌트
컴포넌트 Children
- children prop은 컴포넌트의 속성 중 하나로, 컴포넌트의 모든 자식 요소들을 포함
- 이를 통해 부모 컴포넌트는 자식 컴포넌트를 동적으로 렌더링 할 수 있음
- 기본적으로 존재해 있으며, 컴포넌트 간 구성 요소를 더 쉽게 재사용 할 때나 동적으로 컨텐츠를 전달할 때 유용함
컴포넌트 Props 타입
- Omit<React.ComponentPropsWithRef<"input">, "type">
- Omit은 타입스크립트의 유틸리티 타입 중 하나
- 특정 타입에서 하나 이상의 속성을 제외한 새로운 타입을 만들어줌
- 예시에서는 "type" 속성을 제외한 input 속성들의 전부를 만들어 줌
- React.ComponentPropsWithRef<"input">
- "input" HTML 요소의 모든 기본 props를 포함하는 타입을 가져옴
- ComponentPropsWithRef 를 통해 "ref"라는 특별한 속성도 포함할 수 있도록 확장한 타입
- "ref" 속성을 통해 컴포넌트나 DOM 요소에 직접 접근해야할 때 사용
- React.ComponentPropsWithoutRef<"button">
- "button" HTML 요소의 모든 기본 props를 포함하는 타입을 가져옴
- ComponentPropsWithoutRef 를 통해 "ref"라는 속성이 필요하지 않거나 사용되지 않는 컴포넌트일 경우 사용
컴포넌트 Hook
- useId()
- 고유 id를 생성함
- 매개변수를 받지 않음
- 반복문이나 조건문에서는 사용 불가
- 커스텀 훅이나 컴포넌트 최상위에서만 사용 가능
- 데이터의 key 생성을 위해 사용하는 것은 불가
조건부 렌더링
- 특정 조건에 따라 컴포넌트나 요소를 렌더링
- if문
- 삼항 연산자
- 논리 연산자(&&)
- 즉시 실행 함수
반복 렌더링
- 특정 컴포넌트 요소를 반복적으로 출력하는 렌더링
- key 속성은 배열 항목의 고유성을 보장하기 위해 사용하므로 인덱스 번호로 사용하지 않도록 주의해야함
- 문자열 배열 렌더링
- 객체 배열 렌더링
- 컴포넌트 반복 렌더링
이미지 렌더링
- src 하위 폴더에 삽입
- assets 폴더에 저장하면 공개적으로 노출이 안됨
- 오직 리액트 시스템 내부에서만 이미지 활용이 가능함
- import 구문으로 불러오면 빌드 프로세스 과정 중 자동으로 이미지가 최적화 되고, 배포 직전에 public 폴더에 삽입됨
- 주로 컴포넌트 내에서 사용되는 이미지는 일반적으로 assets 폴더에 저장됨
- src 하위 폴더(assets 등)에 이미지 파일을 삽입하고, import로 불러옴
- <img /> 태그 src 속성에 넣기
- css 파일에 background-image 요소로 넣기
- public 폴더에 삽입
- public 폴더는 공용 폴더이기 때문에 상대 경로로 접근이 가능함
- 나중에 서비스를 배포하더라도 도메인을 통한 경로로 접근이 가능함
- ex) https://도메인/image.png
- 빌드 프로세스에 의해 처리되지 않는 이미지는 public 폴더에 저장하는 것이 좋음
- ex) 파비콘
📚 오늘의 과제
- 로그인 컴포넌트 만들기
- 제공된 피그마 디자인에 따라 로그인 컴포넌트 만들기
import Input from './components/Input.tsx';
import CheckBox from './components/CheckBox.tsx';
import Button from './components/Button.tsx';
function App() {
return (
<div>
<div>
<section>
<h2>
Login Into App
</h2>
<p>
Please enter your details to continue.
</p>
<form>
<Input type="email" placeholder="someone@example.com" />
<Input type="password" placeholder="Enter Password" />
<CheckBox type="checkbox">
<span>
I agree with <strong>terms</strong> and{' '}
<strong>policies.</strong>
</span>
</CheckBox>
<Button>
Log In
</Button>
<Button>
Go To Sing up
</Button>
</form>
</section>
<section>
<h2>
Sign Into App
</h2>
<p>
Please enter your details to continue.
</p>
<form>
<Input type="text" placeholder="Enter Your Name" />
<Input type="email" placeholder="someone@example.com" />
<Input type="password" placeholder="Enter Password" />
<CheckBox type="checkbox">
<span>
I agree with <strong>terms</strong> and{' '}
<strong>policies.</strong>
</span>
</CheckBox>
<Button>
Sign In
</Button>
<Button>
Go To Log In
</Button>
</form>
</section>
</div>
</div>
);
}
export default App;
Input, Button, CheckBox 컴포넌트는 강사님과 함께 수정된 코드여서 따로 공개는 하지 않았고, 각 컴포넌트 별 props로 전달되어야 할 속성들을 모두 전달했다.
피그마 디자인에 Login 컴포넌트와 Sign 컴포넌트가 나뉘어져 있는데, 나는 따로 나누지 않고 App 컴포넌트에 한번에 보여지도록 했다.
(추후에 Login 컴포넌트로 Sign 컴포넌트를 동적으로 업데이트하는 방식으로 리팩토링 될 예정..)
하루 빠진게 이렇게 타격이 클 줄이야...
새로운 Omit 타입이나 props 타입을 지정하는 방법을 수업 이후 강사님이 보내주신 코드를 보고 겨우 이해했다..
첫째도 건강, 둘째도 건강이 최고다.. 앞으로 건강관리에 더 유의해서 수업과 프로젝트 진행하는데에 지장이 없도록 해야겠다.
(입원치료하면서 온라인으로 수업을 들을 수 있으니 그나마 다행...)
내일도 화이팅이다..!!! 😭😭
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다.