[TIL] 22.01.14

10603 ワード

序文
チームプロジェクトを行っていて、タイマーを作っています.サーバはまだ作成されていないのでnextjsの/pages/apiフォルダでmock apiで操作しました.
タイマーロジックの作成が難しく、幸い参考になったのでcustom hookで少し修正しました.残りの時間値を1秒ごとにサーバに伝えたいので、PUTで送信を続ける形で作業します.
予測タスク
  • セッション作成ページ
  • タイマーを作成
  • タイマ機能の作成
  • スタート
  • タワー
  • 更新
  • mock apiにバインド
  • mock apiデータ
  • を作成する

  • 404ページ
  • エラーページ
  • 操作
  • タイマ提供情報のmock api
    ローカル実行時
    GET - http://localhost:3000/api/timer
    PUT - http://localhost:3000/api/timer body: {remainingTime: number}
  • ソースコード
  •         // src/pages/api/timer
            
            // 기본 타이머 정보 값
            interface Timer {
                id: string
                start: boolean
                duration: number
                remainingTime: number
                level: number
            }
            
            export default function handler(
                req: NextApiRequest,
                res: NextApiResponse<Timer>
            ) {
            		// 1초마다 타이머 정보값 수정 확인
                if (req.method === 'PUT') {
                    const newData = {
                        ...data,
                        remainingTime: JSON.parse(req.body.remainingTime),
                    }
                    res.status(200).json(newData)
                } else {
                    res.status(200).json(data)
                }
            }
            ```
            
        
    - timer 계산 hooks
    ```tsx
        // ## 사용예시
        // ## 실제구현 src/hooks/useTimer 참고
        
        // 인자 duration: 지속 시간, onEnd: 타이머 종료 후 callback 함수
        /*
        	- minutes 남은 시간에서 분 부분
        	- seconds 남은 시간에서 초 부분
        	- remainingTime 남은 시간 밀리세컨드 단위
        	- start 타이머 시작 함수
        	- stop 타이머 스탑 함수
        	- reset 타이머 재시작 함수
        */
        
        {...}
        const { minutes, seconds, start, stop, reset, isRunning, remainingTime } =
                useTimer({
                    duration: data?.data?.duration,
                    onEnd: () => {},})
        
         
        const putRemainTime = async (time) => {
                await axios.put(
                    'http://localhost:3000/api/timer',
                    {
                        remainingTime: Math.floor(time),
                    },
                    { withCredentials: true }
                )
            }
        
        // * useEffect를 통해서 서버에 1초마다 바뀐 값을 던져줌
        useEffect(() => {
                let timer
                if (isRunning) {
                    timer = setTimeout(() => putRemainTime(remainingTime / 100))
                }
                if (!isRunning) {
                    clearTimeout(timer)
                }
                return () => clearTimeout(timer)
            }, [isRunning, seconds])
  • 404、エラーページ
    基本セットボックス後期の個人動作も作業前の作業シーンを描き、作業終了後に文字で整理して大満足です.これからもこのようなやり方で仕事を続けていくと、残りがたくさんあります.
  • これとは異なり、チームプロジェクトを行い、コミュニケーションの重要性を真剣に学んでいる.残り時間よりもやることが多く、整理されていないところも多いので焦っています.