React : useCallback

[ useCallback ]

const 함수 = ()  => {    }  // 일반함수
const 함수 = useCallback ( () => {       } , [ 의존성배열 ] // 일반함수를 useCallback 으로 memoization 함
→ useCallback  은 일반처리 함수를 Memoizaion 해서 re-rendering 시 함수의 새로운 생성을 막고 메모리의 함수를 호출함
→ 이때, 함수안에 변수들도 같이 memoizaion 하기 때문에  , 변수변경되어있어도 , 함수호출시 저장된  값 처리함(중요)

const 함수 = useCallback ( () => {       } , [  ] // 맨 처음 최초 렌더링시만 함수를 생성함
const 함수 = useCallback ( () => {       } , [ num ] // num 변수의 값이 변할때만, 함수를 새로 생성함
const 함수 = useCallback ( () => {       } , [ num , name  ] // num , name 의 변수의 값이 변할때만, 함수를 새로 생성함

* 함수에서 의존성 배열에 있는 값들이 참조되어 사용되므로, 그 값들이 변하여  리렌더링 될때만 함수를 새로 생성
  (역으로, 다른 상태변수가 변했을때 함수의 재생성 되는것을 막는다.)  

★ useCallback 함수안에서 처리시 ,   현재 상태변수의 값이 무시되고 , memoization 함수 &변수 값이 사용되지만,
    변경시킨 상태변수는 실제변수에도 영향을 받는다.

< app.js>
import React from ‘react’
import {useState , useCallback} from ‘react’

function App()
{
        const [number , setNumber ] = useState(0)   // number = 0 으로 초기화

        const add = useCallback( () => {

            setNumber(number + 1); 
            //  number 는 memoization 된 값을 사용하지만, 실제 number+1 결과를 밖에 있는 실제 number 변수에 반영한다.

        } ,[] );

       
const newSetNumber() => {
             setNumber(100);
        }
        // number 는 0 값으로 저장(memoization) 되어있음 
        // ① [숫자100설정] 클릭 newSetNumber  함수로 number 값이 100 으로 변경 , number 실제 반영됨 ( number = 100)
        // ② [더하기+1]  add 함수 호출시 , 이미  number  = 100  이긴하나,  add 함수에서는 0 으로 저장 되어있는 number 사용,
               setNumber(number+1) 은, 100 + 1 이 아닌 , 0 + 1 로 계산하여  number에는  실제 반영됨 (number = 1)

        const addSycn = useCallback( () =>  {
            setNumber( n => n + 1); 
        }
      // ★★★  자신의 상태변수를 인자로하는 콜백함수로 전달 할 경우 “동기식” 처리가 되며, 
      // 자신의 상태변수를 인자로 가져올때 최신 업데이트된 변수를 가져오므로 memoization 된 함수안에서도
      //  매번 함수를 재생성 하지 않터라도 최근 값으로 처리가 가능하다.

        // 콜백함수를 통해 처리 할 경우, number 는 0 으로 저장(memoization) 되어있지만, 인자 n 은 실제 number 가 
        // 가지고 있는 최신값을 전달하여 , useCallback 함수임에도 불구하고 최신값으로 업데이트가 가능함(동기식)

        // ① [숫자100설정] 클릭 newSetNumber  함수로 number 값이 100 으로 변경 , number 실제 반영됨 ( number = 100)
        // ② [더하기+1 (동기)]  addSync 함수 호출시 , setNumber 콜백함수에서 변수 인자 n 에  number 값 100을  전달함
               setNumber( n => n+1) 100 + 1로 계산하여  number에는  실제 반영됨 (number = 101)

        const output =  () => {
           console.log(number);
        });
        // ① newSetNumber  함수를 통해 number 값이 100 으로 변경하여, number 에 반영
        // ② 정상적으로 100 출력

        const outputCallback = useCallback( () => {
           console.log(number);
        } , [ ]); 

        // ① newSetNumber  함수를 통해 number 값이 100 으로 변경하여, number 에 반영
        // ②  0 출력함  = number 는 100으로 변경되어있으나 , useCallback 으로 함수가 저장될때 number 가 0 이었으므로 
        // 정상 출력을 원한다면, 의존성배열에 [number] 를 주입하면,  number 가 변경 될때 마다 함수를  재생성 되어,
          함수안에서 사용되는 number의 최신 update 된 값을 사용 할 수 있다.

        return (
               <div> 
                                <button onClick={add}>더하기+1 </button>
                                <button onClick={addSycn}>더하기+1 (동기)</button>
                                <button onClick={newSetNumber}>숫자 100설정</button>
                                <button onClick={output}>숫자출력 </button>
                                <button onClick={outputCallback}>숫자출력 </button>
                </div>
        )
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다