리액트

리액트 - React에서 DOM 조작하기

유니유뉘 2023. 1. 28. 17:22
728x90

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도 같은 방식으로 작성하면 된다.

 

반응형