PureComponent
PureComponent
๋ Component
์ ๋น์ทํ์ง๋ง ๊ฐ์ props์ state์ ๋ํด์ ๋ค์ ๋ ๋๋งํ์ง ์๋๋ค๋ ์ ์์ ๋ค๋ฆ
๋๋ค. ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์๋ก์ด ์ฝ๋์์๋ ํด๋์ค ์ปดํฌ๋ํธ ์ฌ์ฉ์ ์ถ์ฒํ์ง ์์ต๋๋ค.
class Greeting extends PureComponent {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
๋ ํผ๋ฐ์ค
PureComponent
๊ฐ์ props์ state์ ๋ํด์ ๋ค์ ๋ ๋๋งํ์ง ์์ผ๋ ค๋ฉด Component
๋์ PureComponent
๋ฅผ extend ํด์ฃผ์ธ์.
import { PureComponent } from 'react';
class Greeting extends PureComponent {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
PureComponent
๋ Component
์ ๋ชจ๋ API๋ฅผ ์ง์ํ๋ Component
์ ์๋ธํด๋์ค ์
๋๋ค. PureComponent
๋ฅผ extend ํ๋ ๊ฒ์ ๋จ์ํ props์ state๋ฅผ ๋น๊ตํ๋ ์ฌ์ฉ์ shouldComponentUpdate
๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ฉ๋ฒ
ํด๋์ค ์ปดํฌ๋ํธ์์ ๋ถํ์ํ ์ฌ ๋ ๋๋ง ๊ฑด๋๋ฐ๊ธฐ
๋ฆฌ์กํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ๊ฐ ๋ค์ ๋ ๋๋ง ๋ ๋๋ง๋ค ์์ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง ํฉ๋๋ค. ํ์ง๋ง PureComponent
๋ฅผ extend ํ์ฌ ์ props ๋ฐ state๊ฐ ์ด์ props ๋ฐ state์ ๊ฐ๋ค๋ฉด ๋ถ๋ชจ๊ฐ ๋ค์ ๋ ๋๋ง ๋๋๋ผ๋ ์์ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง ๋์ง ์๋๋ก Class component๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
class Greeting extends PureComponent {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์๋ ํญ์ pure rendering ๋ก์ง์ด ์์ด์ผ ํฉ๋๋ค. ์ฆ, props, state ๋ฐ context๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ์ ์ถ๋ ฅ์ ๋ฐํํด์ผ ํฉ๋๋ค. PureComponent
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ด ์๊ตฌ ์ฌํญ์ ์ค์ํ๋ค๊ณ ๋ฆฌ์กํธ์๊ฒ ์๋ฆฌ๋ฏ๋ก props ๋ฐ state๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ React๋ ๋ค์ ๋ ๋๋งํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ ์ค์ธ context๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง ๋ฉ๋๋ค.
์ด ์์ ์์ Greeting
์ปดํฌ๋ํธ๋ name
์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ค์ ๋ ๋๋ง ๋์ง๋ง (props ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์) address
๊ฐ ๋ณ๊ฒฝ๋ ๋์๋ ๋ค์ ๋ ๋๋ง ๋์ง ์์ต๋๋ค (Greeting
์ prop์ผ๋ก ์ ๋ฌ๋์ง ์๊ธฐ ๋๋ฌธ์).
import { PureComponent, useState } from 'react'; class Greeting extends PureComponent { render() { console.log("Greeting was rendered at", new Date().toLocaleTimeString()); return <h3>Hello{this.props.name && ', '}{this.props.name}!</h3>; } } export default function MyApp() { const [name, setName] = useState(''); const [address, setAddress] = useState(''); return ( <> <label> Name{': '} <input value={name} onChange={e => setName(e.target.value)} /> </label> <label> Address{': '} <input value={address} onChange={e => setAddress(e.target.value)} /> </label> <Greeting name={name} /> </> ); }
๋์
PureComponent
ํด๋์ค ์ปดํฌ๋ํธ์์ ํจ์ ์ปดํฌ๋ํธ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ
์๋ก์ด ์ฝ๋์์๋ ํด๋์ค ์ปดํฌ๋ํธ ๋์ ํจ์ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. PureComponent
๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ํด๋์ค ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณํํ ์ ์์ต๋๋ค.
์๋๋ ๊ธฐ์กด ์ฝ๋ ์ ๋๋ค.
import { PureComponent, useState } from 'react'; class Greeting extends PureComponent { render() { console.log("Greeting was rendered at", new Date().toLocaleTimeString()); return <h3>Hello{this.props.name && ', '}{this.props.name}!</h3>; } } export default function MyApp() { const [name, setName] = useState(''); const [address, setAddress] = useState(''); return ( <> <label> Name{': '} <input value={name} onChange={e => setName(e.target.value)} /> </label> <label> Address{': '} <input value={address} onChange={e => setAddress(e.target.value)} /> </label> <Greeting name={name} /> </> ); }
์ด ์ปดํฌ๋ํธ๋ฅผ ํด๋์ค ์ปดํฌ๋ํธ์์ ํจ์ ์ปดํฌ๋ํธ๋ก ๋ณํํ ๋ memo
๋ก ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
import { memo, useState } from 'react'; const Greeting = memo(function Greeting({ name }) { console.log("Greeting was rendered at", new Date().toLocaleTimeString()); return <h3>Hello{name && ', '}{name}!</h3>; }); export default function MyApp() { const [name, setName] = useState(''); const [address, setAddress] = useState(''); return ( <> <label> Name{': '} <input value={name} onChange={e => setName(e.target.value)} /> </label> <label> Address{': '} <input value={address} onChange={e => setAddress(e.target.value)} /> </label> <Greeting name={name} /> </> ); }