inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 리액트 A-Z[19버전 반영]

Uncaught TypeError: Cannot read properties of undefined (reading 'map') 에러

5429

박정훈

작성한 질문수 1

2

import React, {useState} from "react";
import "./App.css";

export default function App () {


  const [todoData, setTodoData] = useState([
    {
      id:"1",
      title:"공부하기",
      completed: false,
    },
    {
      id:"2",
      title:"청소하기",
      completed: false,
    }
  ]);
  const [Value,setValue] = useState(""); // 첫번째 인수는 변수 두번재 인수는 state를 정하는 변수
  
  const btnStyle ={
    color: "#fff",
    border: "none",
    padding: "5px 9px",
    borderRadius: "50%",
    cursor: "pointer",
    float:"right",
  };
  
  const getStyle = (completed) => {
      return{
        padding:"10px",
        borderBottom:"1px #ccc dotted",
        textDecoration: completed ? 'line-through' : "none",
      };
  };

  const handleClick = (id) =>{
    let newTodoData = todoData.filter(data => data.id !== id)
    console.log("newTodoData",newTodoData)
    setTodoData(newTodoData);

  };

  const handleChange = (event) => {
      console.log("event",event.target.Value)
      setTodoData(event.target.Value);
  };

  const handleSubmit = (event) =>{  
    console.log("event",event)
    event.preventDefault(); // reload를 막아줌

    // 새로운 할일 데이터
    let newTodo ={  
      id: Date.now(),
      title : Value,
      completed: false,
    };
    
    // 원래 있던 할 일에 새로운 할일을 더해주기
    setTodoData(prev => [...prev,newTodo]);
    setValue("");
  };

  const handleCompleteChange = (id) => {
      console.log("todoData",todoData)
      let newTodoData = todoData.map((data) =>{
        if(data.id === id){
          data.completed = !data.completed;
        }
        return  data;
      });
      setTodoData(newTodoData)
  };

  
    return (
    <div className="container"> 
      <div className="todoBlock">
        <div className="title">
            <h1>할일 목록</h1> 
        </div>
      
        {todoData.map((data) => (
        <div style={getStyle(data.completed)} key={data.id}>
          <input type="checkbox" defaultChecked={false} onChange={() => handleCompleteChange(data.id)}/>
          {data.title}
          <button style={btnStyle} onClick={() => handleClick(data.id)}>x</button>
        </div>
        ))}

        <form style={{display:'flex'}} onSubmit={handleSubmit}>
          <input 
          type="text" 
          name="value" 
          style={{flex:'10', pedding:'50'}}
          placeholder="해야 할 일을 입력하세요."
          value={Value}
          onChange={handleChange}/>
          
          <input
          type="submit"
          value="입력"
          className="btn"
          style={{flex:'1'}}
          />
        </form>
      </div>
    </div>
    );
  
}

아래 코드에서 form에 어떠한 글자를 입력하면 Console 창에 왜 Uncaught TypeError: Cannot read properties of undefined (reading 'map')

에러가 발생하는지 도저히 모르겠습니다.

혹시 아시는분 답변 부탁드립니다.

감사합니다.

Next.js redux tdd react typescript

답변 1

2

John Ahn

안녕하세요

todoData?. map( 이런 식으로 물음표를 추가해서 해보시겠어요?

물음표에 뜻을 todoData && todoData.map

이것과 같습니다. todoData가 있을 때만 뒤에 로직을 수행한다는 것입니다.

아마 현재 todoData가 없는데 뒤에 저 부분을 렌더링 하려고 해서 그럽니다.

원래 1. 렌더링하고 2. useEffect가 실행되고 데이터를 가져오고 3. 가져온 데이터를 이용해서 다시 렌더링 합니다. 그러니 1번에서 현재 에러가 난 상태입니다.

감사합니다.

강의 소스 코드 압축 풀기 오류

0

71

1

런타임 에러 ㅠㅠ

0

85

1

강의대로 따라갔는데 에러보다 api키로 들어간 넷플릭스? 그런게 렌더링 되지 않습니다 ㅠ

0

101

1

안녕하세요 개발과 상관없는 질문입니다만

0

111

1

리액트 라우터 관련

0

101

1

react-beatiful-dnd에서 문제가 발생합니다.

0

103

1

react19에서는 react-beautiful-dnd가 설치되지 않습니다.

0

810

1

useEffect로 사용을 해도 되나요?

0

198

1

넷플릭스 오리지널 제외하고 슬라이드가 동작을 안합니다.

0

195

1

react 19의 useActionState가 더이상 isPending은 지원하지 않는 듯합니다

0

279

2

리액트 dockderfile 작성 시 COPY 질문

0

145

1

next.js에서부터는 react query 필요없는지

0

320

1

기능

0

195

1

오류가 안보여요

0

193

1

CSS

0

217

1

local storage

0

209

1

list컴포넌트 생성하기

0

223

1

검색어 입력 후 초기화하는 방법 궁금합니다!

0

331

1

Banner.css에 대해서

0

446

1

플러그인이 추천을 안해줍니다

0

321

1

마이너스버튼 테스트

0

279

2

리액트 서버 실행 오류

0

1156

2

오류메세지는 확인했는데 어떻게 고쳐야 할지 모르겠습니다 ㅠ

0

298

1

creactStore질문이요

1

284

2