React 의 이벤트처리

안윤경·2022년 8월 2일
0

react

목록 보기
5/16
post-thumbnail

React의 이벤트 처리(이벤트 핸들링; Event handling) 방식은 DOM의 이벤트 처리 방식과 유사합니다. 단, 몇 가지 문법 차이가 있습니다.

html

< button>Event</ button>

React

< button onClick={handleEvent}>Event</ button>


onChange

  • < input> < textarea> < select> 와 같은 폼(Form) 엘리먼트는 사용자의 입력값을 제어하는 데 사용됩니다.React 에서는 이러한 변경될 수 있는 입력값을 일반적으로 컴포넌트의 state 로 관리하고 업데이트합니다.

  • onChange 이벤트가 발생하면 e.target.value 를 통해 이벤트 객체에 담겨있는 input 값을 읽어올 수 있습니다. 컴포넌트 return 문 안의 input 태그에 value 와 onChange 를 넣어주었습니다.

  • onChange 는 input 의 텍스트가 바뀔 때마다 발생하는 이벤트입니다. 이벤트가 발생하면 handleChange 함수가 작동하며, 이벤트 객체에 담긴 input 값을 setState 를 통해 새로운 state 로 갱신합니다.

    function NameForm() {
    const [name, setName] = useState("");
    
    const handleChange = (e) => {
      setName(e.target.value);
    }
    
    return (
      <div>
        <input type="text" value={name} onChange={handleChange}></input>
        <h1>{name}</h1>
      </div>
    )
    };

onClick

  • onClick 이벤트는 말 그대로 사용자가 클릭이라는 행동을 하였을 때 발생하는 이벤트입니다.

    function NameForm() {
    const [name, setName] = useState("");
    
    const handleChange = (e) => {
      setName(e.target.value);
    }
    
    return (
      <div>
        <input type="text" value={name} onChange={handleChange}></input>
        <button onClick={alert(name)}>Button</button>
        <h1>{name}</h1>
      </div>
    );
    };
  • 위와 같이 onClick 이벤트에 alert(name) 함수를 바로 호출하면 컴포넌트가 렌더링 될 때 함수 자체가 아닌 함수 호출의 결과가 onClick 에 적용됩니다. 때문에 버튼을 클릭할 때가 아닌, 컴포넌트가 렌더링 될 때에 alert 이 실행되고 따라서 그 결과인 undefined (함수는 리턴 값이 없을 때 undefined 를 반환합니다.) 가 onClick 에 적용되어 클릭했을 때 아무런 결과도 일어나지 않습니다. 따라서 onClick 이벤트에 함수를 전달할 때는 함수를 호출하는 것이 아니라 아래와 같이 리턴문 안에서 함수를 정의하거나 리턴문 외부에서 함수를 정의 후 이벤트에 함수 자체를 전달해야 합니다. 단, 두 가지 방법 모두 arrow function 을 사용하여 함수를 정의하여야 해당 컴포넌트가 가진 state에 함수들이 접근할 수 있습니다.

  import "./styles.css";
import React, { useState } from "react";

function NameForm() {
  const [name, setName] = useState("");

  const handleChange = (e) => {
    setName(e.target.value);
  };

  const handleClick = () => {
    alert(name);
  };
  return (
    <div className="App">
      <h1>Event handler practice</h1>
      <input type="text" value={name} onChange={handleChange}></input>
      <button onClick={handleClick}>Button</button>
      {/* <button onClick={() => alert(name)}>Button</button> */}
      <h3>{name}</h3>
    </div>
  );
}
export default NameForm;
profile
프론트엔드 개발자 안윤경입니다

0개의 댓글