[React.js] React에서 DOM 조작하기

2022. 5. 14. 10:39·공부/React.js
반응형

 

React 게시글은 대부분 인프런의 '한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지' 강의를 기반으로 내용을 정리했습니다.

 

React에서 DOM 조작하기

DOM을 조작해서 일기 저장 버튼을 클릭했을 때, 작성자와 일기가 정상적으로 입력되었는지 확인하고 아니라면 focus를 주는 기능을 만들어보자.

 

일단 작성자 input과 일기 본문 textarea에 한 글자도 입력되지 않거나 5글자 미만으로 입력된 경우 저장 버튼을 눌러도 저장이 되지 않는 코드를 작성하자.

    const handleSubmit =(e) => {
        if(state.author.length < 1) {
            alert("작성자는 최소 1글자 이상 입력해주세요.");
            return ;
        }

        isFinite(state.content.length < 5) {
            alert("일기 본문은 최소 5글자 입력해주세요.");
            return ;
        }
        alert("저장 성공");
    }

 

작성자가 없을 경우

 

작성자는 있는데 본문이 5글자 미만인 경우

 

그런데 요즘에는 alert을 잘 사용하지 않는다고 한다. 그래서 alert보다는 focus를 사용해 사용자가 저장 조건을 충족할 수 있도록 코드를 변경해보자. focus를 사용하려면 HTML에 있는 DOM에 접근할 수 있어야 한다. 리액트에서는 DOM 요소에 접근하기 위해 useRef라는 객체를 사용한다. 고로 import에 useRef를 추가해주면 된다.

import {useRef, useState} from "react";

const DiaryEditor = () => {

    // useRef의 MutableRefObject는 HTML의 DOM 요소에 접근할 수 있도록 하는 기능
    const authorInput = useRef();
    const contentInput = useRef();
    

    const [state, setState] = useState({
        author:"",
        content:"",
        emotion:1,
        }
    );

    const handleChangeState = (e) => {
        console.log(e.target.name);
        console.log(e.target.value);

        setState({
            ...state,
            [e.target.name]: e.target.value,
        });
    };

    const handleSubmit =(e) => {
        if(state.author.length < 1) {
            //focus
            authorInput.current.focus();
            //useRef를 이용해 생성한 객체는 현재 가리키는 값을 current로 가져올 수 있음.
            // 즉 authorInput.current는 input을 가리킨다.
            return ;
        }

        if(state.content.length < 5) {
            //focus
            contentInput.current.focus();
            return ;
        }
        alert("저장 성공");
    }

    return (
    <div className='DiaryEditor'>
        <h2>오늘의 일기</h2>
        <div>
            <input name="author" value={state.author} 
            onChange={handleChangeState}
            ref={authorInput}
            />
        </div>
        <div>
            <textarea name="content" valeu={state.content} 
            onChange={handleChangeState}
            ref={contentInput}
            />
        </div>
        <div>
        <span>오늘의 감정 점수 :  </span>
            <select name='emotion' value={state.emotion} onChange={handleChangeState}>
                <option value={1}>1</option>
                <option value={2}>2</option>
                <option value={3}>3</option>
                <option value={4}>4</option>
                <option value={5}>5</option>
            </select>
        </div>
        <div>
            <button onClick={handleSubmit}>
                일기 저장하기
            </button>
        </div>
    </div>
    );
};

export default DiaryEditor;

 

반응형

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/React.js' 카테고리의 다른 글
  • [React.js] React에서 리스트 사용하기 1 - 리스트 렌더링 (조회)
  • VSCode Prettier 자동 포맷팅 설정 방법, 설치 후 자동 정렬이 되지 않을 때
  • [React.js] React에서 사용자 입력 처리하기
  • [React.js] Props
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    egov
    자바스크립트
    기출문제
    에러해결
    백준
    IT
    방통대
    운영체제
    MSA
    프론트엔드
    JPA
    전자정부프레임워크
    프로그래머스
    스프링부트
    코딩테스트
    SpringBoot를 이용한 RESTful Web Service 개발
    Java
    SQL
    알고리즘
    QueryDSL
    인프런
    개발자
    RESTful
    Spring
    oracle
    react
    토비의스프링부트
    토이프로젝트
    넥사크로
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
[React.js] React에서 DOM 조작하기
상단으로

티스토리툴바