LoginSignup
0
0

More than 1 year has passed since last update.

【React】 n秒後に処理を実行する

Last updated at Posted at 2022-10-08

はじめに

まだまだ不完全なコードですので、参考にはならないと思います。
「こうしたらできる」などのコメントお待ちしています。
よろしくお願いいたします。

コメントにて
@honey32 さんからわかりやすい説明付きでコードを頂いていますので、
困っている方はそちらを参考にしてください!

やりたいこと

ダイアログに入力した文字を画面に表示したい。
最後に入力してから2秒後にダイアログを閉じ、その時点の文字列を画面に表示したい。

課題

・画面に文字列が表示されない
・想定している秒数で画面が閉じない

コード

App.tsx
import * as React from 'react';
import Button from '@mui/material/Button';
import DialogTitle from '@mui/material/DialogTitle';
import Dialog from '@mui/material/Dialog';
import Typography from '@mui/material/Typography';
import { DialogContent, TextField } from '@mui/material';
import { useState } from 'react';

export interface SimpleDialogProps {
  open: boolean;
  value: string;
  onClose: (value: string) => void;
}

function SimpleDialog(props: SimpleDialogProps) {
  const { onClose, value, open } = props
  const [input, setInput] = useState<string>('')
  let count: number = 0

  const handleClose = () => {
    onClose(value);
  };

  const timer = () => {
    const countUp = () => {
      count++
    }
    const intervalId = setInterval(() => {
      countUp()
      if (count > 2) {
        clearInterval(intervalId)
        setTimeout(() => {
          setInput(props.value)
          console.log('input:' + input)
          handleClose()
        }, 100)
      }
    }, 1000)

  }
  const getInput = (e: any) => {
    setInput(prev => prev + e.key)
    timer()
  }

  return (
    <Dialog onClose={handleClose} open={open}>
      <DialogTitle>Input here</DialogTitle>
      <DialogContent>
        <TextField
          value={input}
          onKeyDown={getInput}
        />
      </DialogContent>
    </Dialog>
  );
}

export default function SimpleDialogDemo() {
  const [open, setOpen] = useState<boolean>(false)
  const [value, setValue] = useState<string>('')

  const handleClickOpen = () => {
    setOpen(true)
  }

  const handleClose = (value: string) => {
    setOpen(false)
  }

  return (
    <div>
      <Typography>inputValue:{value}</Typography>
      <Button variant="outlined" onClick={handleClickOpen}>
        Open Dialog
      </Button>
      <SimpleDialog
        value={value}
        open={open}
        onClose={handleClose}
      />
    </div>
  );
}
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0