App_test.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import logo from './logo.svg';
  2. import './App.css';
  3. import React, { useEffect, useState } from 'react';
  4. // TimerContainer
  5. const SecondsTimer = ({ seconds }) => <h2>{seconds}</h2>
  6. const TimerContainer = ({ seconds, refresh, render }) => {
  7. const [count, setCount] = useState(seconds) // отслеживаем состояние количества секунд
  8. const [isRunning, setIsRunning] = useState(false) // отслеживаем состояние кнопки стоп/старт для таймера
  9. const Render = render
  10. console.log('count ', count)
  11. useEffect(() => { // эффект, отвечающий за то, когда счетчик прошле в 0, он его переводит в состояние паузы
  12. if (count <= 0) {
  13. setIsRunning(false)
  14. }
  15. }, [count <= 0])
  16. useEffect(() => { // сам счетчик
  17. if (isRunning) {
  18. const start = performance.now()
  19. const int = setInterval(() => {
  20. const diff = Math.floor((performance.now() - start) / refresh)
  21. setCount(count => count - diff)
  22. }, refresh)
  23. return () => clearInterval(int)
  24. }
  25. })
  26. return (
  27. <div>
  28. <h2>TimerContainer</h2>
  29. <Render seconds={count} />
  30. <button onClick={() => setIsRunning(!isRunning)}>{isRunning ? 'Pause' : 'Start'}</button>
  31. </div >
  32. )
  33. }
  34. // TimerControl
  35. const TimerControl = () => {
  36. const [hours, setHours] = useState('')
  37. const [minutes, setMinutes] = useState('')
  38. const [seconds, setSeconds] = useState('')
  39. // const [count, setCount] = useState()
  40. // const [isRunning, setIsRunning] = useState(false)
  41. // переводим время в секунды
  42. const ms = +hours * 60 * 60 + +minutes * 60 + +seconds
  43. // useEffect(() => setCount(ms), [ms])
  44. // функция-перевод секунд в нормальный вид
  45. // function timerFormat(time) {
  46. // const h = Math.floor(time / 60 / 60)
  47. // const m = Math.floor(time / 60) - (h * 60)
  48. // const s = time % 60
  49. // const defaultZero = (param) => (param > 9) ? param : '0' + param
  50. // return `${defaultZero(h)} : ${defaultZero(m)} : ${defaultZero(s)}`
  51. // }
  52. // // таймер
  53. // useEffect(() => {
  54. // if (isRunning) {
  55. // const int = setInterval(() => {
  56. // setCount(count => {
  57. // if (count <= 0) {
  58. // setIsRunning(false)
  59. // return 0
  60. // }
  61. // return count - 1
  62. // })
  63. // }, 1000)
  64. // return () => clearInterval(int)
  65. // }
  66. // }, [isRunning])
  67. return (
  68. <div>
  69. <h2>TimerControl</h2>
  70. {/* {timerFormat(count)} */}
  71. <TimerContainer seconds={ms} refresh={100} render={SecondsTimer} />
  72. <br />
  73. <input type='number' min='0' max='23' placeholder='00' onChange={e => setHours(e.target.value)}></input>
  74. <input type='number' min='0' max='59' placeholder='00' onChange={e => setMinutes(e.target.value)}></input>
  75. <input type='number' min='0' max='59' placeholder='00' onChange={e => setSeconds(e.target.value)}></input>
  76. <br />
  77. <button onClick={() => { setIsRunning(!isRunning) }}>{isRunning ? 'Pause' : 'Start'}</button>
  78. </div >
  79. )
  80. }
  81. function App() {
  82. return (
  83. <div className="App">
  84. <header>
  85. {/* TimerControl */}
  86. <TimerControl />
  87. </header>
  88. </div>
  89. );
  90. }
  91. export default App;