-
리액트 - React에서 DOM 조작하기리액트 2023. 1. 28. 17:22728x90
useRef
React에서 DOM 조작하기
- 일기 저장 버튼을 클릭했을 때 작성자와 일기가 정상적으로 입력되었는지 확인하고 아니라면 focus하기
import {useState} from "react"; const DiaryEditor = () => { const[state,setState]=useState({author:"",content:"",emotion:1,}) const handleChangeState = (e)=>{ setState({ ...state, [e.target.name]:e.target.value, }) }; const handleSubmit = () =>{ if(state.author.length<1){ alert("최소 한글자 이상 입력해주세요."); return; } if(state.content.lengh<5){ alert("최소 다섯글자 이상 입력해주세요.") return; } console.log(state); alert("저장 성공"); }; return( <div className="DiaryEditor"> <h2>오늘의 일기</h2> <div> <input name="author" value={state.author} onChange={handleChangeState} /> </div> <div> <textarea name="content" value={state.content} onChange={handleChangeState} /> </div> <div> <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;if문 작성하고 return 작성한 이유는 더 이상 진행되는 것(다음 스탭)을 막기 위해서임
근데 alert으로 알려주는 것보다 focus를 주는 방식이 더 트랜디하다.
import React, { useRef,useState} from "react"; const DiaryEditor = () => { const authorInput = useRef(); const contentInput = useRef(); const[state,setState]=useState({author:"",content:"",emotion:1,}) const handleChangeState = (e)=>{ setState({ ...state, [e.target.name]:e.target.value, }) }; const handleSubmit = () =>{ if(state.author.length<1){ authorInput.current.focus(); alert("최소 한글자 이상 입력해주세요."); return; } if(state.content.lengh<5){ contentInput.current.focus(); return; } alert("저장 성공"); }; return( <div className="DiaryEditor"> <h2>오늘의 일기</h2> <div> <input ref={authorInput} name="author" value={state.author} onChange={handleChangeState} /> </div> <div> <textarea name="content" value={state.content} onChange={handleChangeState} /> </div> <div> <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;포커스를 줘야할 부분은 input과 textarea부분에 주어야한다.
→ DOM요소를 선택할 수 있는 기능(useRef)
const authorInput = useRef(); 를 작성해 const authorInput에 담아준다.
해당 DOM요소에 적용한다. → ref={authorInput}
이렇게 하면 해당 요소를 선택할 수 있다. 이제 원하는 요소에 focus를 주려면 current를 사용해
**authorInput.current.focus();**로 작성하면 된다.
contentInput도 같은 방식으로 작성하면 된다.
반응형'리액트' 카테고리의 다른 글
[리액트 오류] - Warning: Invalid DOM property `class`. Did you mean `className` (0) 2023.06.22 React localStorage (0) 2023.03.03 리액트 사용자 입력처리하기 (0) 2023.01.28 리액트 - 페이지 라우팅 (0) 2023.01.28 코딩테스트 연습 - 배열자르기 (0) 2022.12.30