ํด๋์คํ ์ปดํฌ๋ํธ
→ ํ์ฌ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋์ค์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ์ ์ง๋ณด์ํ๊ฑฐ๋, ํจ์ํ ์ปดํฌ๋ํธ+Hooks๋ก ๋ชปํ๋ ์์ ์ ๊ฒฝ์ฐ ๋ฑ ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์จ์ผํ๋ ์ํฉ ์กด์ฌ
<๊ธฐ๋ณธ ํ์>
import React, {Component} from 'react';
class App extends Component{//classํค์๋ ํ์, Component๋ก ์์ ๋ฐ์์ผํจ
state={//constructor์์ด ๋ฐ๋ก state์ด๊ธฐ๊ฐ ์ค์ ๊ฐ๋ฅ, ๊ฐ์ฒด ํ์monsters:[],
userInput:"",
};
onClick={()=>{//this.setState ํจ์๋ก state ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅthis.setState({number:number+1});
}}
render(){//render()๋ฉ์๋ ํ์const name='react';
return <div className="react">{name}</div>
}
}
<ํจ์ํ vs ํด๋์คํ>
- ํจ์ํ ์ฝ๋
import React from 'react';
function Hello({ color, name, isSpecial }) {
return (
<div style={{ color }}>
{isSpecial && <b>*</b>}
์๋
ํ์ธ์ {name}
</div>
);
}
Hello.defaultProps = {
name: '์ด๋ฆ์์'
};
export default Hello;
- ํด๋์คํ ์ฝ๋
import React, { Component } from "react";
class Hello extends Component {
static defaultProps = {
name: "์ด๋ฆ์์",
};
render() {
const { color, name, isSpecial } = this.props;
return (
<div style={{ color }}>
{isSpecial && <b>*</b>}
์๋
ํ์ธ์ {name}
</div>
);
}
}
export default Hello;
[ํด๋์คํ ์ปดํฌ๋ํธ ํน์ง]
- render() ๋ฉ์๋ ๊ผญ ์กด์ฌํด์ผํจ (ํด๋น ๋ฉ์๋์์ ๋ ๋๋งํ๊ณ ์ถ์ JSX ๋ฐํ)
- props ์กฐํ ํ ๋, this.props ๋ก ์กฐํ
- defaultProps๋ฅผ ์ค์ ํ๋ ๊ฒ์ ํจ์ํ๊ณผ ๋๊ฐ์ด ํ๊ฑฐ๋, ํด๋์ค ๋ด๋ถ์ static ํค์๋์ ํจ๊ป ์ ์ธ ๊ฐ๋ฅ
- ํด๋์คํ ์ปดํฌ๋ํธ์์ ์ปค์คํ
๋ฉ์๋๋ฅผ ๋ง๋ค ๋, renderํจ์ ๋ด๋ถ์์ ์ ์ธ ๊ฐ๋ฅํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค ์์ ์ปค์คํ
๋ฉ์๋๋ฅผ ์ ์ธ
- ํด๋์ค ๋ด๋ถ์ ์ข ์๋ ํจ์ → “๋ฉ์๋”
- ํด๋์ค์์ ์ปค์คํ ๋ฉ์๋ ๋ง๋ค ๋ ๋ณดํต ์ด๋ฆ์ handle…์ด๋ผ๊ณ ์ง์(๊ผญ ์งํฌ ํ์๋ ์์)
์ปค์คํ ๋ฉ์๋ ๋ง๋ค๊ธฐ
import React, { Component } from "react";
class Counter extends Component {
handleIncrease() {
console.log("increase");
}
handleDecrease() {
console.log("decrease");
}
render() {
return (
<div>
<h1>0</h1>
<button onClick={this.handleIncrease}>+1</button>
<button onClick={this.handleDecrease}>-1</button>
</div>
);
}
}
export default Counter;
โ๏ธthis๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฅด์ผ์ผ ํ๋๋ฐ, ํ์ฌ ๊ตฌํํ ๋ฉ์๋์์ this๋ฅผ ์กฐํํ๋ ค๊ณ ํ๋ฉด ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฅดํค์ง ์๊ฒ๋จ
→ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฉ์๋๋ค์ ์ด๋ฒคํธ๋ก ๋ฑ๋กํ๊ฒ ๋๋ ๊ณผ์ ์์ ๊ฐ ๋ฉ์๋์ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค์ ๊ด๊ณ๊ฐ ๋๊ฒจ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ
→ event handlerํจ์๊ฐ ํธ์ถ๋ ๋์ this๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ ์ธํ ๋ฉ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ์๋๋ผ ์ ์ญ๊ฐ์ฒด(window)๋ฅผ ์๋ฏธ
#TIL19, React | this์ bind()
#TIL19, React | this์ bind()
๊ฐ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ์ต๋๋คState & Event์ ๋ํด ๊ณต๋ถํ๋ ์ค, this์ bind์ ๊ฐ๋ ์ ์ ๋ฆฝํ๊ณ ์ ๊ธฐ๋กํด๋ณธ๋ค.๊ฐ์ฒด์งํฅ ์ธ์ด์์์ ์ผ๋ฐ์ ์ธ this๋ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ง์นญํ์ง๋ง, js์ this๋ ์คํํ ๋์
velog.io
โญ๏ธ ์๋ฆฌ๋จผํธ, ์ธ์คํด์ค
์๋ฆฌ๋จผํธ(Element): ์ค์ ๋ก ํ๋ฉด์ ๋ ๋๋ง ํ DOM ๋ ธ๋๋ค์ ์ ๋ณด๋ฅผ React์๊ฒ ์๋ ค์ฃผ๊ธฐ ์ํ ์๋จ(DOM ์๋ฆฌ๋จผํธ, ์ปดํฌ๋ํธ ์๋ฆฌ๋จผํธ)
- DOM ์๋ฆฌ๋จผํธ: ์๋ฆฌ๋จผํธ์ type์ ํ๊ทธ ์ด๋ฆ์ ํด๋นํ๋ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ(์๋ฌธ์๋ก ์์)
- → React๊ฐ ์ค์ ๋ก ํ๋ฉด์ ๋ ๋๋ง ํ๋ ๋์
- ์ปดํฌ๋ํธ ์๋ฆฌ๋จผํธ: ์๋ฆฌ๋จผํธ์ type์ด ์ปดํฌ๋ํธ ํด๋์ค/ํจ์์ธ ๊ฒฝ์ฐ(๋๋ฌธ์๋ก ์์)
- → ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์ปดํฌ๋ํธ ํํ, ์ ๋ ฅ์ผ๋ก props๋ฅผ ๋ฐ์ผ๋ฉด ๋ ๋๋ง ํ ์จ๋ฆฌ๋จผํธ ํธ๋ฆฌ ๋ฐํ
- ํ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋๋ฐ ์์ด ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ ์ฌ์ฉ ๊ฐ๋ฅ
์ปดํฌ๋ํธ ์ธ์คํด์ค: ํด๋์ค๋ก ์ ์ธ๋ ์ปดํฌ๋ํธ๋ค๋ง ์ธ์คํด์ค๋ฅผ ๊ฐ์ง
- ์ปดํฌ๋ํธ ํด๋์ค ๋ด๋ถ์์ this ํค์๋๋ฅผ ํตํด ์ฐธ์กฐํ๋ ๋์์ ํด๋น
- ํจ์ํ ์ปดํฌ๋ํธ๋ ์ธ์คํด์ค ๊ฐ์ง ์์
[React] ์๋ฆฌ๋จผํธ, ์ปดํฌ๋ํธ, ์ธ์คํด์ค ๊ฐ๋
[React] ์๋ฆฌ๋จผํธ, ์ปดํฌ๋ํธ, ์ธ์คํด์ค ๊ฐ๋
1. ์๋ฆฌ๋จผํธ (Element) ์ค์ ๋ก ํ๋ฉด์ ๋ ๋๋ง ํ DOM ๋ ธ๋๋ค์ ์ ๋ณด๋ฅผ React์๊ฒ ์๋ ค์ฃผ๊ธฐ ์ํ ์๋จ์ด๋ค. DOM ๋ ธ๋ ํน์ ์ปดํฌ๋ํธ๋ฅผ ํํํ๋ JavaScript์ ์ผ๋ฐ ๋ถ๋ณ ๊ฐ์ฒด(Plain Immutable Object)์ ํด๋นํ๋ค.
it-eldorado.tistory.com
[ํด๊ฒฐ ๋ฐฉ๋ฒ]
- ํด๋์ค์ ์์ฑ์ ๋ฉ์๋ constructor์์ bind ์์
ํ๊ธฐ
constructor(props) { super(props); this.handleIncrease = this.handleIncrease.bind(this); this.handleDecrease = this.handleDecrease.bind(this); }- super(props)๋ฅผ ํธ์ถํ๋ ๊ฒ์ ํด๋์ค๊ฐ ์ปดํฌ๋ํธ๋ก์ ์๋ํ ์ ์๋๋ก ํด์ฃผ๋ Component์ชฝ์ ๊ตฌํ๋์ด ์๋ ์์ฑ์ ํจ์ ๋จผ์ ์คํํด์ฃผ๊ณ , ์์ ํ๊ฒ ๋ค๋ ์๋ฏธ
- ํ์ดํ ํจ์ ๋ฌธ๋ฒ ์ฌ์ฉ → ํ์ดํ ํจ์ ์ฌ์ฉํด์ ๋ฉ์๋ ๊ตฌํํ๋ ๊ฒ์ ํด๋์ค์ ํน์ ์์ฑ์ ์ ์ธ ํ ์ ์๊ฒ ํด์ฃผ๋ class-properties ๋ฌธ๋ฒ ์ฌ์ฉ(์ ์ ๋ฌธ๋ฒ ์๋)
handleIncrease = () => {
console.log("increase");
};
handleDecrease = () => {
console.log("decrease");
};
3. onClick์์ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด์ ์ ๋ฌํ๋ ๊ฒ(๋น์ถ์ฒ) → ๋ ๋๋ง ํ ๋๋ง๋ค ํจ์๊ฐ ์๋ก ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์
return (
<div>
<h1>0</h1>
<button onClick={() => this.handleIncrease()}>+1</button>
<button onClick={() => this.handleDecrease()}>-1</button>
</div>
);
}
์ํ ์ ์ธ
- ํด๋์คํ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ด๋ฆฌ ํ ๋์๋ state ์ฌ์ฉ
- → state๋ ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด ํํ
- state์กฐํํ๋ ค๋ฉด this.state๋ฅผ ์กฐํ
import React, { Component } from "react";
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
counter: 0,
};
}
handleIncrease = () => {
console.log("increase");
console.log(this);
};
handleDecrease = () => {
console.log("decrease");
};
render() {
return (
<div>
<h1>{this.state.counter}</h1>
<button onClick={this.handleIncrease}>+1</button>
<button onClick={this.handleDecrease}>-1</button>
</div>
);
}
}
export default Counter;
์ํ ์ ๋ฐ์ดํธ
- ์ํ ์ ๋ฐ์ดํธ ํ ๋์๋ this.setState ํจ์ ์ฌ์ฉ
handleIncrease = () => {
this.setState({
counter: this.state.counter + 1,
});
};
handleDecrease = () => {
this.setState({
counter: this.state.counter - 1,
});
};
→ ํด๋์คํ ์ปดํฌ๋ํธ์ state์์ ๊ฐ์ฒด ํํ์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค๋ฉด, ๋ถ๋ณ์ฑ์ ๊ด๋ฆฌํด์ฃผ๋ฉด์ ์ ๋ฐ์ดํธ ํด์ผํจ
handleIncrease = () => {
this.setState({
counter: this.state.counter + 1,
});
this.setState({
counter: this.state.counter + 1,
});
};
- ์ ์ฝ๋์ ๊ฐ์ด setState๋ฅผ ๋ ๋ฒ ์ฌ์ฉํ๋ฉด์ 1์ ๋ํด์ฃผ๋ ์์ ์ ๋ ๋ฒํ์ง๋ง, ์ค์ ๋ก๋ 2๊ฐ ๋ํด์ง์ง ์์
- → setState๋ฅผ ํ๋ค๊ณ ์ํ๊ฐ ๋ฐ๋ก ๋ฐ๋๋๊ฒ์ด ์๋(๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋จ). setState๋ ๋จ์ํ ์ํ๋ฅผ ๋ฐ๊พธ๋ ํจ์๊ฐ ์๋๋ผ, ์ํ๋ก ๋ฐ๊ฟ๋ฌ๋ผ๊ณ ์์ฒญํด์ฃผ๋ ํจ์
[ํด๊ฒฐ ๋ฐฉ๋ฒ] ์ฝ๋ฐฑํจ์ ๋ฃ์ด์ค
handleIncrease = () => {
this.setState(
{
counter: this.state.counter + 1,
},
() => {
console.log(this.state.counter);
}
);
};