본문 바로가기
[study]이론정리/React

이벤트처리

by yoon9i 2024. 7. 3.

10. 이벤트 처리
1> 개요
- 이벤트 핸들러(이벤트함수)는 함수 컴포넌트안에서 정의함.
ex>
    // 함수 컴포넌트
    function App() {

        // 이벤트 함수
        function go() {}

        return(
            // JSX
        );
    }

- JSX 에서 이벤트 처리는 카멜표기법(onClick, onChange, ...) 을 사용해야 된다.
- 기본문법 2가지
가. 이벤트함수명 이용
    onClick={이벤트함수명}
    ex>
        onClick={go}
        => 값을 넘길수가 없음.

    - 이벤트객체는 자동으로 전달됨.

나. arrow 함수 이용
    onClick={arrow함수}
    ex>
        onClick={ () => 동작처리코드 }
        onClick={ () => go(값) }
        => 임의의 값을 넘길때는 arrow 함수를 사용한다.
    
    - 명시적으로 함수 호출
    - 이벤트객체는 자동으로 전달 안됨. 명시적으로 전달해야 된다.




2> 이벤트 객체
- e.preventDefault();
- e.stopPropagation();


3> 계층구조 이벤트 처리
- 부모에 있는 함수를 자식에게 전달 가능하다.
  이 방법을 이용하면 자식이 부모에게 데이터 전달이 가능해진다.
  (계층적 이벤트 + props 이용)

  * 최종정리
                        props
    부모 ----------------------------------> 자식
           <----------------------------------
                계층적이벤트 + 파라미터

 

 

<이벤트처리>

# App.js

import logo from './logo.svg';
import './App.css';

// 함수형 컴포넌트

// https://yoon9i.tistory.com/192 에 js 문법정리부분(이벤트처리)인데 
// js 에서는 인라인방식을 사용하지않는다고 했지만 React 에서는 인라인방식을 사용한다.
function App() {

  // 이벤트핸들러 함수
  function handleEvent() {
    console.log("handleEvent");
  }

  function handleEvent1(e) { // 여러개 사용도 가능, 자동전달가능
    console.log("handleEvent1", e, e.target, e.target.innerHTML);
  }
  // e.target : <button onClick={handleEvent1}>OK1</button>
  // e.target.innerHTML: OK2

  // arrow 함수 이용 + 이벤트
  function handleEvent2(e) { // 자동으로 전달이 안됨, 명시적으로 설정
    console.log("handleEvent2", e);
  }

  // 데이터처리 + 이벤트
  function handleEvent3(name, e) {
    console.log("handleEvent3", name, e);
  }

  return (
    <div className="App">
      <h2>App 컴포넌트</h2>
      <button onClick={handleEvent}>OK</button>
      <button onClick={handleEvent1}>OK1 이벤트</button>
      <hr></hr>
      <button onClick={() => handleEvent2()}>OK2</button>
      <hr></hr>
      <button onClick={(e) => handleEvent2(e)}>OK2 이벤트</button>
      <hr></hr>
      <button onClick={() => handleEvent3("홍길동")}>OK3</button>
      <hr></hr>
      <button onClick={(e) => handleEvent3("홍길동", e)}>OK3 이벤트</button>
    </div>
  );
}

export default App;
# App.css

.App {
  text-align: center;
}

.App-logo {
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .App-logo {
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}

.App-link {
  color: #61dafb;
}

@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

 

 

<이벤트처리-계층적이벤트>

# App.js

import logo from './logo.svg';
import './App.css';
import Child from './component/child';

// 부모 컴포넌트
function App() {

  // 함수
  function handleEvent(name) {
    console.log("App.handleEvent", name); // 자식이 호출
  }

  // return (
  //   <div className="App">
  //     <h2>App 컴포넌트</h2>
  //     <자식컴포넌트명 변수명={함수명}} />
  //   </div>
  // );

  return (
    <div className="App">
      <h2>App 컴포넌트</h2>
      <Child onParent={handleEvent} />
    </div>
  );
}

export default App;
# App.css

.App {
  text-align: center;
}

.App-logo {
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .App-logo {
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}

.App-link {
  color: #61dafb;
}

@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
# components/Child.js

// 자식 컴포넌트
function Child(props) {
    console.log(props);
    var fun = props.onParent;

    // 이벤트함수
    function handleChildEvent() {
        // 복잡한 코드작업후 부모함수 호출도 가능.
        fun("홍길동");
    }

    return (
        <div className="Child">
            <h4>Child 컴포넌트</h4>
            <button onClick={fun}>부모함수호출1</button><br></br>
            <button onClick={() => fun()}>부모함수호출2</button><br></br>
            <hr></hr>
            <button onClick={() => handleChildEvent()}>부모함수호출3</button><br></br>
            <hr></hr>
            <button onClick={() => handleChildEvent()}>부모함수호출 + 부모에 전달</button><br></br>
        </div>
    );
}

export default Child;

 

<이벤트처리-계층적이벤트(TabButton) >

# App.js

import logo from './logo.svg';
import './App.css';
import TabButton from './components/TabButton';

function App() {

  function handleEvent(message) {
    console.log("클릭한 값: ", message); // ex> 클릭한 값: Java
  }

  return (
    <div className="App">
      <h2>App 컴포넌트</h2>
      <TabButton onParent={handleEvent}>Java</TabButton>
      <TabButton onParent={handleEvent}>SQL</TabButton>
      <TabButton onParent={handleEvent}>React</TabButton>
      <TabButton onParent={handleEvent}>Spring</TabButton>
    </div>
  );
}

export default App;
# App.css

.App {
  text-align: center;
}

.App-logo {
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .App-logo {
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}

.App-link {
  color: #61dafb;
}

@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
# components/TabButton.js

function TabButton(props) {
    console.log(props);

    var event = props.onParent;
    var message = props.children;
    console.log(event, message);

    return (
        <div className="TabButton">
            <h2>TabButton</h2>
            <button onClick={() => event(message)}>Click</button>
        </div>
    );
}

export default TabButton;

'[study]이론정리 > React' 카테고리의 다른 글

hooks  (0) 2024.07.03
배열반복(map함수)  (0) 2024.07.03
Props  (0) 2024.07.03
image 사용하기  (0) 2024.07.03
JSX(JavaScript XML)  (2) 2024.07.03