React, useMemo, useCallback

2024. 12. 16. 17:01웹 개발

useMemo

const avg = useMemo(() => getAverage(list), [list]);

 

useCallback

const 함수명 = useCallback(() => {
내용
}, [number]); // number 값이 바뀔 때만 함수 생성

 

Average.jsx

import React, { useState, useMemo, useRef, useCallback } from "react";

const getAverage = (numbers) => { // 평균값 계산 함수
    console.log('계산중...');
    if (numbers.length === 0) return 0; // 배열이 비어 있으면 0 반환
    return numbers.reduce((a, b) => a + b) / numbers.length; // 숫자들의 합을 구하고 평균을 계산
};

const Average = () => {

    const [list, setList] = useState([]);
    const [number, setNumber] = useState("");

    const inputEl = useRef(null); // ref 참조

    // 입력 값이 변경될 때마다 호출되는 함수
    const onChange = useCallback((e) => setNumber(e.target.value), []); // number 값을 상태에 저장

    // 숫자를 리스트에 추가하는 함수
    const onInsert = useCallback(() => {
        if (number === "") return; // 입력값이 빈 문자열인 경우 아무 동작도 하지 않음
        setList((prevList) => [...prevList, parseInt(number)]); // 기존 리스트에 새 숫자 추가
        setNumber("");
        inputEl.current.focus(); // ref 참조
    }, [number, list]); // number 값이 바뀔 때만 함수 생성

    // useMemo 메모이제이션, 리스트의 평균값을 계산
    const avg = useMemo(() => getAverage(list), [list]);

    return (
        <div>
            <input value={number} onChange={onChange} ref={inputEl} />
            <button onClick={onInsert}>등록</button>
            <ul>
                {list.map((value, index) => (
                    <li key={index}>{value}</li>
                ))}
            </ul>
            <div>
                <b>평균값:</b> {avg}
            </div>
        </div>
    );
};

export default Average;

 

https://stackblitz.com/edit/react-basecamp-vuckgrzw?embed=1&file=src%2FAverage.jsx

'웹 개발' 카테고리의 다른 글

React-icons  (0) 2024.12.18
React Playground / playcode.io  (0) 2024.12.18
React, Iteration, 컴포넌트 배열로 반환하기, map  (0) 2024.12.16
React, ScrollBox, Ref, 참조  (0) 2024.12.13
React, useState, Counter.js  (0) 2024.12.13