컴포넌트 외부에서 컴포넌트에게 주는 데이터
컴포넌트 내부에서 변경할 수 있는 데이터 (컴포넌트에 들어있는 데이터를 나타내는 오브젝트)
Props와 State를 바탕으로 컴포넌트를 그린다.
✍️ React에서 컴포넌트를 작성하는 방법은 두 가지 이다. 아직 둘 다 잘 모르는 상태에서 두가지 컴포넌트를 동시에 접하다 보니 헷갈리는 개념들이 있어서 두 스타일의 기초적인 부분을 정리해보려고 한다.
클래스 문법을 이용해서 컴포넌트를 만든다.
// 정의
class ClassComponent extends React.Component {
render(){
return <div>Hello</div>;
}
}
// 사용
ReactDOM.render(<ClassComponent />, document qeuerySelector('#root'))
함수 문법을 이용해서 컴포넌트를 만든다.
// 정의1
function FunctionComponent(){
return <div>Hello</div>;
}
// 정의2
// 단순히 엘리먼트만 리턴한다면 {}와 return생략가능
// 즉, 화살표 함수의 유일한 문장이 return이므로 {}와 return생략
const FunctionComponent = () => <div>Hello</div>
// 사용
ReactDOM.render(<FunctionComponent />, document.querySelector('#root'))
import React from "react";
import "./App.css";
function App() {
return (
<div className="container">
<h1>Hello world</h1>
<FuncComp></FuncComp>
<ClassComp></ClassComp>
</div>
);
}
// 1) 함수로 컴포넌트 만들기
function FuncComp() {
return (
<div className="container">
<h2>function style component</h2>
</div>
);
}
// 2) 클래스로 컴포넌트 만들기
class ClassComp extends React.Component {
render() {
return (
<div className="container">
<h2>class style component</h2>
</div>
);
}
}
export default App;
return()
을 이용한다.render
라는 이름의 함수 즉, 메소드를 정의 하고 그 리턴값이 UI가 된다.function App() {
return (
<div className="container">
<h1>Hello world</h1>
<FuncComp initNumber={2}></FuncComp> // 0)
<ClassComp initNumber={2}></ClassComp> // 0)
</div>
);
}
function FuncComp(props) {
return (
<div className="container">
<h2>function style component</h2>
<p>Number : {props.initNumber}</p> // 2)
</div>
);
}
class ClassComp extends React.Component {
render() {
return (
<div className="container">
<h2>class style component</h2>
<p>Number : {this.props.initNumber}</p> // 1)
</div>
);
}
}
0) props 설정
1) 클래스로 props 받기
2) 함수로 props 받기
- 함수의 경우 this
를 사용하는 것이 아니고, 함수를 리액트가 호출할 때 첫번째 매개변수의 인자 값으로 전달된 porps 값을 전달하도록 약속되어 있다.
initNumber={2}
값이 매개변수에 들어있는 상태이다.{props.initNumber}
❓ 그렇다면 컴포넌트가 내부적으로 자신의 상태를 바꾸고 관리하기 위해서 사용하는 state
는 어떻게 함수 & 클래스 방식에서 사용될까?
function App() {
return (
<div className="container">
<h1>Hello world</h1>
<FuncComp initNumber={2}></FuncComp>
<ClassComp initNumber={2}></ClassComp>
</div>
);
}
class ClassComp extends React.Component {
state = { // 1)
number: this.props.initNumber, // 2)
};
render() {
return (
<div className="container">
<h2>class style component</h2>
<p>Number : {this.state.number}</p> // 3)
</div>
);
}
}
number
라고 하는 state
값을 주고 이때, props
를 통해서 전달된 initNumber
값을 전달한다. (기존에 '2' 숫자의 값이 이부분의 값이 되도록 설정한다.)props
의 값을 그대로 number
의 값으로 찍어주었다면, 이제는 props
의 값을 state
로 주었기 때문에 state
의 값이 바뀔 때마다 랜더가 호출, 바뀐 값이 UI로 바로 확인 된다.이어서 state를 셋팅(초기화) 하고 state의 값을 사용, 변경 하는 작업을 해보자.▼
class ClassComp extends React.Component {
state = {
number: this.props.initNumber,
};
render() {
return (
<div className="container">
<h2>class style component</h2>
<p>Number : {this.state.number}</p>
<input // 1)
type="button"
value="random"
onClick={function () {
this.setState({ number: Math.random() });
}.bind(this)} // 2)
></input>
</div>
);
}
}
Hook
1) 기본적으로 리액트가 Hook을 우리에게 공급해주는 내장된 Hook
2) 직접 만들 수 있는 사용자 정의 Hook
function App() {
return (
<div className="container">
<h1>Hello world</h1>
<FuncComp initNumber={2}></FuncComp>
<ClassComp initNumber={2}></ClassComp>
</div>
);
}
function FuncComp(props) {
const numberState = useState(); // 1)
console.log(numberState);
return (
<div className="container">
<h2>function style component</h2>
<p>Number : {props.initNumber}</p>
</div>
);
}
React.useState
같이 할 수 있지만, 상단 import React, { useState } from "react";
로 작성해서 간편하게 같은 결과를 얻을 수 있다.
- ❗️ useState()를 쓰면 무조건 배열이 리턴, 그 배열은 두개의 값으로 이루어진 배열이다.
- 배열이 가진 첫 번째 값 : 우리가 원하는 state 값
- 배열이 가진 두 번째 값 : 상태를 바꾸는 함수
function FuncComp(props) {
const numberState = useState(props.initNumber); // 1)
const number = numberState[0];
console.log(numberState); // 2)
return (
<div className="container">
<h2>function style component</h2>
<p>Number : {number}</p>
</div>
);
}
initNumber
값을 주고 싶을 때는 useState의 첫번째 인자로 그 값을 준다.function FuncComp(props) {
const numberState = useState(props.initNumber);
const number = numberState[0];
const setNumber = numberState[1]; // 1)
console.log(numberState);
return (
<div className="container">
<h2>function style component</h2>
<p>Number : {number}</p>
<input // 2)
type="button"
value="random"
onClick={function () {
setNumber(Math.random());
}}
></input>
</div>
);
}
numberState
의 두번째 값이 상태를 바꾸는 함수이다. ✍️
1. 함수방식에서 state를 만들 때는 react의 useState를 호출한다.
2. 그 state의 인자로는 그 state의 초기값이 온다.
3. useState는 두 개의 값으로 이루어진 배열을 리턴한다.
4. 첫 번째 값은 상태, 두번 째 값은 상태를 바꿀 수 있는 함수이다. (이 값들을 통해서 함수 안에서 state를 사용할 수 있게 되었다.)
// 함수 컴포넌트
function FuncComp(props) {
// 1)
const numberState = useState(props.initNumber);
const number = numberState[0];
const setNumber = numberState[1];
const dateState = useState(new Date().toString());
const date = dateState[0];
const setDate = dateState[1];
return (
<div className="container">
<h2>function style component</h2>
<p>Number : {number}</p>
<p>Date : {date}</p>
<input
type="button"
value="random"
onClick={function () {
setNumber(Math.random());
}}
></input>
<input
type="button"
value="date"
onClick={function () {
setDate(new Date().toString());
}}
></input>
</div>
);
}
// 클래스 컴포넌트
class ClassComp extends React.Component {
state = {
number: this.props.initNumber,
date: new Date().toString(),
};
render() {
return (
<div className="container">
<h2>class style component</h2>
<p>Number : {this.state.number}</p>
<p>Date : {this.state.date}</p>
<input
type="button"
value="random"
onClick={function () {
this.setState({ number: Math.random() });
}.bind(this)}
></input>
<input
type="button"
value="date"
onClick={function () {
this.setState({ date: new Date().toString() });
}.bind(this)}
></input>
</div>
);
}
}
// const numberState = useState(props.initNumber);
// const number = numberState[0];
// const setNumber = numberState[1];
const [number, setNumber] = useState(props.initNumber);
// const dateState = useState(new Date().toString());
// const date = dateState[0];
// const setDate = dateState[1];
const [date, setDate] = useState(new Date().toString());
📌 컴포넌트로 만들면 좋은 것들 😀 ! (무분별한 컴포넌트화는 좋지 않다고 한다.)
1. 반복적인 html을 축약할 때
2. 큰 페이지들
3. 자주 변경되는 것들
✍️
간단하게 state 사용법의 차이점에 대해서 기초적인 부분만 알아보았는데 이후에 라이프 사이클에 대해서 알게 되면 이부분도 두 형식의 차이점에 대해 정리해야 겠다.
👉 Lifecycle과 useEffect 정리:)
✍️
함수 스타일이 보다 간편할 수 있지만, 많은 문서에서는 아직도 class를 기반으로 된 정보들이 많이 존재하고, 옛날에 만들어진 리액트 라이브러리에서는 아직 Hooks 지원이 안되는 경우가 있다고 한다. 또 클래스도 지속적으로 업데이트될 것이므로, 클래스 컴포넌트에 대한 이해도 꼭 필요할 것이다.🤔
reference
Coding Everybody-react