Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

경북대 FE_정서현 4주차 과제 Step3 ~ 4 #97

Open
wants to merge 29 commits into
base: hyunaeri
Choose a base branch
from

Conversation

hyunaeri
Copy link

📌 4주차 질문

🤔 1. 제어 컴포넌트와 비 제어 컴포넌트의 차이가 무엇이고 제어 컴포넌트로 Form 을 만들어야 하는 경우가 있다면 어떤 경우인지 예시와 함께 설명하시오.

제어 컴포넌트와 비 제어 컴포넌트는 React 에서 Form 데이터를 관리하는 두 가지 방법이다.

제어 컴포넌트 (Controlled Components)

제어 컴포넌트는 React 상태 (State) 로 입력 값이 관리되는 컴포넌트이다. 모든 Form 요소 (input, textarea, select 등) 의 값은 컴포넌트의 상태를 통해 제어된다.

특징으로는 입력 값이 상태에 의해 관리되며 상태 변경에 따라 입력 값이 업데이트 된다. 또, 입력 값 변경 이벤트 (onChange) 를 통해 상태가 업데이트 된다.


비 제어 컴포넌트 (Uncontrolled Components)

비 제어 컴포넌트는 DOM 자체가 입력 값의 소스를 관리하는 컴포넌트이다. Ref 를 사용하여 DOM 노드에 직접 접근하고 값을 읽어온다.

특징으로는 입력 값이 DOM 자체에 의해 관리된다. Ref 를 사용하여 입력 값에 접근한다. 상태 관리가 필요하지 않다.


제어 컴포넌트로 Form 을 만들어야 하는 경우는 다음과 같다.

  1. 입력 값이 변경될 때마다 실시간으로 유효성 검사를 수행해야 하는 경우
  2. 입력 값에 따라 다른 UI 를 렌더링 해야 하는 경우
  3. 입력 값에 따라 동적으로 Form 필드를 추가하거나 제거해야 하는 경우
  4. 다른 상태나 컴포넌트와 입력 값을 동기화 해야하는 경우

ex) 사용자 이름을 입력받고, 입력 값에 따라 인사 메시지를 실시간으로 업데이트 하는 Form


🤔 2. Input type 의 종류와 각각 어떤 특징을 가지고 있는지 설명하시오.

  • text

    • 기본적인 단인 행 텍스트 입력 필드
  • password

    • 입력된 문자가 표시되지 않고 대체 문자로 표시
  • url

    • URL 입력을 위한 필드, 브라우저는 URL 형식을 검증
  • search

    • 검색 입력을 위한 필드
  • date

    • 날짜 입력을 위한 필드, 날짜 선택 UI 가 제공
  • checkbox

    • 다중 선택을 허용하는 체크박스
  • submit

    • Form 제출을 위한 버튼
  • button

    • 클릭 가능한 버튼, 기본 동작은 없음

🤔 3. label 태그는 어떤 역할을 하며 label 로 input 필드를 감싸면 어떻게 동작하는지 설명하시오.

label 태그는 HTML 에서 사용자 인터페이스와의 상호작용을 좀 더 직관적이고 접근 가능하게 하는 요소 이다. 입력 필드와 관련된 텍스트를 클릭하면 해당 입력 필드가 포커스되어 사용자 경험을 개선한다.

<label>
  Username:
  <input type="text" name="username" />
</label>

위 예시에서 Username 텍스트를 클릭하면 태그 내부에 있는 input 요소가 포커스를 받는다.

hyunaeri added 29 commits July 17, 2024 15:06
- 카드 메시지 미 입력 시 메시지 입력 안내
- 현금 영수증을 신청했을 때, 번호 미 입력 시 현금 영수증 번호 입력 안내
- 현금 영수증 입력은 숫자만 입력하도록 안내
Copy link

@sjoleee sjoleee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다~! 리뷰 남깁니다.

Comment on lines +19 to +66
const onSubmit: SubmitHandler<FormValues> = (data) => {
const { number, message } = data;

// 카드 메시지가 100자를 초과할 경우 경고 표시
if (message && message.length > 100) {
alert('카드 메시지는 100자 이내로 입력해 주세요!');
return;
}

// 현금 영수증 신청을 한 경우 (체크 박스 활성화 상태)
if (check) {
if (number && message) {
if (isNaN(Number(number))) {
alert('현금 영수증 전화번호는 숫자만 입력 가능합니다!');
} else {
alert('주문이 완료되었습니다.');
}
} else if (!message) {
alert('선물과 함께 보낼 카드 메시지를 작성해 주세요!');
} else if (!number) {
alert('현금 영수증에 필요한 전화번호를 입력해주세요!');
}
}

// 현금 영수증 신청을 하지 않은 경우 (체크 박스 비활성화 상태)
else {
if (message) {
alert('주문이 완료되었습니다.');
} else if (!message) {
alert('선물과 함께 보낼 카드 메시지를 작성해 주세요!');
}
}
};

return (
<Wrapper>
<Grid
templateColumns={{ base: '1fr', md: '2fr 1fr' }}
gap={6}
maxWidth={1200}
mx="auto"
p={4}
>
<GridItem>
<VStack align="start" spacing={10}>
<Box>
<Text fontSize="2xl" fontWeight="bold">나에게 주는 선물</Text>
<form onSubmit={handleSubmit(onSubmit)}>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

handleSubmit의 첫번째 인자는 validation 성공시 동작하는 콜백입니다. 유효하지 않은 값일 경우에 필요한 동작은 두번째 인자로 넘겨주면 어떨까요~?
공식 문서를 한 번 확인해보세요!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그리고 현재 form의 범위가 잘못되어 정상적으로 validation이 동작하지 않네요. submit이 되고있는지 확인해 보실래요?

<Input
backgroundColor="gray.100"
placeholder="선물과 함께 보낼 메시지를 적어보세요"
{...register('message')}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메시지의 유효성 검사는 왜 작성하지 않으셨나요??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants