jineecode

이벤트 핸들링 본문

JS/react

이벤트 핸들링

지니코딩 2021. 4. 29. 00:36

 

EventPractice.js

import React, { Component } from "react";

class EventPractice extends Component {
  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해 보세요"
          onChange={(e) => {
            console.log(e);
          }}
        ></input>
      </div>
    );
  }
}

export default EventPractice;

 

console.log >> onChange event 

 

input에 입력 시,

 

SyntheticBaseEvent 가 나타난다.

 

import React, { Component } from "react";

class EventPractice extends Component {
  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해 보세요"
          onChange={(e) => {
            console.log(e.target);
          }}
        ></input>
      </div>
    );
  }
}

export default EventPractice;

console.log(e.target)

 

 input 태그 그 자체가 나온다.

 

import React, { Component } from "react";

class EventPractice extends Component {
  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해 보세요"
          onChange={(e) => {
            console.log(e.target.value);
          }}
        ></input>
      </div>
    );
  }
}

export default EventPractice;

console.log(e.target.value)

 

타이핑 하는 value 값 그대로 출력이 된다.

이것을 state로 핸들링 할 수 있을까?


 

value를 state에 따라 핸들링하기

 

import React, { Component } from "react";

class EventPractice extends Component {
  state = {
    message: "",
  };

  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해 보세요"
          value={this.state.message}
          onChange={(e) => {
            this.setState({
              message: e.target.value,
            });
          }}
        ></input>
        <button
          onClick={() => {
            alert(this.state.message);
            this.setState({ message: "" });
          }}
        >
          확인
        </button>
      </div>
    );
  }
}

export default EventPractice;

 

 

함수를 미리 만들어 전달하기

 

 

import React, { Component } from "react";

class EventPractice extends Component {
  state = {
    message: "",
  };

  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.handleClick = this.handleClick.bind(this);
  }

  handleChange(e) {
    this.setState({
      message: e.target.value,
    });
  }

  handleClick() {
    alert(this.state.message);
    this.setState({
      message: "",
    });
  }

  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해 보세요"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>확인</button>
      </div>
    );
  }
}

export default EventPractice;

 

constructor을 쓰지 않고 외부에 함수를 만드는 법:

화살표 함수를 적극 이용한다.

 

import React, { Component } from "react";

class EventPractice extends Component {
  state = {
    message: "",
  };

  handleChange = (e) => {
    this.setState({
      message: e.target.value,
    });
  };

  handleClick = () => {
    alert(this.state.message);
    this.setState({
      message: "",
    });
  };

  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해 보세요"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>확인</button>
      </div>
    );
  }
}

export default EventPractice;

 

input 여러개 다루는 법

 

name 속성을 이용하여 여러 개의 이벤트를 조작할 수 있다

e.target.name은 해당 타겟의 name을 가리킨다.

 

 

import React, { Component } from "react";

class EventPractice extends Component {
  state = {
    username: "",
    message: "",
  };

  handleChange = (e) => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  handleClick = () => {
    alert(this.state.username + ": " + this.state.message);
    this.setState({
      username: "",
      message: "",
    });
  };

  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="username"
          placeholder="사용자명"
          value={this.state.username}
          onChange={this.handleChange}
        />
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해보세요"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>확인</button>
      </div>
    );
  }
}

export default EventPractice;

 

객체 안에서 key 값을 []로 감싸면, 그 안에 넣은 래퍼런스가 가리키는 실제 값이 key로 사용된다.

 

즉,

 

const name = "variantKey"
const object = {
    [name]: 'value'
};

{'variantKey': 'value'}

 

이와 같다.

 

 

엔터키로 input 보내기

 

import React, { Component } from "react";

class EventPractice extends Component {
  state = {
    username: "",
    message: "",
  };

  handleChange = (e) => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  handleClick = () => {
    alert(this.state.username + ": " + this.state.message);
    this.setState({
      username: "",
      message: "",
    });
  };

  handleKeyPress = (e) => {
    if (e.key === "Enter") {
      this.handleClick();
    }
  };

  render() {
    return (
      <div>
        <h1>이벤트 연습</h1>
        <input
          type="text"
          name="username"
          placeholder="사용자명"
          value={this.state.username}
          onChange={this.handleChange}
          onKeyPress={this.handleKeyPress}
        />
        <input
          type="text"
          name="message"
          placeholder="아무거나 입력해보세요"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>확인</button>
      </div>
    );
  }
}

export default EventPractice;

 


이벤트를 달아줄 때 중괄호 안에는 무조건 함수가 들어가야 한다.

 

ex:

 <span onClick={함수()}>👍</span> 
<span
  onClick={() => {
    console.log("1");
  }}
>
  👍
</span>

 

useState를 이용한 이벤트

 

...
let [good, change] = useState(0);
...

 <span
  onClick={() => {
    change("ㄱㄴㄷ");
  }}
>
  👍
</span>
{good}

초기값

good : 0

 

변경되는 값

change("변경하고 싶은 값")

 

  <span
      onClick={() => {
        change(good + 1);
      }}
    >
      👍
    </span>
    {good}

 

'JS > react' 카테고리의 다른 글

react 환경에서 emmet 적용하기  (0) 2021.04.29
이벤트에 따른 class명 변경  (0) 2021.04.29
state  (0) 2021.04.27
props  (0) 2021.04.27
궁금증 해소  (0) 2021.04.27
Comments