inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

9.2) 투두리스트 업그레이드

todolist에서 useReducer를 사용할때 UPDATE에서 오류가 생깁니다

81

고민지

작성한 질문수 3

0

🚨 필독) 질문하시기 전에 꼭 읽어주세요 (10초 소요)

javascript react node.js 카카오공채-개발

답변 2

0

이정환 Winterlood

안녕하세요 고민지님 이정환입니다.

화살표 함수는 => 옆에 값을 적어주면 해당 값을 바로 반환하는 특징을 가지고 있습니다. 예를 들면 다음과 같습니다.

const arrayFunction = (a, b) => a + b;
// a + b의 값을 바로 반환함

그런데 만약 이런 화살표함수에서 함수 내부에 여러줄의 코드를 사용하고 싶다면 다음과 같이 중괄호를 사용합니다. 이때 반환하려는 값이 있다면 일반 함수 선언과 같이 return을 이용해야 합니다.

const arrayFunction = (a, b) => {
  const resValue = a + b;
  return resValue;
}
// a + b의 값을 resValue에 저장해두었다가 반환함

그런데 만약 객체값을 바로 반환하려고 하는 경우 다음과 같이 중괄호만 사용하면 함수 본문으로 이해됩니다.

const arrayFunction = (a, b) => { a:a, b:b }
// ??? 문법 오류

이럴 때에는 소괄호로 중괄호를 묶어주면 이 중괄호 내부를 객체로 인지하여 객체 값을 바로 반환하는 화살표 함수를 만들 수 있습니다.

const arrayFunction = (a, b) => ({ a:a, b:b });
// {a:a, b:b}를 반환함

질문주신 코드에서는 화살표 함수 뒤에 중괄호({)를 여신 다음 객체를 그대로 리턴하고 있기 때문에 오류가 발생하는 것 입니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 고민지님.

작성하신 코드에서 useReducerUPDATE 액션에 대한 처리가 제대로 되지 않아 발생한 문제에 대해 설명드리겠습니다. 질문에 올려주신 두 개의 이미지는 reducer 함수에서 CREATEUPDATE 액션을 다루는 부분을 보여주고 있습니다.

문제의 원인

reducer 함수의 UPDATE 케이스에서, 각각의 item을 업데이트하는 로직이 없거나 잘못된 경우 이슈가 발생할 수 있습니다. 주어진 코드에서 UPDATE 액션은 state.map 을 사용하여 각 item 을 순회하고, item.idaction.targetId 와 일치할 때 isDone 속성을 토글(toggling) 하고 있습니다.

기존의 reducer 함수 블록:

case 'UPDATE':
  return state.map((item) => {
    if (item.id === action.targetId) {
      return { ...item, isDone: !item.isDone }; // 기존 구조를 기반으로 새로운 객체를 반환
    }
    return item; // 바뀌지 않는 항목은 그대로 반환
  });

해결된 이유

주어진 코드에서 item 을 업데이트할 때 중요한 점은, 새로운 item 객체를 명시적으로 반환함으로써 React의 상태 관리에서 불변성(immutability)을 유지하는 것입니다. 이렇게 해야 React에서 상태 변경을 감지하고 적절히 리렌더링을 할 수 있습니다.

return 문을 잘못 위치해 두어, 업데이트되지 않는 항목에 대해서도 적절히 반환하지 않았다면 상태가 올바르게 업데이트되지 않아서 리렌더링이 발생하지 않았을 수 있습니다. 수정 후 코드에서 item 모든 조건에 대해 반환하게 됨으로써 상태가 제대로 갱신되어 정상적으로 작동하게 된 것입니다.

관련 내용으로 유사한 문제를 다루고 있는 다른 게시글을 참고하실 수 있습니다:
- useReducer에 대한 상태 업데이트 이슈

이 게시글들은 useReducer 와 상태 불변성에 대해 이해를 높이고, 현재 코드를 개선하는 데 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

VSCode 설정 문의

0

23

2

PPT 코드 관련 질문

0

20

2

useEffect와 lifecycle문의

0

38

2

프론트엔드 학습 수준 문의

0

51

2

리액트 챕터별 코드에서 eslint 설정파일이 없어요

0

55

2

데이터 로딩중 화면만 계속 나와요!!

0

57

2

퍼블리셔일경우 어느정도 수준까지 강의를 들어야할까요

0

86

2

이후의 커리큘럼 문의

0

104

2

실슬환경 설정에서 save후 console.log 부분이 새로고침이 안되는현상입니다.

0

54

2

최적화 관련 질문있습니다 (useMemo 등)

0

86

3

프로바이더 컴포넌트의 위치는 어떤 기준인가요?

1

82

3

Date 객체에 관련하여 질문드립니다.

0

87

2

리액트 개정판 교재 질문

0

60

2

예제코드가 안나와요!

0

79

2

select a variant 선택에서 javascript와 javascript+react compiler 중 무엇을 선택해야하나요? com

0

112

2

onMouseEnter 관련 문의 드립니다

0

94

3

배열의 렌더링 관련 질문 드립니다.

0

74

2

2:40초 refObj를 콘솔로 출력시 오류가 발생합니다.

0

115

2

TS, 리액트 강의중에 뭘 먼저 수강하는게 좋을까요?

0

140

2

useCallback 적용한 onCreate, onUpdate, onDelete 함수..

0

71

1

vs code 자동완성관련 문의

0

122

2

91강 useEffect내에서 상태변화함수 호출시 발생하는 에러

1

187

2

87강 필터 함수 질문

0

71

2

useRef, useState count 비교

0

67

2