inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Hướng dẫn hoàn chỉnh về phát triển dịch vụ web Python/Django với React

Tạo biểu mẫu đăng ký thành viên bằng các tính năng cơ bản của React

useEffect에서 변수 업데이트 관련 질문

Đã giải quyết

379

jay2022

15 câu hỏi đã được viết

0

안녕하세요.

본 강의에서 보여주신 회원가입 버튼 비활성화 로직은 다음과 같습니다.

  useEffect(() => {
    const isEnabled = Object.values(inputs).every((s) => s.length > 0);
    setFormDisabled(!isEnabled);
  }, [inputs]);

위의 코드로 실행하면 username과 password를 모두 입력하면 회원가입 버튼이 활성화되고 하나라도 지우면 다시 비활성화 됩니다.

 

  useEffect(() => {
    if (inputs.username && inputs.password) {
      setFormDisabled(false);
    }
  }, [inputs]);

그러나 조금 수정하여(이외의 부분은 모두 동일) 위와 같이 실행해보면, 본래의 코드와 마찬가지로 모두 입력되었을 때 버튼이 활성화 되지만 다시 지워도 비활성화가 되지 않습니다. 두 곳 모두 지워봐도 마찬가지입니다. console.log로 찍어보아도 false 값으로 고정된 채 바뀌지 않습니다.

useEffect가 비동기 방식이므로 formDisabled가 업데이트 되는 타이밍 문제도 고려해 보았지만, 그렇다면 본래의 코드에서도 이런 문제가 발생하여야 할 것이라고 판단했습니다.

여러모로 분석해 보았지만 이유를 알기가 어렵습니다.

react useEffect 비동기

Câu trả lời 1

0

pyhub

안녕하세요

보여주신 코드에서 setFormDisabled(true) 를 호출하는 코드가 없는 듯 보입니다. 그래서 비활성화가 안 되는 것은 아닐까요?

0

jay2022

const [formDisabled, setFormDisabled] = useState(true);

네... 말씀하신 부분은, 위와 같이 기본값이 true 이므로 input에 입력된 값을 지우면 다음에 의해

const [inputs, setInputs] = useState({ username: "", password: "" });

Signup 컴포넌트가 다시 렌더링 되면서 formDisabled 가 true로 다시 설정되는 것으로 이해하고 있습니다.

그런데 이렇게 동작을 안하는 것 같아서 질문드렸습니다.

1

pyhub

제가 질문을 명확히 이해하지 못했습니다. 재질문 주신 내용이 초기값으로 상탯값이 다시 초기화되지 않느냐라는 질문인지요?

useState(인자) 에 지정한 인자는 컴포넌트가 처음 렌더링될 때에 단 1회만 상탯값의 초기값으로 활용됩니다. 그 이후에는 재렌더링이 되더라도 상탯값은 초기값으로 초기화되지 않습니다.

formDisabled 상탯값을 변경하는 곳은 아래 코드 밖에 없는 데, setFormDisabled(true); 로 설정하는 코드가 없으니 해당 상탯값이 true 로 다시 변경되지 않은 상황입니다. else 와 setFormDisabled(true); 를 추가하는 것이 맞는 상황으로 보여집니다.

image

1

jay2022

useState의 초기값이 렌더링 될 때마다 다시 읽히는 것으로 잘못 알고 있었습니다. 말씀해주신 내용 참고하여 다음과 같이 수정하였더니 제대로 동작하였습니다.

useEffect(() => {
  
    if (inputs.username && inputs.password) {
      setFormDisabled(false);
    } else {
      setFormDisabled(true);
    }
  }, [inputs]);

감사합니다. 덕분에 답답함이 해소되었습니다.

안녕하세요.

0

45

1

[OneToOne Field Demo] get_user_model() 메서드를 활용해야 하는 이유?

0

268

1

useEffect 훅에서 else 유무에 따른 결과

0

208

1

useAxios 훅의 dependency array 설정

0

242

1

rest_framework.generics.CreateAPIView의 model 속성 유무

0

263

1

bootstrap4

0

465

4

리뉴얼 강의가 오픈이 되면 기존 강의는 더이상 못보는걸까요

1

358

1

admin form에서 앞선 필드 선택 후 다른 필드 select widget 구성하는 방법

0

569

3

useState는 필수일까요?

0

257

1

python manage.py makemigrations instagram 시 created_at default 오류가 발생합니다.

0

590

4

Django allauth를 사용한 소셜 로그인 시 에러

0

649

1

useLocalStorage() 함수 사용여부

0

224

1

django에 LOGIN_URL = '/accounts/login/'의 의미?

0

444

1

리듀서의 의미 재확인

0

424

1

simple-jwt Refresh Token 사용 노하우

0

895

2

docker compose 를 통한 배포 관련 오류 문의

0

666

1

파이썬 속도 장고 관련 궁금한게 있습니다.

0

360

1

is_like_user

0

230

1

related_name 오류

0

269

1

re_path 오류

0

255

1

re_path url

0

245

1

No post matches the given query

0

654

2

sendgrid 메일 발송이 안됩니다 ㅠㅠ

0

885

3

502 bad gateway

0

686

4