setTries를 하면 Cannot read properties of undefined (reading 'length') 에러가 뜹니다.
안녕하세요 제로초님. 항상 좋은 강의 감사드립니다.
유튜브로 강의 듣다가 3-8강에서 질문을 하기 위해 인프런 수강신청하여 질문 남깁니다. (유튜브는 질문댓글이 삭제되더라구요)
코드를 아래와 같이 작성하였는데, 리액트가 tries.length를 인식하지 못하는 현상이 발생합니다. tries 자체는 useState로 초기화해주었는데 tries.length의 length를 인식하지 못하는 이유가 무엇인가요? 문제 원인을 찾기 위해 setTries를 onChangeInput에 넣었을 때, 타이핑하자마자 바로 에러가 뜨는 걸로 봐선 tries를 setState할 때 에러가 발생하는 것 같은데 명확한 에러원인을 잘 모르겠습니다.
코드는 아래와 같습니다.
https://github.com/kth990303/TH-s-Web/issues/1
https://github.com/kth990303/TH-s-Web/tree/master/react-webgame/baseball
import React,{useState} from 'react';
import Try from './Try'
const getNumbers=()=>{
const candidate=[1,2,3,4,5,6,7,8,9], ans=[];
for(let i=0;i<4;i++){
const chosen=candidate.splice(Math.floor(Math.random()*(9-i)), 1)[0];
ans.push(chosen);
}
return ans;
}
const NumberBaseball=()=>{
const [result, setResult]=useState('');
const [value, setValue]=useState('');
const [answer, setAnswer]=useState(getNumbers());
const [tries, setTries]=useState([]);
const onSubmitForm=(e)=>{
e.preventDefault();
if(value===answer.join('')){
setResult('홈런!');
setTries((prevTries)=>{
[...prevTries, {try:value, result:'홈런!'}]
})
}
else{
const answerArray=value.split('').map((v)=>parseInt(v));
let strike=0, ball=0;
if(tries.length>=9){
setResult(`10번 넘게 틀려서 실패! 답은 ${answer.join(',')}였습니다!`);
alert('게임을 다시 시작합니다.');
setValue('');
setAnswer(getNumbers());
setTries([]);
} else{
for(let i=0;i<4;i++){
if(answerArray[i]===answer[i]){
strike++;
} else if(answer.includes(answerArray[i])){
ball++;
}
}
setTries((prevTries)=>{
[...prevTries, {try: value, result:`${strike}스트라이크 ${ball}볼입니다.`}]
})
setValue('');
}
}
}
const onChangeInput=(e)=>{
console.log(tries.length);
setValue(e.target.value);
}
return(
<>
<h1>{result}</h1>
<form onSubmit={onSubmitForm}>
<input maxLength={4} value={value} onChange={onChangeInput} />
<button>입력!</button>
</form>
<div>시도: {tries.length}</div>
<ul>
{tries.map((v,i)=>{
return(
<Try key={`${i+1}차 시도: ${v.try}`} tryInfo={v} />
);
})}
</ul>
</>
)
}
export default NumberBaseball;
감사합니다!
답변 1
1
setTries((prev) => (
[...]
))
입니다.
( 대신 { 로 하셨습니다. (로 해야 return이 됩니다.
npm run dev 실행 시 포트가 안뜨는 문제
0
203
2
timeouts.current를 useEffect 의 input값으로 넣었을때
0
87
2
렌더링 테스트 코드 (Hooks)
0
80
1
Cannot find package 'react-refesh' 이런 에러 뜨시는 분들 보세요.
0
149
1
해당 에러 뜨는 분들 보세요. "Uncaught TypeError: ReactDom.createRoot is not a function"
1
191
1
강사님 레포지토리에서 코드 복사 시 master 브랜치 말고 react18 브랜치꺼 복붙하세요ㅠㅠ
0
95
1
useMemo와 useCallback 사용 시기
0
207
2
onRightClickTd가 작동을 하지 않습니다.
0
226
1
action.type 불러오는 방식
0
222
2
onClickRedo 질문
0
172
1
const Try = require(./Try) 빨간줄
0
248
1
npx webpack 실행시
0
313
1
지뢰찾기 강좌에서 빈칸들 한번에 열기 파트에서 여쭤보고싶은부분이 있어서 글 올립니다.
0
235
1
강좌에서 다루지 않은 기능들은 어떻게 학습하면 좋을까요?
0
311
1
react devtool이 enable 않됩니다.
0
531
2
React 랜더링이 되지 않습니다.
0
411
2
비동기로 동작하는 setState에 대해서
0
331
1
npm run dev 할 때 에러발생
0
478
2
memo, PureComponenet, shouldComponentUpdate 관련 질문
0
206
1
devMiddleware의 필요성
0
352
1
리액트에서 화살표 함수를 사용해야하는 이유
0
935
2
path.join관련질문
0
282
2
2-9. 웹팩 데브 서버와 핫 리로딩 설치과정 시 에러
0
374
1
next.js 에서 이와 비슷한 예제를 돌리고있는데 react랑 달라서 질문 드립니
1
491
4





