State ?
๐ป State๋
: ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ง๊ณ ์๋, ๊ฐ์ฒดํํ์ ์ปดํฌ๋ํธ์ ์ํ๊ฐ์ด๋ฉฐ
ํจ์๋ด์ ์ ์ธ๋ ๋ณ์์ฒ๋ผ ์ปดํฌ๋ํธ ๋ด์์ ์ ์ํ๊ณ ์ฌ์ฉํ๋ฉฐ ๋ณ๊ฒฝ๊น์ง์ํฌ ์ ์๋ ๊ฐ์ฒด.
(state๋ object์ด๊ณ compo์ data๋ฅผ ๋ฃ์ ๊ณต๊ฐ์ด ์๊ณ , ์ด ๋ฐ์ดํฐ๋ ๋ณํจ)
- State๊ฐ ํ์ํ ์ด์
: ์ปดํฌ๋ํธ์์ ์์์์ ๊ทธ ์ํ๊ฐ๋ฐ์ํด์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋๋ง๋ค ํจ์จ์ ์ผ๋ก ํ๋ฉด(UI)์ ๋ํ๋ด๊ธฐ ์ํด์ ํ์.
- State์ Props์ ์ฐจ์ด
: ๋๊ฐ์ฒด ๋ชจ๋ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์ํฅ์ ์ฃผ๋ ์ ๋ณด(์ปดํฌ๋ํธ์ ์์ฑ๊ฐ)๋ฅผ ๊ฐ์ง.
props : (ํจ์์ ๋งค๊ฐ๋ณ์์ฒ๋ผ) ๋ถ๋ชจ๋ก๋ถํฐ props๋ฅผ ๋ฐ๊ณ ,
์ด props๋ ์์๋ฐ์ ์ปดํฌ๋ํธ ๋ด์์ ์์ ๋ถ๊ฐ๋ฅ(์ฝ๊ธฐ์ ์ฉ)
state : (ํจ์๋ด์ ์ ์ธ๋ ๋ณ์์ฒ๋ผ) ์ปดํฌ๋ํธ์ ๋ด๋ถ์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ๋ณํ ์์๊ณ ์ง์ ๋ณ๊ฒฝ๊ฐ๋ฅ
๋ํ, state๋ฅผ ํตํด props๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐ์์ผ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ถ์์ ์๋ํ๋ ์ฆ, ์บก์ํํตํด ์ฝ๋์ ์ฌ์ฉ์ฑ ๋ง๋ฌ
- ํด๋์คํ ์ปดํฌ๋ํธ์์ State๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ
: constructorํจ์๋ฅผ component์ ์ธ๋ฌธ๊ณผ renderํจ์ ์ฌ์ด์ ์์ฑํ์ฌ
dot notations(this.state.~)์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ํน์ฑ์ ์ ๊ทผํ์ฌ ๊ทธ ๊ฐ์ ์ง์
import React from 'react';
class State extends React.Component {
constructor() { //ํจ์
super(); //super๋ฅผ ํธ์ถ
this.state = { //state ๊ฐ์ฒด
color: 'red' //dolor์ key๊ฐ์ผ๋ก 'red' value์ง์
};
}
render() { //ํ๋ฉด์ ๋ํ๋ด๊ณ ์ถ์ JSX์์
return (
<div>
<h1>Class Component | State</h1>
</div>
);
}
}
export default State;
ex) ๊ธ์์
this(ํด๋น์ปดํฌ๋ํธ) .state (์ state๊ฐ์ฒด) .color (์ key=color๊ฐ=red)
import React, { Component } from 'react';
class State extends Component {
constructor() {
super();
this.state = {
color: 'red',
abc: '40px'
};
}
render() {
return (
<div>
<h1 style={{ color: this.state.color, fontSize: this.state.abc }}>
Class Component | State
</h1>
</div>
);
}
}
export default State;
https://lucybain.com/blog/2016/react-state-vs-pros/
state ๋ณ๊ฒฝ
> ๋ถ๋ชจ์ state๋ฅผ props๋ก ์ ๋ฌ๊ฐ๋ฅ
> ์์ ์ state๊ฐ ๋ฐ๊พธ๋ ค๋ฉด this.setState๋ก ๋ณ๊ฒฝ
> event handlerํจ์
์์ compo์์ ๋ถ๋ชจ compo์ state๋ณ๊ฒฝํ๋ ค๋ฉด this.setState ๋ก์ง๋ด๊ธด ํจ์๋ฅผ props๋ก ๋ฐ์์ผํจ
ex) ๋ฒํผํด๋ฆญ event
import React, { Component } from 'react';
class State extends Component {
constructor() {
super();
this.state = {
color: 'red',
};
}
handleColor = () => { // 2.ํ์ฌ compo์ handlecolorํจ์์คํ
this.setState({ // 2-1 setStateํจ์์คํ > blue๋ณ๊ฒฝ
color: 'blue'
})
}
render() { // 3. renderํจ์ํธ์ถ
return ( // 4. ๋ฐ๋state๊ฐ ๋ฐ์ํ์ฌ h1๊ธ์ ์ ๋ณ๊ฒฝ
<div>
<h1 style={{ color: this.state.color }}>Class Component | State</h1>
<button onClick={this.handleColor}>Click</button>
</div> // 1.onclick event๋ฐ์>this.hand~
);
}
}
export default State;
ex2) ์์ inline style(ํ๊ทธ์ ๋ฐ๋ก ์คํ์ผ ์ฃผ๋ ํํ)์ ์ ์ง๋ณด์์ ์ข์ง์์
> state์ ๋ฐ๋ผ className๋ฐ๋๊ฒ ํ์ฌ style๋ณ๊ฒฝ
import React, { Component } from 'react';
class State extends Component {
constructor() {
super();
this.state = {
isRed: true,
};
}
handleColor = () => {
this.setState({
isRed: !this.state.isRed
})
}
render() {
return (
<div>
<h1 className={isRed ? "red" : "blue"}>Class Component | State</h1>
<button onClick={this.handleColor}>Click</button>
</div>
);
}
}
export default State;
ex) ๋ถ๋ชจ์ state > ์์์๊ฒ
// Parent.js
import React from 'react';
import Child from '../pages/Child/Child';
class Parent extends React.Component {
constructor() {
super();
this.state = {
color: 'red'
};
}
render() {
return (
<div>
<h1>Parent Component</h1>
<Child titleColor={this.state.color}/>
</div>
);
}
}
export default Parent;
// Child.js
import React from 'react';
class Child extends React.Component {
render() {
console.log("์ด๊ฐ์๋ญ๊น?", this.props.titleColor);
return (
<div>
<h1 style={{color : this.props.titleColor}}>Child Component</h1>
</div>
);
}
}
export default Child;
> ex) props๋ก state์ event handler๋๊ธฐ๊ธฐ
import React from 'react';
import Child from '../pages/Children/Children';
class Parent extends React.Component {
constructor() {
super();
this.state = {
color: 'red'
};
}
changeColor = () => {
this.setState({
color: 'blue'
})
}
render() {
return (
<div>
<h1>Parent Component</h1>
<Child titleColor={this.state.color} changeColor={this.changeColor}/>
</div>
);
}
}
export default State;
import React from 'react';
class Child extends React.Component {
render() {
// console.log(this.props);
return (
<div>
<h1 style={{color : this.props.titleColor}}>Child Component</h1>
<button onClick={this.props.changeColor}>Click</button>
</div>
);
}
}
export default State;
์ฌ๋ฌ state ๊ด๋ฆฌ
ํ๋์ state๋ฅผ ์ฌ์ฉํด์ ์ฌ๋ฌ state๊ด๋ฆฌํ๊ธฐ
const [title, setTitle] = useState("");
const [amount, setAmount] = useState("");
const [date, setDate] = useState("");
//์์ 3๊ฐ์ state๋ฅผ ํ๋์ state์ ๋ด๋๋ค.
const [userInput, setUserInput] = useState({
title: "",
amount: "",
date: "",
});
title๋ง ๋ณ๊ฒฝํ ๋ ๋๋จธ์ง 2๊ฐ์ state๋ ๊ฐ์ ธ์์ ์์ด๋ฒ๋ฆฌ์ง์๋๋ก ...userInput๋ก ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ณ
์๋ก ์ ๋ฐ์ดํธ๋ ๊ฐ์ ๋ฎ์ด์ด๋ค.
ํ์ง๋ง, ์ด ๋ฐฉ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. (counter manage๊ฐ์ ๊ฒฝ์ฐ)
๋์์ ๋ง์ state๋ฅผ ์ ๋ฐ์ดํฐํ๋ค๋ฉด ์ค๋๋๊ฑฐ๋ ์๋ชป๋ state snapshot์ ์์กดํ ์๋ ์๊ฒ๋๋ค.
const titleChanageHandle = (event) => {
setUserInput({
...userInput, [์ด์ ์ํ์ ์์กด]
title: event.target.value,
});
๋ฐ๋ผ์, '์ด์ state์ ๋ฐ๋ผ state๊ฐ update๋๋ค๋ฉด' setUserInputํจ์๋ฅผ ๋ถ๋ฌ์์ ํจ์๋ฅผ pass in ์์ผ์ผ ํ๋ค.
์ด ๊ฒฝ์ฐ์๋ state๊ฐ ํญ์ ์ต์ ์ํ์ด๋ค. ( ๋ชจ๋ ๊ณํ๋ state update๋ฅผ ๊ธฐ์ต )
const titleChanageHandle = (event) => {
setUserInput((prevState) => {
return { ...prevState, title: event.target.value };
});
state ๋์ด์ฌ๋ฆฌ๊ธฐ
Lifting State Up
ํ์์ component์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์์์ component๋ก pass
1. ์์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ํจ์๋ฅผ ๋ง๋ ๋ค (ํจ์๋ฅผ pointer๋ก data๋ฅผ passํ๋ค.)
2. ๋ง๋ ํจ์๋ฅผ props๋ก ํ์์ ์ปดํฌ๋ํธ๋ก ๋๊ฒจ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ์ค์คํ๋ค.
( ์์-์์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค. ํญ์ ๋จ๊ณ๋ณ๋ก ์ ๊ทผํด์ผํ๋ค.)
์์ ์ปดํฌ๋ํธ App์์ ํ์์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ค.
ํ์์ '๋ฐ์ดํฐ'๋ฅผ ๊ฐ์ ธ์ค๊ธฐ์ํด ๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐํจ์๋ฅผ props๋ก ํ์์ ๋๊ฒจ์ค๋ค.
function App() {
const ๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐํจ์ = (๋ฐ์ดํฐ) => {
console.log(๋ฐ์ดํฐ);
};
return (
<div>
<์์์ปดํฌ๋ํธ ๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐํจ์={๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐํจ์} />
</div>
);
}
ํ์์ปดํฌ๋ํธ์์ props๋ก '๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐํจ์'๋ฅผ๋ฐ์์ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ํจ์์ ์ถ๊ฐํด์ค๋ค.
const ์์ = (props) => {
const ์ด๋คํจ์ = () => {
const ๋ฐ์ดํฐ = {
์ด์ฉ๊ณ ์ ์ฉ๊ณ
};
props.๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐํจ์(๋ฐ์ดํฐ);
};
return...
์์)
const NewExpense = ( ) => {
const saveExpenseDataHandler = (enteredExpenseData) => {
const expenseData = {
...enteredExpenseData,
id: Math.random().toString(),
};
return (
<ExpenseForm onSaveExpenseData={saveExpenseDataHandler} />
);
};
const ExpenseForm = (props) => {
const sumitHandler = (event) => {
event.preventDefault();
const expenseData = {
title: enteredtitle,
amount: enteredamount,
date: new Date(entereddate),
};
props.onSaveExpenseData(expenseData);
setEnteredTitle("");
setEnteredAmount("");
setEnteredDate("");
};
'โข React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Router (0) | 2021.10.24 |
---|---|
[React] React hook basic (0) | 2021.10.21 |
[REACT] Component / Props / Mock data (0) | 2021.09.01 |
[REACT] JSX / Component (0) | 2021.08.30 |
[REACT] React (0) | 2021.08.29 |