IT/React

리액트(React) 스터디일지5 : 이벤트

라임웨일 2021. 4. 8. 15:18
반응형

 

1. 리액트에서는 카멜 표기를 원칙으로 합니다. 하이픈(-)이 들어가는 요소자리를 카멜 표기로 대체합니다.

back-ground (x)
backGround(o)

font-size(x)
fontSize(o)

 

2. 이벤트 이름은 카멜 표기로 작성합니다.

onclick(x)
onClick(o)

onkeyup(x)
onKeyUp(o)

 

3. 이벤트에 실행할 코드를 전달하는 것이 아니라 함수 형태의 값을 전달합니다.

 

4.DOM요소에만 이벤트를 설정할 수 있습니다.

DOM요소(div, input, span)등의 요소에는 이벤트를 설정할 수 있지만 우리가 만든 컴포넌트에는 이벤트를 자체적으로 설정할 수 없습니다.

 

자세한 이벤트는 공식문서를 통해서 확인하실 수 있습니다. 

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(e) {
    console.log(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;

메서드를 만들어서 이벤트를 전달도 가능하며 함수가 호출될 때 this는 호출부에 따라 결정되어집니다. 

클래스의 임의 메서드가 특정 html요소의 이벤트로 등록되는 과정에서 메서드와 this의 관계는 끊어져 버리기 때문에 this를 컴포넌트 자신으로 제대로 가리키기 위해서는 메서드를 this와 바인딩하는 작업이 필요합니다. 

 

바인딩을  하지 않는다면 this는 undefined를 호출합니다.


import React, { useState } from 'react';

const EventPractice = () => {
  const [form, setForm] = useState({
    username: '',
    message: '',
  });

  const { username, message } = form;

  const onChange = (e) => {
    const nextForm = {
      ...form, // 기존의 form 내용을 복사
      [e.target.name]: e.target.value, // 원하는 값으로 Update
    };
    setForm(nextForm);
  };

  const onClick = () => {
    console.log(username + message);
    setForm({
      username: '',
      message: '',
    });
  };

  const onKeyPress = (e) => {
    if (e.key === 'Enter') {
      onClick();
    }
  };

  return (
    <div>
      <h1>이벤트 연습</h1>
      <input
        type="text"
        name="username"
        placeholder="사용자명"
        value={username}
        onChange={onChange}
      />
      <input
        type="text"
        name="message"
        placeholder="아무거나 입력"
        value={message}
        onChange={onChange}
        onKeyPress={onKeyPress}
      />
      <button onClick={onClick}>확인</button>
    </div>
  );
};

export default EventPractice;

 

 

반응형
광고차단(애드블록)프로그램이나 브라우저를 사용중이시면 프로그램을 비활성화이나 블로그 주소를 예외 처리 해주시면 광고가 노출됩니다. 귀찮고 번거롭겠지만 광고 클릭은 저에게는 큰 힘이 됩니다. 🙇🏻‍♂️🙇🏻‍♀️
제 블로그의 모든 글은 제가 직접 작성 하고 다른 글을 참고할 때는 이전 글보다 읽기 편하게 수정해서 작성하고 있습니다. 커피 한잔 사먹고 더 열심히 좋은글로 보답하겠습니다.
오늘도 제 블로그에 와 주셔서 감사합니다. :)
//