• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 useEffect2 input alert 띄우기 과제 관련 질문드립니다.

useEffect2 input alert 띄우기 과제 관련 질문드립니다.

  • 이 주제에는 1개 답변, 2명 참여가 있으며 codingapple3 년 전에 전에 마지막으로 업데이트했습니다.
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 글쓴이
  • #40730

    한지수
    참가자
    안녕하세요. 선생님의 자바스크립트 강의에 이어 리액트도 감사히 잘 듣고 있습니다.
    useEffect2 강의에서 input에 숫자 이외 문자 입력 시 alert로 안내창 띄우는 과제 관련하여 질문드립니다.
    먼저 제가 작성한 Detail 코드입니다.
    function Detail(props) {
      const [count, setCount] = useState(0);
      const [event, setEvent] = useState(true);
      const [message, setMessage] = useState("");
      const { id } = useParams();
      const products = props.shoeInfo.find((shoes) => {
        return shoes.id == id;
      });
      useEffect(() => {
        if (Number.isNaN(message) === false) {
          alert("숫자 적으세요");
        }
      }, [message]);
      useEffect(() => {
        const timer = setTimeout(() => {
          setEvent(false);
        }, 2000);
        return () => {
          clearTimeout(timer);
        };
      });
    return (
        <>
          <div className="container" key={products.id}>
            {event === true ? (
              <div className="alert alert-warning">2초이내 구매시 할인</div>
            ) : null}
            {count}
            <button
              onClick={() => {
                setCount(count + 1);
              }}
            >
              버튼
            </button>
            <div className="row">
              <div className="col-md-6">
                
              </div>
              <div className="col-md-6">
                <input
                  onChange={(e) => {
                    setMessage(e.target.value);
                  }}
                />
                <h4 className="pt-5">{products.title}</h4>
                <p>{products.content}</p>
                <p>{products.price}</p>
                <button className="btn btn-danger">주문하기</button>
              </div>
            </div>
          </div>
        </>
      );
    }
    export { Detail };
    
    
    질문 1) useEffect부분에 isNaN(message)는 잘되고 Number.isNaN(message)는 안되는 이유가 궁금합니다.
    처음에 답안 보기 전에는 useEffect부분에 Number.isNaN(message)를 썼는데 계속 alert 창이 안 떠서 결국 답을 보고 말았습니다.
    
    혼자 생각해본 바로는 input의 입력값이 다 문자열이기 때문에 아예 Number.isNaN()은 Number만 다루기 때문에 애초부터 조건에 맞지 않아서 아무것도 동작하지 않는거라고 생각했습니다.
    
    제가 생각한 것이 맞는지, 만약 아니라면 정확한 이유를 알고 싶습니다.
    
    
    질문 2) 정규식으로 useEffect부분을 적을 경우 새로고침 할 때마다 페이지 로딩이 다 되기도 전에 alert창이 먼저 뜹니다. 이걸 해결할 방법을 알고 싶습니다.
    useEffect와 input부분만 가져온 저의 Detail 코드입니다.
    function Detail(props) {
      {/*---생략---*/}
      useEffect(
          () => {
            if (/^[0-9]+$/.test(message) === false) {
              alert("숫자 적으세요");
            }
          }, [message]);
    {/*---생략---*/}
      return(
        {/*---생략---*/}
        <input onChange={(e) => {
            setMessage(e.target.value);
          }}/>
      )
        {/*---생략---*/}
    }
    이렇게 코드를 쓰면 로딩이 다 되기도 전에 alert창이 제일 맨 처음으로 뜨는 현상이 발생합니다. 
    alert창이 처음에 안 뜨도록 하는 방법을 알고 싶습니다.
    
    #40750

    codingapple
    키 마스터
    isNaN이랑 Number.isNaN이랑 다른함수라서 그런듯요 
    useEffect는 원래 로드시 실행되어서 그냥 onChange 안에 적어놔도 됩니다
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠