-
React 클래스형 컴포넌트 & 이벤트핸들링과 thisStudy/React 2020. 1. 13. 11:50반응형
리액트에서 컴포넌트를 선언하는 방식은 두 가지가 있다.
Functional component
첫 번째로 함수형 컴포넌트가 있다.
- 함수형 컴포넌트는 return을 통해 렌더링하고 싶은 JSX를 반환해준다.
- 인자에 props를 넣어서 받아온다.
- defaultProps 는 함수 바깥에 선언해준다.
Hello.js
import React from 'react'; function Hello({ color, name }) { return ( <div style={{ color }}> 안녕하세요 {name} </div> ); } Hello.defaultProps = { name: '이름없음' }; export default Hello;
Class component
두 번째로 클래스형 컴포넌트가 있다.
- render() 메소드를 사용해야한다. 이를 통해 렌더링하고 싶은 JSX를 반환한다.
- props를 조회할 때는 this.props 를 사용한다.
- defaultProps 는 함수형 컴포넌트와 똑같이 해도 되고, 아니면 클래스 내부에 static 키워드를 통해 선언할 수 있다.
import React, { Component } from 'react'; class Hello extends Component { static defaultProps = { name: '이름없음' }; render() { const { color, name } = this.props; return ( <div style={{ color }}> 안녕하세요 {name} </div> ); } } export default Hello;
import React, { Component } from 'react';
: 컴포넌트를 리액트로부터 임포트한다.
class 이름 extends Component {
render() {
return(
);
}
}
: 클래스형 컴포넌트의 기본 형식이다.
const { color, name } = this.props;
: props로 넘겨받은 color와 name을 디스트럭쳐링 해준다.
이벤트 핸들링
- camelCase 표기법으로 작성한다.
- 클래스 내부에 이벤트 함수를 선언한다.
( 클래스 내부에 종속된 함수를 메서드라고 부른다. 이와 같은 이벤트 함수들을 커스텀 메서드라고 한다.)
- 이벤트 이름은 보통 handle로 시작한다.
(필수는 아니지만 주로 사용하는 표기법이다.)
- JSX 를 사용하여 문자열이 아닌 함수 객체로 이벤트를 전달한다.
- 기본 동작을 방지하기위해서는 반드시 preventDefault를 호출해야한다.
이벤트 핸들링 함수와 this
메서드들을 각 DOM 에 이벤트로 등록하는 과정에서 메서드와 컴포넌트 인스턴스의 관계가 끊겨지기 때문에
this가 컴포넌트 인스턴스를 가리키는 작업을 해줘야한다.
1. 클래스의 생성자 메서드 constructor에서 this를 bind 해주기
바인딩 해주지 않는다면 함수가 호출될 때 this 는 undefined 상태일 것이다.
import React, { Component } from 'react'; class Counter extends Component { constructor(props) { super(props); this.handleIncrease = this.handleIncrease.bind(this); } handleIncrease() { console.log(this); } render() { return ( <div> <h1>0</h1> <button onClick={this.handleIncrease}>+1</button> </div> ); } } export default Counter;
constructor(props) {
super(props);
this.handleIncrease = this.handleIncrease.bind(this);
}
: 생성자 함수에서 super(props)를 먼저 불러온다.
해당 클래스가 컴포넌트로서 작동할 수 있도록 하고 그 후 추가 작업을 진행하겠다는 것이다.
bind를 사용하여 해당 이벤트 함수에서 가리킬 this를 직접 설정해준다.
bind 뒤 소괄호에 작성한 것이 this가 될 것이다.
handleIncrease() {
console.log(this);
}: 콘솔로 this를 찍어보면 counter 컴포넌트가 잘 나타날 것이다.
2. 화살표 함수 사용하기
import React, { Component } from 'react'; class Counter extends Component { handleIncrease = () => { console.log(this); }; render() { return ( <div> <h1>0</h1> <button onClick={this.handleIncrease}>+1</button> </div> ); } } export default Counter;
handleIncrease = () => {
console.log(this);
};: 이 방법은 create-react-app을 사용하여 프로젝트를 진행할 때 사용할 수 있다.
왜냐하면 클래스형 컴포넌트에서 화살표 함수를 사용해 메서드를 구현하는것은
class-properties라는 문법을 사용해야하기 때문이다. 이는 정식 자바스크립트 문법이 아니다.
어쨌든 직접 구현한 함수에서 this를 사용하기 위해서는 화살표 함수로 함수를 만들어줘야한다.
반응형'Study > React' 카테고리의 다른 글
React shouldComponentUpdate vs PureComponent (0) 2020.01.18 React state 동적인 상태값 (0) 2020.01.14 Immer 라이브러리로 쉽게 React state 불변성 지키기 (0) 2020.01.12 React Hooks : useContext() & Context API : createContext() (2) 2020.01.11 React Hooks : useReducer() 함수 (2) 2020.01.10