1. State
๐บ state ๊ฐ ๋ฌด์์ผ๊น ??
- ๋ฆฌ์กํธ์์ state๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ๋ ์ ์๋ ๊ฐ์ ์๋ฏธํฉ๋๋ค
- state๊ฐ ์ฒด์ธ์ง ๋๋ฉด ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ๋ฆฌ๋ ๋๋ง์ ์ํํฉ๋๋ค.
- ํด๋์ค vs ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค.
- ํจ์ํ ์ปดํฌ๋ํธ์์๋ ํ Hook๊ฐ๋ ์ ์ด์ฉํด์ ๋์ฑ ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ ํฉ๋๋ค.
2. useState - hook
useState(์ด๊ธฐ๊ฐ) - ํจ์(hook)
๐ useState() : ๋ฐฐ์ด๋ฐํ
์ฒซ๋ฒ์งธ ๋ฐฐ์ด์ ์์์๋ ํ์ฌ๊ฐ์, ๋๋ฒ์งธ ์์๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ (setter) ๋ฅผ ๋ฐํํฉ๋๋ค.
const [data, setData] = useState('์ด๊ธฐ๊ฐ')
state๋ ์ด๋ค ํ์ ์ด๋ ์๊ด ์์ต๋๋ค. (str, number, object, array, boolean… )
state๋ ์ฌ๋ฌ๊ฐ ์ผ ์๋ ์์ต๋๋ค.
๐บ ์ด๋ !! state ๋ ์๋์ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค. ๊ผญ ์งํค๋๋ก ํ์ !
1. ์ํ ์ง์ ์์ ๊ธ์ง: State๋ ์ง์ ์์ ํ๋ฉด ์๋๋ค
(๋ฆฌ์กํธ๊ฐ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ์ง ๋ชปํจ , ์ฆ ๋ ๋๋ง ์ฌ์ดํด์ด ์ ๋๋ก ์๋ํ์ง ์์ ์ ์์)
2. ์ํ ์ ๋ฐ์ดํธ ํจ์ ์ฌ์ฉ : setter ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
setState ํจ์(ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ)
์ํ ์ ๋ฐ์ดํธ ํจ์(ํจ์ํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ, ์: setSomeValue)๋ฅผ ์ฌ์ฉ
๐ ์๋ชป๋ ์ฝ๋
const StateComponent = () => {
const [msg, setData] = useState('์ด๊ธฐ๊ฐ')
const exter = () => {
msg = '๋๋ ์ด๋ ๊ฒ ๋ฐ๊ฟ๊บผ์ผ!'; //error!!!! (๋ ๋๋ง x)
}
return (
<div>
<h3>{msg}</h3>
<button onClick={enter}>์
์ฅ</button>
</div>
)
}
๐ ์ฌ๋ฐ๋ฅธ ๋ณ๊ฒฝ
const StateComponent = () => {
const [msg, setData] = useState('์ด๊ธฐ๊ฐ')
const enter = () => setData('์
์ฅํ์ต๋๋ค')
const exit = () => setData('ํด์ฅํ์ต๋๋ค')
return (
<div>
<h3>{msg}</h3>
<button onClick={enter}>์
์ฅ</button>
<button onClick={exit}>ํด์ฅ</button>
</div>
)
}
๐ ํด๋์คํ ์ปดํฌ๋ํธ state์ props
import React from 'react';
class MyComponent3 extends React.Component {
//์์ฑ์์์ props ๋ฐ๊ธฐ
constructor(props) {
super(props);
this.state = {
a : 1,
b : props.age
}
}
//ํด๋์ค ์ปดํฌ๋ํธ์์๋ render() ์์ ๋ฆฌํด์ ์์ฑํฉ๋๋ค.
render() {
//props๋ฐ๊ธฐ
let myName = "์ด์์ "; //ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ณ์์ ์ฌ์ฉ์ render์์์ ์ฌ์ฉํจ
let {name, age} = this.props; //ํด๋์ค์์ props์ ์ฌ์ฉ
return (
<div>
{myName}์ ํด๋์คํ ์ปดํฌ๋ํธ<br/>
ํ๋กํผํฐ1:{name}<br/>
ํ๋กํผํฐ2:{age}<br/>
state์์ฌ์ฉ1: {this.state.a}<br/>
state์์ฌ์ฉ2: {this.state.b}<br/>
</div>
)
}
}
export default MyComponent3;
๐บ ์๋ชป๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ฉด ๋ฆฌ๋ ๋๋ง์ ์์ธ์ ํ์ธํด์ผํ๋ค!
๐ ๋ฆฌ๋ ๋๋ง์ ์ผ๊ธฐํ๋ ์์ธ
- setState์ ์ํ state ๋ณ๊ฒฝ
- ์์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ Props์ ๋ณ๊ฒฝ
- ์์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง ⇒ ํ์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง
- Provider์ value prop๊ฐ ๋ฐ๋ ๋, Context.Provider ํ์์์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง (ContextAPI ๊ณต๋ถํ์)
- ๋ฆฌ๋์ค ์คํ ์ด์ state์ ๋ณ๊ฒฝ ๋ฐ์ ์, useSelector๋ฅผ ์ฌ์ฉํด์ ๋ฆฌ๋์ค ์คํ ์ด์ state๋ฅผ ์กฐํํ๋ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง (๋ฆฌ๋์ค ๊ณต๋ถํ์)
๐ ํจ์ํ ์ปดํฌ๋ํธ ์์
[ App.js ]
import { Fragment } from "react";
import StateComponent from "./component/StateComponent.js";
import CountComponent from "./component/CountComponent.js";
import ClassComponent from "./component/ClassComponent.js";
function App() {
return (
<Fragment>
<StateComponent />
<CountComponent />
<ClassComponent name="๊ธธ๋์" age={20}/>
</Fragment>
)
}
export default App;
[StateComponent.js]
import { useState } from "react";
function StateComponent() {
//useState๋ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํ ์ ์๋ hook
//๋ฐํ์ด ๋ฐฐ์ด์ด๊ณ [0]๋ฒ์งธ์ ํ์ฌ๋ฐ์ดํฐ, [1]๊ฐ์ ๋ณ๊ฒฝํ๋ setterํจ์๋ฅผ ๋ฐํํจ
let [data, setData] = useState('์ด๊ธฐ๊ฐ');
let [msg, setMsg] = useState('black');
// let data = result[0]; //data
// let setData = result[1]; //fun
let enter = () => {
//data = "์ด๋ ๊ฒ ๊ฐ์ ๋ฐ๊พธ๋ฉด?"; //๊ฐ์ ์ง์ ๋ฐ๊พธ๋ ๊ฒ์ ํ์ฉํ์ง ์์.
setData("์ด๋ ๊ฒ ๊ฐ์ ๋ฐ๊พธ๋ ๊ฑฐ์"); //๊ฐ์ ๋ณ๊ฒฝํ๋ setterํจ์ -> ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ change, ๋ฆฌ๋ ๋๋ง ์ํ
}
return (
<div>
ํ์ฌ ๋ฐ์ดํฐ {data}
<br/>
๊ฐ ๋ณ๊ฒฝํ๊ธฐ <button onClick={enter}>์
์ฅ</button>
<br/>
๊ฐ ๋ณ๊ฒฝํ๊ธฐ <button onClick={() => setData("ํด์ฅํ์ต๋๋ค") }>ํด์ฅ</button>
<br/>
<h3 style={{color: msg}}>{msg}</h3>
<button onClick={ () => setMsg('red') }>๋ถ์์</button>
<button onClick={ () => setMsg('green') }>ํธ๋ฅธ์</button>
<button onClick={ () => setMsg('yellow') }>๊ทธ ์ฌ์ด 3์ด ์งง์์</button>
</div>
)
}
export default StateComponent;
//useState๋ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํ ์ ์๋ hook
//๋ฐํ์ด ๋ฐฐ์ด์ด๊ณ [0]๋ฒ์งธ์ ํ์ฌ๋ฐ์ดํฐ, [1]๊ฐ์ ๋ณ๊ฒฝํ๋ setterํจ์๋ฅผ ๋ฐํํจ
let [data, setData] = useState('์ด๊ธฐ๊ฐ');
let [msg, setMsg] = useState('black');
let data = result[0]; //data
let setData = result[1]; //func
ํ์ฌ ๋ฐ์ดํฐ {data}
- ๋ฐ์ดํฐ ์ถ๋ ฅํ๊ธฐ
let enter = () => {
//data = "์ด๋ ๊ฒ ๊ฐ์ ๋ฐ๊พธ๋ฉด?"; //๊ฐ์ ์ง์ ๋ฐ๊พธ๋ ๊ฒ์ ํ์ฉํ์ง ์์.
setData("์ด๋ ๊ฒ ๊ฐ์ ๋ฐ๊พธ๋ ๊ฑฐ์"); //๊ฐ์ ๋ณ๊ฒฝํ๋ setterํจ์ -> ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ change, ๋ฆฌ๋ ๋๋ง ์ํ
}
- ๊ฐ์ ์ง์ ๋ฐ๊พธ๋ฉด ์๋๊ณ
- ๊ฐ์ ๋ณ๊ฒฝํ๋ setter ํจ์๋ฅผ ๊ฑฐ์น๋ค.
๊ฐ ๋ณ๊ฒฝํ๊ธฐ <button onClick={enter}>์
์ฅ</button>
<br/>
๊ฐ ๋ณ๊ฒฝํ๊ธฐ <button onClick={() => setData("ํด์ฅํ์ต๋๋ค") }>ํด์ฅ</button>
<br/>
- ๋ฒํผ์ด ๋๋ฆฌ๋ฉด enter ํจ์๊ฐ ์คํ๋๋ฉด์ data ๊ฐ์ด ๋ฐ๋๋ค.
- ์ธ๋ผ์ธ ํจ์๋ก ๋ฐ๋ก ์ต๋ช ํจ์ ์์ฑํด์ setData("๋ณ๊ฒฝ๊ฐ") ์ผ๋ก data ๊ฐ์ ๋ณ๊ฒฝํด์ค๋ค.
<h3 style={{color: msg}}>{msg}</h3>
<button onClick={ () => setMsg('red') }>๋ถ์์</button>
<button onClick={ () => setMsg('green') }>ํธ๋ฅธ์</button>
<button onClick={ () => setMsg('yellow') }>๊ทธ ์ฌ์ด 3์ด ์งง์์</button>
let [msg, setMsg] = useState('black');
- ์์ ๋ณ๊ฒฝ์ ์ํ ํ
๋ฒํผ์ ๋๋ฅด๋ฉด setMsg() ๊ฐ ๋์ํ๋ฉด์
<h3>์ color ๊ฐ์ ๋ณ๊ฒฝ์ํจ๋ค.
[CountComponent.js]
import { useState } from "react";
function CountComponent() {
let [cnt, setCount] = useState(0);
//setData(ํจ์);
// setData((prev) => {
// return prev + 1;
// })
return (
<div>
<h3> {cnt} </h3>
<button onClick= { ()=> setCount(cnt + 1)}> ์ฆ๊ฐ </button>
<button onClick= { ()=> setCount(cnt - 1)}> ๊ฐ์ </button>
<button onClick= { ()=> setCount(0)}> ์ด๊ธฐํ </button>
</div>
)
}
export default CountComponent;
๐ ํด๋์คํ ์ปดํฌ๋ํธ [ClassComponent.js]
import { Component } from "react";
class ClassComponent extends Component {
//useState ์ฌ์ฉ ๋ถ๊ฐ
constructor(props) {
// ๋ถ๋ชจ ์์์ ์์ฑ์๋ก ์ฐ๊ฒฐ
super(props);
this.state = {
a : 1
,b : this.props.name
}
// ์ง์ ๋ง๋ค์ด์ค์ผํจ useState ์ฌ์ฉ ๋ถ๊ฐ
}
render() {
let {name, age} = this.props;
let {a, b} = this.state;
return (
<div>
props {name}
props2 {age}
<hr />
props {a}
props2 {b}
</div>
)
}
}
export default ClassComponent;
- class ์์ ๋ฐ๋ ๊ฒฝ์ฐ
- super() ํค์๋๋ ํ์
- this.state ๋ก ์ง์ ๋ง๋ค์ด์ค์ผํ๋ค. (useState ์ฌ์ฉ ๋ถ๊ฐ)
render() ๋ฉ์๋์ ์ญํ
- ์ปดํฌ๋ํธ์ UI๋ฅผ ์ ์: render() ๋ฉ์๋๋ JSX(JavaScript XML)๋ฅผ ๋ฐํํ์ฌ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ์ด๋ป๊ฒ ๋ํ๋ ์ง๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ด JSX๋ React์ ์ํด HTML๋ก ๋ณํ๋์ด ๋ธ๋ผ์ฐ์ ์ ํ์๋ฉ๋๋ค.
- ๋์ ๋ฐ์ดํฐ ํ์: render() ๋ฉ์๋ ๋ด๋ถ์์ ์ปดํฌ๋ํธ์ props(๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ ๋ฐ์ดํฐ)์ state(์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ์ํ)๋ฅผ ์ฌ์ฉํด ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํฉ๋๋ค.
- ์๋ ์ ๋ฐ์ดํธ: render() ๋ฉ์๋๋ ์ปดํฌ๋ํธ์ ์ํ๋ props๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค React์ ์ํด ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ์ด๋ก ์ธํด UI๊ฐ ์ต์ ์ํ๋ฅผ ๋ฐ์ํ๋๋ก ์ ์ง๋ฉ๋๋ค.