inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

12.10) Home 페이지 구현하기 1. UI

안녕하세요 질문있습니다.

429

이현철

작성한 질문수 2

0

안녕하세요

페이지 구현 일기쓰기(new)까지 수강하고

코딩을 완료하였는데 수정완료 버튼을 누르면 수정이 되질 않는 버그와 console.log(targetDate)를 하면 콘솔에 두번 출력되는 버그가 있어서 깃 링크를 드리고 질문을 하려했으나 깃이 자꾸 오류가나서 그런데 혹시 메일로 파일을 보내드리면 그거에 대한 답변이 가능하신지 궁금하여 여쭤봅니다.

javascript node.js nodejs react

답변 1

0

이현철

일단 코드라고 전달해드리고 싶어서 오류같은거 신경안쓰고 코드박스를 붙혀드리겠습니다.

어느 부분에서 위에 말한 부분이 작동하지 않는건지 궁금합니다 ㅠ

https://codesandbox.io/s/frosty-river-nfou26?file=/public/manifest.json

0

이정환 Winterlood

안녕하세요 이정환입니다.

우선 Edit이 작동하지 않는 문제부터 설명드릴게요

현철님이 작성하신 src/App.js의 reducer 함수의 'EDIT' case는 다음과 같이 작성되어 있습니다.

const reducer = (state, action) => {
  let newState = [];
  switch (action.type) {
    ...
    case "EDIT": {
      newState = state.map((it) =>
        it.id === action.targetId ? { ...action.data } : it
      );
      break;
    }
    default:
      return state;
  }
  return newState;
};

그리고 이 'EDIT'을 호출하는 App 컴포넌트의 onEdit 함수는 다음과 같이 작성되어 있습니다.

function App () {
  ...
  const onEdit = (targetId, date, content, emotion) => {
    dispatch({
      type: "EDIT",
      data: {
        id: targetId,
        date: new Date(date).getTime(),
        content,
        emotion
      }
    });
  };
  ...
}

문제는 여기서 발생합니다. onEdit 함수에서 dispatch를 호출 할 때 인수로 전달하는 액션 객체에는 수정 대상 일기 아이템의 id를 뜻하는 targetId 프로퍼티가 없습니다. 대신 수정할 일기 id를 data.id로 담아서 전달했습니다.

그러므로 src/App.js의 reducer 함수를 다음과 같이 수정하셔야 정상적으로 작동합니다.

const reducer = (state, action) => {
  let newState = [];
  switch (action.type) {
    ...
    case "EDIT": {
      newState = state.map((it) =>
        it.id === action.data.id ? { ...action.data } : it
      );
      break;
    }
    default:
      return state;
  }
  return newState;
};

정리하면 action.targetId가 아닌 action.data.id로 작성하셔야 정상적으로 작동합니다.

 

두번째 질문 console.log(targetDate) 가 두번 호출되는 문제의 원인은 확실히 확인하기는 어렵지만 (보내주신 codeSandBox의 코드에는 이 콘솔 명령문이 없습니다 ㅠㅜ)

아마 index.js의 <React.StrictMode>를 제거하면 한번만 호출 될 것으로 예상됩니다.

src/index.js를 다음과 같이 수정해주세요

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";

const root = ReactDOM.createRoot(
  document.getElementById("root")
);
root.render(<App />);

감사합니다.

 

useEffect와 lifecycle문의

0

31

2

프론트엔드 학습 수준 문의

0

43

2

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

0

51

2

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

0

56

2

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

0

80

2

이후의 커리큘럼 문의

0

102

2

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

0

50

2

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

0

85

3

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

1

82

3

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

0

85

2

리액트 개정판 교재 질문

0

60

2

예제코드가 안나와요!

0

78

2

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

0

109

2

onMouseEnter 관련 문의 드립니다

0

93

3

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

0

73

2

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

0

113

2

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

0

137

2

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

0

71

1

vs code 자동완성관련 문의

0

113

2

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

1

181

2

87강 필터 함수 질문

0

69

2

useRef, useState count 비교

0

67

2

안된다고했던 이유가 무엇이었는지 모르겠습니다

0

91

2

85강에서 객체를 왜 클래스로 만들어서 new 하지 않는건지 궁금합니다.

0

76

2