inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

부트캠프에서 알려주지 않는 것들 (리액트) 1편

마지막 onSubmit 에러체크 문제

해결된 질문

415

구스타프

작성한 질문수 3

1

<InfoContext.Provider value={{ value: info, setValue: setInfo, error, setError: (e) => setError({...error, ...e}) }}>
      <Form onSubmit={onSubmit}>
        <TextField
          source="name"
          label="이름"
          validate={[minLength(3), maxLength(6)]}
        />
        <TextField
          source="password"
          label="패스워드"
          validate={[minLength(6), maxLength(12)]}
        />
        <CheckboxField
          source="confirm"
          label="위 내용이 제출됩니다 동의하십니까?"
          validate={[checked]}
        />
      </Form>
    </InfoContext.Provider>

위 코드에서 setError update해주는 로직을

// before
setError: (e) => setError({...error, ...e})

// after
setError: (e) => setError(prev => ({...prev, ...e}))

아래와 같은 형식으로 바꿔주면, 리팩토링 이전과 같이 동작을 하게됩니다.

batch의 문제인지, 불변성의 문제인지 정확히 모르겠네요.

설명해주시면 감사감사!

react tdd React-Context jest 소프트웨어-테스트

답변 1

2

애프터캠프

안녕하세요 구스타프님!

엄청 좋은 질문을 해주셨네요! batch까지 의심하셨다니 내공이 조금 있으시군요

"batch 문제일 것이다" 라는 가설을 검증하기 위해서 상태 업데이트를 순차적으로 실행하도록 해봤는데요.

useInput.tsxuseEffect에서

setTimeout(() => setError({ [source]: err } as PartialErrorInfo), 0);

로 변경하거나

queueMicrotask(() => setError({ [source]: err } as PartialErrorInfo))

상태변경이 batch 로 동작하지 않도록 해도 말씀하신대로 submit 이 동작합니다. 따라서 batch 문제는 근본적인 문제가 아닌 것 같고..

하지만

말씀하신대로 setError에 함수를 넘겨서 previous state를 사용하면 정상 동작하게 되는데, 그 이유는

useInputuseEffect 가 각 필드 TextField, CheckboxField 에서 독립적으로 실행됩니다.

context에 넘겨주는 setError 함수 내부에선 error의 값이 모두 undefined입니다.

setError: (e) => {
// 3개의 각 필드에서 실행되는 시점에 error는 {name: undefined, password: undefined, confirm: undefined}
  setError({ ...error, ...e }); 
}

그래서 구체적으로 error 상태가 어떻게 업데이트가 되냐면

setError({ name: “최소 3자 이상 입력해주세요", password: undefined, confirm: undefined})
setError({ name: undefined, password: “최소 6자 이상 입력해주세요", confirm: “반드시 체크해주세요”})
setError({ name: undefined, password: undefined, confirm: “반드시 체크해주세요”})

이 순서대로 실행되고 마지막으로 실행된 confirm에 대한 에러만 보이게 되는 것입니다.

App.tsx의 CheckboxField 컴포넌트 위치를 Password 텍스트 필드 위로 올리고 새로고침하면 마찬가지로 Password 에러만 나타나게 됩니다.

따라서 제안해주신 방법대로 previous state 를 이용해야 위와 같은 문제가 발생하지 않을 것입니다.


아무튼 이것과 관련해서 강의 내 오류가 있는 부분은 정정하도록 하겠습니다!

감사의 의미로 제 메일 주소로 morishjs@gmail.com 연락처 남겨주시면 감사의 선물을 보내드리겠습니다 🙇‍♀️

0

구스타프

아 `독립적으로 실행` ... 맞네요!

답변 감사합니다! 😊

슬라이드 오타

0

3

0

전체적인 개발에 대해 문의드립니다.

1

20

1

챌린지 시작일 문의

0

19

0

줄바꿈 시 \ 필수인가요?

0

24

2

2605 이후 최신 클로드코드 강의 추가 부탁드립니다.

0

22

2

커리큘럼 문서 제공받을 수 있을까요?

0

23

1

ThemeProvider를 이용해서 NextThemeProvider를 따로 생성하여 Layout.tsx에 적용하는 이유는 뭘까요?

0

14

1

mission 09-01 을 수행할 수 없어요

0

23

1

outputStyle 설정하는데 어디서 문제일까요?

0

28

3

test.txt파일 삭제시 rm명령어이니 클로드의 질문이 있어야 한다고 하셨는데

0

21

2

검은화면

0

29

3

강의교환링크안열려요.....

0

27

2

영상재생에러 [확인부탁드려요!!!]

0

26

2

클로드 채팅에서 코드로 넘어가기

0

40

2

Context API vs Zustand 그리고 Auth

0

38

2

110강부터 따라가기가 힘듭니다...

0

57

2

강의 마지막이 잘려있는것 같습니다

0

95

2

전부 입력된 코드들만 있는건가요? 따라치면서 하고싶은데...

1

307

1

코드 샌드박스 안되는거같습니다

1

316

1

공유소스 실행시 에러 문의 드립니다~

1

442

1

[섹션 3. Form 컴포넌트로 배우는 실전 기술] 강좌의 소스를 부탁드립니다.

0

314

1

코드샌드박스 주소

1

518

1

test 코드 작성시 질문

0

482

1

TDD - Green, Red, Refactor

1

690

2