본문 바로가기
Frontend/ReactJS(완)

React - 3장 : 컴포넌트

by 리키이 2023. 2. 6.

3-1. 컴포넌트를 선언하는 방식

- 컴포넌트를 선언하는 방식은 크게 두가지이고 클래스형과 함수형이 있다.

 

1) 클래스형 컴포넌트

- 클래스형 컴포넌트에서는 render 함수가 꼭 있어야 하고, 그 안에서 보여주어야 할 JSX를 반환해야 한다.

- state와 라이프사이클 API 사용이 가능하다.

- 임의 메서드를 정의가 가능하다.

 

import React, { Component } from 'react';
 
class App extends Component {
  render() {
    const name = 'react';
    return <div className="react">{name}</div>;
  }
}
 
export default App;

 

2) 함수형 컴포넌트

- 클래스형 컴포넌트보다 선언하기가 훨씬 편하다.

- 메모리 자원도 클래스형 컴포넌트보다 덜 사용한다.

- state와 라이프사이클 API사용이 불가능한데 리액트 v16.8 업데이트 이후 Hooks라는 기능이 도입되면서 해결되었다.

- 리액트 공식 매뉴얼에서 컴포넌트를 새로 작성할 때 함수 컴포넌트와 Hooks를 사용하도록 권장하고 있다.

 

import React from 'react';
import './App.css';
 
function App() {
  const name = '리액트';
  return <div className="react">{name}</div>;
}
 
export default App;

 

3-2. 컴포넌트 생성

1) 함수형 컴포넌트 작성

 

import React from 'react';
 
const MyComponent = () => {
  return <div>나의 새롭고 멋진 컴포넌트</div>;
};
 
export default MyComponent;

 

함수를 작성할 때  function 키워드를 사용하는 대신에 () => {} 화살표 함수 문법을 사용했다.

 

화살표 함수 문법
- ES6  문법에서 함수를 표현하는 새로운 방식
- 주로 함수를 파라미터로 전달할 때 유용
- this 값 비교
  -  function : 자신이 종속된 객체의 this를 가리킴
  -  arrow function : 자신이 종속된 인스턴스의 this를 가리킴

 

2) 모듈 내보내기 및 불러오기

- 내보내기 ( exprot )

  - 다른 파일에서 import 할 때 불러오도록 설정

  - export default App;

 

- 불러오기 ( import )

  - import App from './App';

 

3-3. props

1) 구성

- 컴포넌트 속성을 설정할 때 사용하는 요소

- 해당 컴포넌트를 불러와 사용하는 부모 컴포넌트에서 설정한다

- 자식 컴포넌트에서 props를 랜더링

- 함수를 파라미터로 받아 와서 사용한다.

- JSX내부에서 { } 기호로 감싸 주면 된다.

 

import React from 'react';
import MyComponent from './MyComponent';
 
const App = () => {
  return <MyComponent name="React" />;
};
 
export default App;

 <부모 컴포넌트>

 

import React from 'react';
 
const MyComponent = props => {
return <div>안녕하세요, 제 이름은 {props.name}입니다.</div>;
};
 
export default MyComponent;

<자식 컴포넌트>

 

2) props 기본값 설정: defaultProps

- props값을 따로 지정하지 않았을 때 보여 줄 기본값을 설정

const MyComponent = props => {
  return <div>안녕하세요, 제 이름은 {props.name}입니다.</div>;
};
 
MyComponent.defaultProps = {
  name: '기본 이름'
};

 

- MyComponent.defaultProps = { props 이름 : defalut 값} 을 입력하면 결과값으로 '기본 이름' 이 기본값으로 설정된다.

 

3) 태그 사이의 내용을 보여 주는 children

- 부모 컴포넌트 사이의 값을 자식 컴포넌트에서 호출 하고 싶을 때

 

<부모 컴포넌트>
const App = () =>{
    // 태그 사이의 값 '리액트'
    return <MyComponent>리액트</MyComponent>
}

<자식 컴포넌트>
const MyComponent = (props) =>{
    return <div>children 값은 {props.children}</div>
}

- 결과 값으로 children 값은  리액트 가 나온다.

 

3) 비구조화 할당 문법을 통해 props 내부 값 추출하기

- 객체에서 값을 추출하는 문법

- 키워드를 간소화하여 편하게 작성가능

 

import React from 'react';
 
 // props.name과 props.children 대신에 사용가능
const MyComponent = props => {
  ㅌ
  const { name, children } = props;
  return (
    <div>
      안녕하세요, 제 이름은 {name}입니다. <br />
      children 값은 {children}
      입니다.
    </div>
  );
};
 
MyComponent.defaultProps = {
  name: '기본 이름'
};
 
export default MyComponent;

 

- 파라미터 부분에서도 사용가능

 

import React from 'react';
 
const MyComponent = ({ name, children }) => {
  return (
    <div>
      안녕하세요, 제 이름은 {name}입니다. <br />
      children 값은 {children}
      입니다.
    </div>
  );
};
 
MyComponent.defaultProps = {
  name: '기본 이름'
};
 
export default MyComponent;

 

4) propsTypes를 통한 props 검증

- typescript처럼 props의 타입을 지정할 수 있다.

- 대규모 프로젝트위해 습관을 들여놓으면 좋을 것 같다.

 

//Proptypes를 import 해준다
import Proptypes from 'prop-types';

...(생략)

MyComponent.propTypes ={
    name: PropTypes.string
}

- 이렇게 설정해주면 name값은 무조건 문자열 형태로 전달해야 된다는 것을 의미한다. 

 

...(생략)


MyComponent.propTypes ={
    favoritNumber : PropTypes.number.isRequired
}

- propTypes 지정할때 뒤에 isRequired 를 붙여주면 favoriteNumber라는 숫자는 필수 props로 지정된다.

- type이 제대로 전달되지 않았을때에는 console창에 에러가 난다.

 

4) 클래스형 컴포넌트에서 props 사용하기

- render 함수에서 this.props 사용

 

render() {
    const { name, favoriteNumber, children } = this.props; // 비구조화 할당
    ...(생략)
  }
}

 

3-4. state

- 컴포넌트 내부에서 바뀔 수 있는 값

- 클래스형 컴포넌트에서는 state

- 함수형 컴포넌트의 useState (Hooks)

 

1) 클래스형 컴포넌트의 state

- 클래스형 컴포넌트에서 state를 설정할 때는 constructor(생성자) 메서드를 작성해야 한다.

- 생성자 메서드를 작성할 때는 반드시 super(props)를 호출 해야 한다.

- super(props)를 호출 하게되면 현재 클래스형 컴포넌트가 상속받고 있는 리액트의 component 클래스가 지닌

  생성자 함수를 호출해준다. 

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    // state의 초깃값 설정하기
    this.state = {
      number: 0,
      fixedNumber: 0
    };
  }
}

 

- state의 값을 바꿀 땐 setState를 이용한다.


<button
onClick={() => {
// this.setState를 사용하여 state에 새로운 값을 넣을 수 있습니다.
this.setState({ number: number + 1 });
}}
>

 

 

- 이런식으로 하면 constructor 제거하고 간편하게 설정할 수 있다.

import React, { Component } from 'react';
 
class Counter extends Component {
  state = {
    number: 0,
    fixedNumber: 0
  };
  render() {
    const { number, fixedNumber } = this.state; // state를 조회할 때는 this.state로 조회합니다.
    return (...);
  }
}
 
export default Counter;

 

 

- this.setState는 비동기적으로 업데이트 된다.

- 두 번 호출하게도면 state가 동작하지않는다.

- 이를 해결하기 위해서는 객체 대신에 함수를 인자로 넣어 주면 된다.

- prevState는 기존 상태

- props는 현재 지니고 있는 props를 가리키므로 업데이트 과정에서 props가 필요하지 않으면 생략 가능하다.

<button
    this.setState((prevState, (props))=>{
    return {
        number: prevState.number + 1;
    }
})
></button>

 

- this.setState가 끝나고 콜백함수를 등록하여 작업을 처리 할 수 있다.

this.setState({
    number:number+1
}, ()=>{
    // 콜백함수
    }
)

 

2) 함수 컴포넌트에서 useState 사용하기

- 배열 비 구조화 할당 문법

const array = [1,2];
const one = array[0]
const two = array[1]

// 아래 코드와 동일하다.

const array = [1,2];
const [one, two] = array;

 

- useState 사용하기

  - const [현재 상태, 상태 바꿔주는 함수] = useState(state 의 초기값)

  - 값의 형태(숫자, 문자열,객체, 배열)는 자유 다 가능!!

  - 특정 이벤트 함수에 상태 바꿔주는 함수로 state값 변경가능

  - 여러 번 사용가능

 

import React, { useState } from 'react';
 
const Say = () => {
  const [message, setMessage] = useState('');
  const onClickEnter = () => setMessage('안녕하세요!');
  const onClickLeave = () => setMessage('안녕히 가세요!');
 
  const [color, setColor] = useState('black');
 
  return (
    <div>
      <button onClick={onClickEnter}>입장</button>
      <button onClick={onClickLeave}>퇴장</button>
      <h1 style={{ color }}>{message}</h1>
      <button style={{ color: 'red' }} onClick={() => setColor('red')}>
        빨간색
      </button>
      <button style={{ color: 'green' }} onClick={() => setColor('green')}>
        초록색
      </button>
      <button style={{ color: 'blue' }} onClick={() => setColor('blue')}>
        파란색
      </button>
    </div>
  );
};
 
export default Say;

 

3-5. state를 사용할 때 주의사항

- state 값을 바꿀 때 세터 함수를 사용해야 한다. 

- 그 이유는  객체의 데이터의 정확성과 일관성을 유지하기 위해 사용

- 배열이나 객체를 업데이트 하는 과정

  - 배열, 객체 사본을 만든다. ( spread 연산자를 사용 )

 

// 객체 다루기
const object = { a: 1, b: 2, c: 3 };
const nextObject = { ...object, b: 2 }; // 사본을 만들어서 b 값만 덮어 쓰기
 
// 배열 다루기
const array = [
{ id: 1, value: true },
{ id: 2, value: true },
{ id: 3, value: false }
];
let nextArray = array.concat({ id: 4 }); // 새 항목 추가
nextArray.filter(item => item.id != = 2); // id가 2인 항목 제거
nextArray.map(item => (item.id === 1 ? { ...item, value: false } : item)); // id가 1인 항목의 value를 false로 설정

 

'Frontend > ReactJS(완)' 카테고리의 다른 글

React - 6장 : 컴포넌트 반복  (0) 2023.02.13
React - 5장 : ref. DOM에 이름 달기  (0) 2023.02.09
React - 4장 : 이벤트 핸들링  (0) 2023.02.08
React - 2장 : JSX  (0) 2023.02.02
React - 1장 : React 이해  (0) 2023.02.01

댓글