๋ฆฌ์กํธ์์ State๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
- Class ์ปดํฌ๋ํธ์์์ State
- ํจ์ํ ์ปดํฌ๋ํธ์์์ State
๋ฆฌ์กํธ ์ด์ฌ์๋ค์ ์ง๊ธ๊น์ง ์ด๋ฐ ์ด์ผ๊ธฐ๋ฅผ ๋ค์์ ๊ฒ์ด๋ค.
state๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Classํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค
๋ง๋ ๋ง์ด๋ค. ํ์ง๋ง ๋ฆฌ์กํธ๊ฐ ๋ฐ์ ํ๋ฉด์ ๋ฆฌ์กํธ๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ํด์ ๋ง์ ์๊ฐ์ ํ๊ฒ ๋์๋ค.
Classํ ์ปดํฌ๋ํธ์ ๋จ์
-
์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค.
๋ฆฌ์กํธ์ ์ฅ์ ์ ์ฌ์ฌ์ฉ์ฑ์ ์๋ค๊ณ ๋ณธ์ธ์ ์๊ฐํ๋๋ฐ, ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ์ฌ์ฌ์ฉ ํ ์๋ ์์ง๋ง
Component class ๋ถ๋ถ์ ์ธ ๋ก์ง ๋ฐ API ์ฌ์ฉ์ด state๋ฅผ ์ด์ฉํ๋ ์ฒ๋ฆฌ์ ์ฌ์ฌ์ฉ์ ์ ์ฝ ์ฌํญ๋ค์ด ๋ฐ๋ฅด๊ฒ ๋๋ค. -
์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค.
Classํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์constructor
,this-Binding
๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋๋ฐ ์ด๋ ๋ถํ์ํ ์ฝ๋์ ๋ถ๋ถ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.
๊ทธ๋์ ๋ฑ์ฅํ๊ฒ ๋ React Hooks
React Hooks์ React 16.8๋ถํฐ ๊ณต์์ ์ผ๋ก ์ง์ํ๊ฒ ๋์๋ค.
์ด๋ ๋ฆฌ์กํธ๋ฅผ ๋ค์ ํ ๋ฒ js์ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตณํ๋ ๊ณ๊ธฐ๊ฐ ๋์๊ณ ์ค๋์ ๊ทธ์ ๋ํด์ ์ค๋ช ํด๋ณด๋ ค ํ๋ค.
Class(Non Hook) vs Function (Hook)
์ฐ๋ฆฌ๋ ๋ฆฌ์กํธ ํ ์ด ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ์ ํ ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋์์ ํ์ธํด ๋ณผ ๊ฒ์ด๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ๋ ๊ฐ์ง์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์์ ์ด๋ค.
InputByClass ์ปดํฌ๋ํธ
import React, { Component } from 'react';
class InputByClass extends Component {
/////////////////////////////////////////
constructor(props) {
super(props);
this.state = {
name: "",
nicknamel: ""
}
}
///////////////////////////////////////// Hook์ด ์ด ๋ถ๋ถ์ ๋์ฒํ๋ค.
onChange = ({ target: { name, value } }) => {
this.setState({
[name]: value
}
)
}
onReset = () => {
this.setState({ name: "", nickname: "" })
}
render() {
const { name, nickname } = this.state;
return (
<div>
<h3>Classํ ์ปดํฌ๋ํธ</h3>
<input name="name" onChange={this.onChange} placeholder="name" />
<input name="nickname" onChange={this.onChange} placeholder="nickname" />
<button onClick={this.onReset}>Reset</button>
<div>
<span>Info: </span>
{name} ({nickname})
</div>
</div>
);
}
}
export default InputByClass;
ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก constructor
๋ฅผ ์ฌ์ฉํ์ฌ state๋ฅผ ๊ด๋ฆฌํ๋ค.
ํ์ง๋ง ์์ ๋ง ํ๋ฏ์ด ์์ฑ์๋ฅผ ํตํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฌ๋ฌ ๋นํจ์จ์ ์ธ ๊ณผ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋
useState
๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๊ด๋ฆฌ๋ฅผ ํ ๊ฒ์ด๋ค.
InputByFunction ์ปดํฌ๋ํธ
import React, { useState } from 'react';
const InputByFunction = () => {
//////////////////////////////////////////////////////////// Hook
const [inputs, setInputs] = useState({
nickname: "",
name: ""
});
//////////////////////////////////////////////////////////// Hook
const { name, nickname } = inputs;
const onChange = (e) => {
const { value, name } = e.target;
setInputs({
...inputs,
[name]: value
})
}
const onReset = () => {
setInputs({
[name]: ""
})
}
return (
<div>
<h3>Function ์ปดํฌ๋ํธ</h3>
<input name="name" onChange={onChange} placeholder="name" />
<input name="nickname" onChange={onChange} placeholder="nickname" />
<button onClick={onReset}>Reset</button>
<div>
<span>Info: </span>
{name} ({nickname})
</div>
</div>
);
}
export default InputByFunction;
ํ
์ ์ฌ์ฉํ๋ ค๋ฉด react์ ์กด์ฌํ๋ useState
๋ฅผ ์ฌ์ฉํ์ฌ state๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋
const [state๊ฐ ์ ์ฅ ๋ณ์, state๋ฅผ ๋ณ๊ฒฝํ ํจ์] = useState(์ด๊ธฐํ)
์ ํํ๋ก ์์ฑ์ ํ์ฌ ์ฌ์ฉํ๋ค.
App ์ปดํฌ๋ํธ
import React from "react";
import InputSample from "./components/InputByFunction";
import Input from './components/InputByClass';
const App = () => {
return (
<div>
<InputByFunction />
<InputByClass />
</div>
);
}
export default App;
๋ง์ง๋ง์ผ๋ก App ์ปดํฌ๋ํธ์์ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
๋๊ธ