React

230116 React Event 핸들링

주영재 2023. 1. 16. 19:09

리액트 이벤트 핸들링

이벤트 규칙

1. 이벤트의 이름은 전부 카멜 표기법으로 표현된다. onkeyup->onKeyUp, onclick->onClick
2. 이벤트를 전달할 때는 {함수}형태로 사용한다.

해당 input에 value로 state를 주는 이유는, 함수형에선 나오는데 클래스형 컴포넌트일때는 값이 나오지 않기 때문.


//바꾸고, state값이 바뀌고, 화면을 다시 그리고, 변경된 값이 나온다.

 

App.js

import EventComponent from "./component/EventComponent";
import EventComponent2 from "./component/EventComponent2";
import EventComponentQ from "./component/EventComponentQ";
import EventComponentQ2 from "./component/EventComponentQ2";

const App = () => {
    /*
    p.121
    이벤트 핸들링
    함수형이벤트 핸들링
    */

    return (
        <>
            <EventComponent />
            <EventComponent2/>

            {/* 실습 */}
            <EventComponentQ/>
            <EventComponentQ2/>
        </>
    )
}

export default App;

 

EventComponent

import { useState } from "react";


const EventComponent = () => {
    //name을 저장할 useState
    const [name, setName] = useState('');

    //이벤트함수의 첫번째 매개변수에 이벤트에 대한 정보를 넣어줍니다.
    //this는 함수형에서는 가능하지만 클래스형 컴퍼넌트에서는 사용어려움. ->event객체 사용
    const handleName = (e) => setName(e.target.value);//state체인지

    const [topic, setTopic] = useState('');
    const handleTopic = (e) => setTopic(e.target.value);

    //클릭이벤트
    const handleClick = () => {
        alert(`${name}님의 주제는 ${topic}입니다.`); //state값
        setName(''); //인풋데이터 초기화
        setTopic(''); //인풋데이터 초기화
    }

    //엔터키의 처리
    const handlePress = (e) => {
        if (e.keyCode === 13) {//엔터값
            handleClick();//클릭이벤트호출
        }
    }


    return (
        <>
            <h3>리액트의 이벤트 핸들링(인풋데이터)</h3>

            <input type="text" name="name" onChange={handleName} value={name} />
            <div>체인지된결과: {name}</div>
            <hr />
            <input type="text" name="topic" onChange={handleTopic} value={topic} onKeyUp={handlePress} />
            <div>체인지된결과: {topic}</div>
            <hr />
            <button type="button" onClick={handleClick}>클릭미</button>
        </>
    )
}

export default EventComponent;

이밴트함수의 첫번째 매개변수에 이벤트에 대한 정보를 넣어줌.

this는 함수형에서는 가능하지만 클래스형 컴퍼넌트에서는 사용이 어렵다. ->event객체 사용.

+)but, JSX에서 event를 쓰면 event로 나온다. 사용 문법이 다른 듯. 때문에 매개변수로 e를 넣어 e.target~으로 사용

값이 바뀔 때마다 state도 변해서 리렌더링 되기 때문에 값을 적는 과정이 그대로 화면에 출력된다. value도 바로 바뀜.
버튼을 누르면 이런 알림창이 뜨고 값이 초기화됨.


useState를 하나로 관리하기((객체로 사용)

state가 어떤 타입이도 가능한 특징을 이용.
const[form,setForm]=useState({name:'',topic:''})

->객체 state

...form으로 복사해서 가져옴.
->key값을 똑같이 해서 데이터를 덮는다.

+)key를 지칭할 때 ["키"]로 지칭.

처음 선언할 때와 같은 key를 지칭할 땐 똑같이 쓰면 되지만,

e.target~등으로 내용만 같은 키를 지칭할 땐 [e.target~]처럼 [ ]안에 문자열이 들어가는 식으로 표현한다.

 

EventComponent2

import { useState } from "react";

const EventComponent2=()=>{

    //state를 객체로 관리
    const [data,setData]=useState({name:'',topic:''});

    const handleChange=(e)=>{
        //객체안에서 key를 바꾸는 방법 ["키"]:값
        const copy={...data,[e.target.name]:e.target.value};//데이터복사
        setData(copy); //state변경
    }

    // const handleTopic=(e)=>{
    //     const copy={...data,["topic"]:e.target.value};
    //     setData(copy);
    // }

    const handleClick=()=>{
        alert(`${data.name}님의 할일은 ${data.topic}입니다.`)
        setData({name:'',topic:''}); //state초기화
    }


    return(
        <>
        <hr/>
        <h3>리액트 이벤트 핸들링(객체로)</h3>

        <input type='text' name='name' onChange={handleChange} value={data.name}/>
        <h3>결과: {data.name}</h3>
        <input type='text' name='topic' onChange={handleChange} value={data.topic}/>
        <h3>결과: {data.topic}</h3>
        <button type="button" onClick={handleClick}>클릭미</button>

        </>
    )
}


export default EventComponent2;

위와 똑같다. 단지 state를 객체로 만들어 하나로 해결했다는 차이가 존재함.