responsecheck : hooks
This commit is contained in:
@@ -43,12 +43,20 @@ class ResponseCheck extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
onReset = () => {
|
||||
this.setState({
|
||||
result: [],
|
||||
})
|
||||
}
|
||||
|
||||
renderAverage = () => {
|
||||
const { result } = this.state;
|
||||
return result.length === 0
|
||||
? null
|
||||
: <div>평균 시간: {this.state.result.reduce((a, c) => a + c) / this.state.result.length}ms</div>
|
||||
|
||||
: <>
|
||||
<div>평균 시간: {this.state.result.reduce((a, c) => a + c) / this.state.result.length}ms</div>
|
||||
<button onClick={this.onReset}>리셋</button>
|
||||
</>
|
||||
}
|
||||
|
||||
render() {
|
||||
|
||||
61
react_webgame/main/ResponseCheck.jsx
Normal file
61
react_webgame/main/ResponseCheck.jsx
Normal file
@@ -0,0 +1,61 @@
|
||||
import React, { useState, useRef } from 'react';
|
||||
|
||||
const ResponseCheck = () => {
|
||||
const [state, setstate] = useState('waiting');
|
||||
const [message, setmessage] = useState('클릭해서 시작하세요');
|
||||
const [result, setresult] = useState([]);
|
||||
const timeout = useRef(null);
|
||||
const startTime = useRef();
|
||||
const endTime = useRef();
|
||||
|
||||
const onClickScreen = () => {
|
||||
if( state === 'waiting') {
|
||||
setstate('ready');
|
||||
setmessage('초록색이 되면 클릭하세요.');
|
||||
timeout.current = setTimeout(() => {
|
||||
setstate('now');
|
||||
setmessage('지금 클릭');
|
||||
startTime.current = new Date();
|
||||
}, Math.floor(Math.random() * 1000) + 2000); //2~3초 랜덤
|
||||
} else if (state === 'ready') {
|
||||
clearTimeout(timeout.current)
|
||||
setstate('waiting');
|
||||
setmessage('너무 성급하시군요! 초록색이 된 후에 클릭하세요');
|
||||
} else if (state === 'now') { // 반응속도 체크
|
||||
endTime.current = new Date();
|
||||
setstate('waiting')
|
||||
setmessage('클릭해서 시작하세요')
|
||||
setresult((prevResult) => {
|
||||
return [...prevResult, endTime.current - startTime.current];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const onReset = () => {
|
||||
setresult([]);
|
||||
}
|
||||
|
||||
const renderAverage = () => {
|
||||
return result.length === 0
|
||||
? null
|
||||
: <>
|
||||
<div>평균 시간: {result.reduce((a, c) => a + c) / result.length}ms</div>
|
||||
<button onClick={onReset}>리셋</button>
|
||||
</>
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
id="screen"
|
||||
className={state}
|
||||
onClick={onClickScreen}
|
||||
>
|
||||
{message}
|
||||
</div>
|
||||
{renderAverage()}
|
||||
|
||||
</>
|
||||
)
|
||||
}
|
||||
export default ResponseCheck;
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import ReactDom from 'react-dom';
|
||||
|
||||
import ResponseCheck from './ResponseCheck-class';
|
||||
import ResponseCheck from './ResponseCheck';
|
||||
|
||||
|
||||
ReactDom.render(<ResponseCheck />, document.querySelector('#root'));
|
||||
@@ -1,7 +1,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>숫자야구</title>
|
||||
<title>반응속도체크</title>
|
||||
<style>
|
||||
#screen {
|
||||
width: 300px;
|
||||
|
||||
Reference in New Issue
Block a user