codestates / codestates/HomeTownAlba

[21.11.01] 에러핸들링 (김지윤) - Company 마이페이지의 체크박스 데이터

Open
#42 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
0
Forks
0
PR merge metrics
No merged PRs in 30d

Description

## 문제 상황 및 에러 로그

- 이벤트 함수 내에서 setState를 사용했으나, 다음 줄에서 여전히 state가 변경되지 않음

- 이벤트 함수 내에서 또 다른 이벤트 함수를 사용했으나, 마찬가지로 변경전인 state를 사용하여 연산함

### 에러 코드

- return 문은 생략

- 수요일~일요일 정보를 담는 state와 함수는 생략

- 클릭이벤트를 통해 monHandler와 tueHandler가 먼저 실행됨
```js
export default function CompanyMyPage () {

// 체크박스에서 선택된 요일을 배열로 담기 위한 state
const [day, setDay] = useState([])

// 선택된 각 요일을 나타내는 state
const [mon, setMon] = useState([])
const [tue, setTue] = useState([])

// 각 요일의 체크 여부
const [monChecked, setMonChecked] = useState(false)
const [tueChecked, setTueChecked] = useState(false)

// 체크된 요일을 day state에 모아주는 핸들러
const dayHandler = () => {
setDay([...mon, ...tue, ...wed, ...thu, ...fri, ...sat, ...sun])
}

// 클릭을 통해 월요일 정보를 mon state 에 추가하거나 빼는 핸들러
const monHandler = () => {
setMonChecked(!monChecked)
if(monChecked) { // 위 setMonChecked가 있지만 monChecked는 아직 변경되지 않음
setMon(["월"])
} else {
setMon([])
}
dayHandler() // 위에 setMon이 있지만 아직 mon state가 변경되지 않음
}

// 클릭을 통해 화요일 정보를 tue state 에 추가하거나 빼는 핸들러
const tueHandler = () => {
setTueChecked(!tueChecked)
if(tueChecked) { // 위 settueChecked가 있지만 tueChecked는 아직 변경되지 않음
setTue(["화"])
} else {
setTue([])
}
dayHandler() // 위에 setTue이 있지만 아직 tue state가 변경되지 않음
}

return (

)
}
```

## 원인 및 해결방안

- 원인

- 실행 순서를 확인하니, monHandler 함수 내의 연산이 다 끝난 이후에 setMon을 통해 mon state가 변경됨

- monHandler 내의 이벤트 함수인 dayHandler 또한 mon state가 변경되기 전에 실행됨

- 이벤트함수 내의 setState는 해당 함수가 실행된 이후에 적용되어, 함수 내부의 연산은 setState의 영향을 받지 않음

- 해결방안

- state 변경 전이므로, if 조건문 내부의 state에 '!'를 붙여 의도된 조건문이 발동되게 하기

- 첫번째 이벤트 함수가 끝난 후에 두번째 이벤트 함수가 실행되도록, useEffect로 두 번재 이벤트 함수 실행하기

- 이 useEffect의 발동 조건은 첫번째 이벤트 함수를 통해 변경되는 state가 되어야 함

```js
export default function CompanyMyPage () {

// 체크박스에서 선택된 요일을 배열로 담기 위한 state
const [day, setDay] = useState([])

// 선택된 요일을 나타내는 state
const [mon, setMon] = useState([])
const [tue, setTue] = useState([])

// 각 요일의 체크 여부
const [monChecked, setMonChecked] = useState(false)
const [tueChecked, setTueChecked] = useState(false)

// 체크된 요일을 day state에 모아주는 핸들러
const dayHandler = () => {
setDay([...mon, ...tue, ...wed, ...thu, ...fri, ...sat, ...sun])
}

// 클릭을 통해 월요일 정보를 mon state 에 추가하거나 빼는 핸들러
const monHandler = () => {
if(!monChecked) { // setMonChecked를 통해 변경되기 전인 초기 state를 조건으로 사용
setMon(["월"])
} else {
setMon([])
}
setMonChecked(!monChecked)
}

// 클릭을 통해 화요일 정보를 tue state 에 추가하거나 빼는 핸들러
const tueHandler = () => {
if(!tueChecked) { // setTueChecked를 통해 변경되기 전인 초기 state를 조건으로 사용
setTue(["화"])
} else {
setTue([])
}
setTueChecked(!tueChecked)
}

// 요일 state가 변경 이후에 dayHandler를 실행
useEffect(() => {
dayHandler()
}, [mon, tue, wed, thu, fri, sat, sun]) // 변경된 요일 state를 실행 조건으로 설정

return (

)
}
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.