inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

숫자야구 Hooks로 전환하기(+useState lazy init)

input 에 값이 변경될때마다 getNumber가 호출되는게 정상인지요?

368

묽게

작성한 질문수 1

0

아무리 해봐도 현상제거가 안되는데요.
테스트 해보니깐 value이 변경되면 야구 jsx가 맨처음부터 수행되어 지는것 같습니다. 제가 놓친 부분이나 잘못 알고 있는게 있을까요?

function getNumbers(){
    const candidates = [1,2,3,4,5,6,7,8,9];
    const array=[];
    for(let i=0; i<4; i++){
        const chose = candidates.splice(Math.floor(Math.random()*(9-i)),1)[0];
        array.push(chose);
    }
    console.log('답은 : ', array.join(''));
    return array;
};

const BaseBall = ()=>{
    const [result, setResult] = useState('');
    const [value, setValue] = useState('');
    const [answer, setAnswer] = useState(getNumbers());
    const [tries, setTries] = useState([]);

    const onSubmitForm = (e)=>{
        debugger;
        e.preventDefault();
        if(value === answer.join('')){
            setResult('홈런');
            setTries((prevTries)=>{
                return [...prevTries,{try :  value, result :'홈런'}];
            })
            alert('게임을 다시 시작합니다.!')
            setValue('');
            setAnswer(getNumbers());
            setTries([]);

        }else{
            const valueArray = value.split('').map(v=>parseInt(v));
            let strike = 0;
            let ball = 0;
            if(tries.length >= 9){
                setResult(`10번 틀려서 실패! 답은  ${answer.join(',')}`);
                alert('게임을 다시 시작합니다');
                setAnswer(getNumbers());
                setValue('');
                setTries([]);
            }else{
                for(let i=0; i<4; i++){
                    if(valueArray[i] === answer[i]){
                        strike += 1;
                    }else if(answer.includes(valueArray[i])){
                        ball += 1;
                    }
                }
                setTries((prevTries)=>{
                    return [...prevTries, {try: value, result : `strkie : ${strike}, ball : ${ball}`}];
                })
                setValue('');
            }
        }
    };
    const onChangeInput = (e)=>{
        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={v+'0'+i} tryInfo={v} index={i}></Try>
                        );
                    })
                }
            </ul>
        </>
    );
   
}

react

답변 1

1

제로초(조현영)

네 getNumbers()가 매번 실행되는 게 맞습니다. 이 문제는 나중에 useMemo를 써서 해결하고요. 다만 getNumbers()가 매번 실행되어도 state에는 영향을 주지 못합니다.

npm run dev 실행 시 포트가 안뜨는 문제

0

235

2

timeouts.current를 useEffect 의 input값으로 넣었을때

0

95

2

렌더링 테스트 코드 (Hooks)

0

93

1

Cannot find package 'react-refesh' 이런 에러 뜨시는 분들 보세요.

0

164

1

해당 에러 뜨는 분들 보세요. "Uncaught TypeError: ReactDom.createRoot is not a function"

1

205

1

강사님 레포지토리에서 코드 복사 시 master 브랜치 말고 react18 브랜치꺼 복붙하세요ㅠㅠ

0

105

1

useMemo와 useCallback 사용 시기

0

218

2

onRightClickTd가 작동을 하지 않습니다.

0

233

1

action.type 불러오는 방식

0

225

2

onClickRedo 질문

0

176

1

const Try = require(./Try) 빨간줄

0

258

1

npx webpack 실행시

0

323

1

지뢰찾기 강좌에서 빈칸들 한번에 열기 파트에서 여쭤보고싶은부분이 있어서 글 올립니다.

0

241

1

강좌에서 다루지 않은 기능들은 어떻게 학습하면 좋을까요?

0

318

1

react devtool이 enable 않됩니다.

0

544

2

React 랜더링이 되지 않습니다.

0

421

2

비동기로 동작하는 setState에 대해서

0

337

1

npm run dev 할 때 에러발생

0

494

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

210

1

devMiddleware의 필요성

0

357

1

리액트에서 화살표 함수를 사용해야하는 이유

0

946

2

path.join관련질문

0

287

2

2-9. 웹팩 데브 서버와 핫 리로딩 설치과정 시 에러

0

384

1

next.js 에서 이와 비슷한 예제를 돌리고있는데 react랑 달라서 질문 드립니

1

502

4