Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- NPM
- 리액트기초
- sequelize
- express-generator
- component
- 제로초예제
- NoSQL
- 시퀄라이즈
- node
- 리액트스타디
- MongoDB
- nodeJS
- 리액트
- sementicversion
- 클래스컴포넌트
- 시퀄라이즈공부
- npm명령어
- mongo
- 리액트컴포넌트
- mongoose
- React
- nodejs교과서
- React Component
Archives
- Today
- Total
개발노트
05 가위바위보 본문
import React, { useState, useRef, useEffect } from 'react';
import useInterval from './useInterval';
const RPS = () => {
const [computer, setComputer] = useState('rock');
const [user, setUser] = useState();
const [result, setResult] = useState();
const [running, setRunning] = useState(true);
//const interval = useRef();
const changeHand = () => {
setComputer(prevComputer => {
if (prevComputer === 'rock') {
return 'paper';
} else if (prevComputer === 'paper') {
return 'scissors';
} else if (prevComputer === 'scissors') {
return 'rock';
}
});
}
const logic = (computer, user) => {
if (computer === user) { return 0; }
else if (user === 'rock' && computer === 'scissors'
|| user === 'paper' && computer === 'rock'
|| user === 'scissors' && computer === 'paper') {
return 1;
} else {
return -1;
}
}
const onClickBtn = (user) => () => {
//clearInterval(interval.current);
setRunning(false);
setUser(user);
// console.log("computerVal - " + computer);
// console.log("user - " + user);
const resultNum = logic(computer, user);
if (resultNum === -1) {
setResult('졌습니다');
} else if (resultNum === 0) {
setResult('비겼습니다');
} else {
setResult('이겼습니다.');
}
// setTimeout(interval.current = setInterval(() => { changeHand() }, 1000), 2000)
setTimeout(() => { setRunning(true) }, 2000)
}
// useEffect(() => {
// interval.current = setInterval(() => { changeHand() }, 1000);
// console.log('다시실행')
// return () => { //componentWillUnmount
// console.log('종료')
// clearInterval(interval.current);
// }
// }, [])
useInterval(changeHand, running ? 1000 : null);
return (
<>
<div id="RPS">
<h3>가위바위보</h3>
<div className={`computer ${computer}`}>
</div>
<div className="btn-group">
<button onClick={onClickBtn('scissors')}>가위</button>
<button onClick={onClickBtn('rock')}>바위</button>
<button onClick={onClickBtn('paper')}>보</button>
</div>
<div>{result}</div>
</div >
</>
)
}
export default RPS;
import { useRef, useEffect } from 'react';
/*
#사용시
const [running, setRunning] = useState(true);
useInterval(()=>{
// console.log('a')
}, running ? 1000 : null )
1000이 아닌 null 입력시 뭠춤
#코드 설명
callback 부분이 실제로 실행을 할 코드 ()=>{console.log('a')}
savedCallback이라는 ref에 저장을 해둠. (ref에 저장하면 항상 최신 코드를 참조가능 - )
null이면 이전에 반환했던 ()=>{clearInterval()} 함수안의 clearInterval이 실행이 되서 뭠춤.
*/
function useInterval(callback, delay) {
const savedCallback = useRef();
useEffect(() => {
savedCallback.current = callback; //여기에 callback을 저장을 해둠
});
useEffect(() => {
function tick() {
savedCallback.current(); //callback의 (코드) 실행.
}
if (delay !== null) {
let id = setInterval(tick, delay);
return () => clearInterval(id);
}
}, [delay])
return savedCallback.current;
}
export default useInterval;
'React > webgame' 카테고리의 다른 글
08 지뢰찾기 (0) | 2024.04.20 |
---|---|
07 틱택토 (0) | 2024.04.16 |
06 로또번호뽑기 (0) | 2024.04.13 |
04 반응속도체크 코드 (0) | 2024.04.09 |
03 숫자야구 코드 (0) | 2024.04.05 |