๐Ÿ“š Study Note/React

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์ตœ์ ํ™”

Jellll_y 2023. 2. 12. 02:00

๋ฆฌ์•กํŠธ ๋ฆฌ๋ Œ๋”๋ง

1. props, state ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง

2. ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์‹œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง

 

๋ฆฌ์•กํŠธ์—์„œ๋Š” ์œ„์˜ ์กฐ๊ฑด์ผ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ด๊ฒƒ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

React.memo 

React.memo ๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ (HOC) ๋กœ ํ•จ์ˆ˜ & ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

React.memo์„ ํ†ตํ•ด ์ตœ์ ํ™”๋ฅผ ํ•  ๊ฒฝ์šฐ ๋ Œ๋”๋ง์— ๋  ๋•Œ props๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ด์ „

props์—์„œ ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ Œ๋”๋ง์„ ํ•˜๊ณ  ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค๋ฉด ๊ธฐ์กด์— ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

React.memo๋Š” ์˜ค์ง props์˜ ๋ณ€ํ™”์—๋งŒ ์˜์กดํ•˜๋Š” ์ตœ์ ํ™” ๋ฐฉ๋ฒ•!

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— useState, useReducer, useContext๋ฅผ ํ†ตํ•ด state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

funtion App() {
    const [parentAge, setParentAge] = useState(0);
    const [childAge, setChildAge] = useState(0);
    
    const incrementParentAge = () => {
        setParentAge(pre => pre+1)
    }
    
    const incrementChildAge = () => {
        setChildAge(pre => pre+1)
    }
    
    return (
        <div>
            <p>age: {parentAge}</p>
            <button onClick={incrementParentAge}>๋ถ€๋ชจ ๋‚˜์ด ์ฆ๊ฐ€</button>
            <button onClick={incrementChildAge}>์ž์‹ ๋‚˜์ด ์ฆ๊ฐ€</button>
            <Child name={'์ดˆ์ฝ”๋ง›์ ค๋ฆฌ'} age={childAge}/>
        </div>
    )
}
import React from 'react'

function Child ({name, age}) {
    return(
        <div>
            <p>์ด๋ฆ„ : {name}</p>
            <p>๋‚˜์ด : {age}</p>
        </div>
    )
}

export default Child

 

์œ„์˜ ์ฝ”๋“œ๋Š” parentAge๋ฅผ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, Child ์ปดํฌ๋„ŒํŠธ๋„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ณ 

๋งŒ์•ฝ Child ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณต์žกํ•œ ๋กœ์ง์ด ์žˆ์„๊ฒฝ์šฐ ์„ฑ๋Šฅ์˜ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์€ React.memo๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

import React, {memo} from 'react'

function Child ({name, age}) {
    return(
        <div>
            <p>์ด๋ฆ„ : {name}</p>
            <p>๋‚˜์ด : {age}</p>
        </div>
    )
}

export default memo(Child)

 

๊ทธ๋ ‡๋‹ค๋ฉด React.memo๋ฅผ ํ†ตํ•ด์„œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ์ ํ™”ํ•˜๋ฉด ์ข‹์€๊ฒƒ์ธ๊ฐ€?

React.memo๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๋ Œ๋”๋ง ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

React.memo ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ

1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ props๋กœ ์ž์ฃผ ๋ Œ๋”๋ง ๋  ๋•Œ

2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๋ณต์žกํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์•ผ ๋  ๋•Œ

 

useMemo

ํ›…์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์€ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์—ฐ์‚ฐํ•ด ์ฃผ๊ณ  ์•„๋‹ˆ๋ฉด ์—ฐ์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

useMemo(()=> {...},[])

 

funtion App() {
    const [parentAge, setParentAge] = useState(0);
    
    const incrementParentAge = () => {
        setParentAge(pre => pre+1)
    }

    const name = {
        lastName: '์ดˆ์ฝ”๋ง›'.
        firstName: '์ ค๋ฆฌ',
    }

    return (
        <div>
            <p>age: {parentAge}</p>
            <button onClick={incrementParentAge}>๋ถ€๋ชจ ๋‚˜์ด ์ฆ๊ฐ€</button>
            <Child name={name}/>
        </div>
    )
}
import React, {memp} from 'react'

function Child ({name}) {
    return(
        <div>
            <p>์„ฑ : {name.lastName}</p>
            <p>์ด๋ฆ„ : {name.firstName}</p>
        </div>
    )
}

export default memo(Child)

์œ„์˜ ์ฝ”๋“œ๋Š” Child ์ปดํฌ๋„ŒํŠธ์—์„œ name ๋ณ€์ˆ˜๊ฐ€ props๋กœ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Child ์ปดํฌ๋„ŒํŠธ๋Š” React.memo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด! ๋˜‘๊ฐ™์ด parentAge๋ฅผ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ Child ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ 

์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค!! 

 

๊ทธ ์ด์œ ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉด์„œ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋“ค์ด ์ดˆ๊ธฐํ™”๋˜๋Š”๋ฐ 

์ด๋•Œ, name ๋ณ€์ˆ˜ ๋˜ํ•œ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—

props ์ฒดํฌ๋ฅผ ํ–ˆ์„ ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

(name์€ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์•„ ๋ณด์ผ์ง€๋ผ๋„ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค)

const obj = {a : 1}
const obj2 = {a : 1}
console.log(obj === obj2) // false

 

์ด๋•Œ name์— ์•„๋ž˜์™€ ๊ฐ™์ด useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import {useMemo} from 'react'

function App(){
    // ...
    const name = useMaemo(() => {
        return {
             lastName: '์ดˆ์ฝ”๋ง›',
             firstName: '์ ค๋ฆฌ'
         }
     },[])
    // ...
}

 

useCallback

ํ›…์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์€ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์—ฐ์‚ฐํ•ด ์ฃผ๊ณ  ์•„๋‹ˆ๋ฉด ์—ฐ์‚ฐํ•œ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

useCallback(()=>{...},[])
funtion App() {
    const [parentAge, setParentAge] = useState(0);
    
    const incrementParentAge = () => {
        setParentAge(pre => pre+1)
    }
    
    const tellMe = () => {
    	console.log("๋จน์–ด๋ผ")
    }

    return (
        <div>
            <p>age: {parentAge}</p>
            <button onClick={incrementParentAge}>๋ถ€๋ชจ ๋‚˜์ด ์ฆ๊ฐ€</button>
            <Child name={'์ดˆ์ฝ”๋ง›์ ค๋ฆฌ'} tellMe={tellMe}/>
        </div>
    )
}
import React from 'react'

function Child ({name,tellMe}) {
    return(
        <div>
            <p>์ด๋ฆ„ : {name}</p>
            <button onClick={tellMe}>๋ฐฅ ์ฃผ์„ธ์š”</button>
        </div>
    )
}

export default memo(Child)

 

์ด๊ฒƒ๋„ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ๋ฐ›๋Š” tellMe ๋˜ํ•œ ๊ฐ์ฒด์ด๊ณ  ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๋•Œ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์—

React.memo๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ๋Š”  tellMe ํ•จ์ˆ˜์— ์— ์•„๋ž˜์™€ ๊ฐ™์ด useCallback๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import {useCallback} from 'react'

function App(){
    // ...
    const tellMe = useCallback(() => {
        console.log('๋จน์–ด๋ผ')
     },[])
    // ...
}

 

์ •๋ฆฌ

React.memo : HOC์œผ๋กœ ํ•จ์ˆ˜ & ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅ

๋ Œ๋”๋ง์— ๋  ๋•Œ props๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ด์ „ props์—์„œ ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ Œ๋”๋ง์„ ํ•˜๊ณ  ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค๋ฉด

๊ธฐ์กด์— ๋ Œ๋”๋ง ๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

 

useMemo : Hook์œผ๋กœ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•˜๊ณ  ํŠน์ • ๊ฒฐ๊ด๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์€ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฐ’์„ ์—ฐ์‚ฐํ•ด ์ฃผ๊ณ , ๋งŒ์•ฝ์— ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด์ „์— ์—ฐ์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

useCallback : Hook์œผ๋กœ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ 

์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์€ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ, ๋งŒ์•ฝ์— ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด์ „์— ์—ฐ์‚ฐํ•œ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

17. useMemo ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐํ•œ ๊ฐ’ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ · GitBook

17. useMemo ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐํ•œ ๊ฐ’ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์ด๋ฒˆ์—๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•˜์—ฌ ์—ฐ์‚ฐ๋œ ๊ฐ’์„ useMemo๋ผ๋Š” Hook ์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. App ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด co

react.vlpt.us

 

18. useCallback ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ · GitBook

18. useCallback ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ useCallback ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€๋‚œ ์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ useMemo ์™€ ๋น„์Šทํ•œ Hook ์ž…๋‹ˆ๋‹ค. useMemo ๋Š” ํŠน์ • ๊ฒฐ๊ณผ๊ฐ’์„ ์žฌ์‚ฌ์šฉ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, useCallback ์€ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ƒˆ

react.vlpt.us