inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

setValue가 함수가 아니라는 오류 발생

645

이성현

작성한 질문수 5

0

TailwindCss 적용하기 실습 중 발생한 문제입니다.

setValue is not a function TypeError: setValue is not a function at handleChange (http://localhost:3000/static/js/bundle.js:167:5) at HTMLUnknownElement.callCallback (http://localhost:3000/static/js/bundle.js:11038:18) at Object.invokeGuardedCallbackDev (http://localhost:3000/static/js/bundle.js:11082:20) at invokeGuardedCallback (http://localhost:3000/static/js/bundle.js:11139:35) at invokeGuardedCallbackAndCatchFirstError (http://localhost:3000/static/js/bundle.js:11153:29) at executeDispatch (http://localhost:3000/static/js/bundle.js:15297:7) at processDispatchQueueItemsInOrder (http://localhost:3000/static/js/bundle.js:15323:11) at processDispatchQueue (http://localhost:3000/static/js/bundle.js:15334:9) at dispatchEventsForPlugins (http://localhost:3000/static/js/bundle.js:15343:7) at http://localhost:3000/static/js/bundle.js:15503:16

이러한 오류가 발생하였습니다.

아래는 코드입니다.

지난 시간에서 딱히 바꾼게 없는데 오류의 원인을 잘 모르겠어서 질문드립니다.

App.js

import React, {useState} from "react"; import "./App.css"; import List from "./components/List"; import Form from "./components/Form" export default function App (){ const [todoData, setTodoData] = useState([]); const [value,setValue] = useState(""); const handleSubmit = (e) =>{ e.preventDefault(); // 전송시 페이지 새로고침 방지 함수 let newTodo = { id : Date.now(), title: value, completed : false }; // 새로운 할 일 데이터의 형성 setTodoData(prev => [...prev,newTodo] ) setValue("") // 원래 할 일에 새로운 할 일 데이터의 update 해주는 setState 함수 } const btnStyle = { color: "#fff", border: "none", padding : "5px 9px", borderRadius: "50%", cursor: "pointer", float:"right" } return( <div className="container"> <div className='todoBlock'> <div className="title"> <h1>To do list</h1> </div> <h1 className='text-3xl font-bold underline'>Hello world!</h1> <List todoData= {todoData} setTodoData = {setTodoData}/> <Form handleSubmit = {handleSubmit} value ={value} setValue = {setValue}/> </div> </div> ); }

list.js

import React from 'react'

export default function List({todoData , setTodoData}) {

  const btnStyle = {
    color: "#fff",
    border: "none",
    padding : "5px 9px",
    borderRadius: "50%",
    cursor: "pointer",
    float:"right"
  } 
  const handleClick = (id) => {
    let newTodoData = todoData.filter(data => data.id !== id)
    console.log('newTodoData',newTodoData);
    setTodoData(newTodoData);
  }
  const getStyle = (completed) => {
    return {
      padding : "10px",
      borderBottom: "1px #ccc solid",
      textDecoration: completed ? 'line-through' : 'none',
    }
  }
  const handleCompleteChange = (id) => {
    let newTodoData = todoData.map(data => {
      if (data.id === id){
        data.completed = !data.completed;
      }
      return data;
    });
    setTodoData(newTodoData);
  };
  return (

    <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>
          ))}
    </div>
  )
}

form.js

import React from 'react'

export default function Form(handleSubmit,value,setValue) {
    const handleChange = (e) =>{

        setValue(e.target.value); 
      }

  return (
    <form style = {{display:"flex"}} onSubmit = {handleSubmit}>
    <input type = "text" name = "value" style = {{flex: '10', padding :'5px'}}
    placeholder = "해야 할 일을 입력하세요." value ={value}
    onChange ={handleChange}
    />

    <input type = "submit"
    value = "입력"
    className="btn"
    style ={{flex:'1'}} 
    />


  </form>
  )
}

react redux tdd typescript next.js

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

이슈를 살펴보니, handleChange 함수에서 setValue를 함수로 사용하려고 하는데, 해당 오류가 발생한 것 같습니다.

이 오류는 setValue라는 변수가 함수가 아니기 때문에 발생하는 것으로 보입니다.

에러를 해결하기 위해서는 setValue를 함수로 사용해야 합니다. 일반적으로 setValueuseState 훅을 사용할 때 반환되는 setter 함수(setTodoData)를 의미합니다.

따라서, setValuesetTodoData로 변경하여 해결할 수 있습니다.

아래는 수정된 코드입니다.

const handleChange = (e) => {
  setValue(e.target.value);
}

추가적으로 todoData 배열을 업데이트 하기 위해서는 setTodoData 함수를 사용해야 합니다. 따라서, 아래와 같이 코드를 수정해야 합니다.

const handleChange = (e) => {
  setTodoData(e.target.value);
}

수정한 후에도 문제가 계속된다면, 해당 오류가 발생하는 부분을 주석으로 표시해주시고, 추가적인 코드나 정보를 제공해주시면 더 도움을 드릴 수 있을 것 같아요.

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

0

71

1

런타임 에러 ㅠㅠ

0

86

1

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

0

102

1

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

0

111

1

리액트 라우터 관련

0

102

1

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

0

103

1

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

0

813

1

useEffect로 사용을 해도 되나요?

0

200

1

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

0

195

1

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

0

280

2

리액트 dockderfile 작성 시 COPY 질문

0

145

1

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

0

320

1

기능

0

197

1

오류가 안보여요

0

195

1

CSS

0

218

1

local storage

0

209

1

list컴포넌트 생성하기

0

224

1

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

0

331

1

Banner.css에 대해서

0

447

1

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

0

321

1

마이너스버튼 테스트

0

279

2

리액트 서버 실행 오류

0

1156

2

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

0

298

1

creactStore질문이요

1

284

2