React - The Complete Guide

Section 12: React - Behind the Scenes - How React Works

olivia_yj 2022. 11. 29. 07:43

The goals

πŸ’ͺ🏻How Does React Work Behind The Scenes?

✌🏻Understanding the Virtual DOM & DOM Updates

πŸ‘πŸ»Understanding State & State Updates

 

 

 

 

useMemo λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•œ κ°’ μž¬μ‚¬μš©ν•˜κΈ°

μ΄λ²ˆμ—λŠ” μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•˜μ—¬ μ—°μ‚°λœ 값을 useMemoλΌλŠ” Hook 을 μ‚¬μš©ν•˜μ—¬ μž¬μ‚¬μš©ν•˜λŠ” 방법을 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

App μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ‹€μŒκ³Ό 같이 countActiveUsers λΌλŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ, active κ°’이 true μΈ μ‚¬μš©μžμ˜ 수λ₯Ό μ„Έμ–΄μ„œ 화면에 λ Œλ”λ§μ„ ν•΄λ³΄μ„Έμš”.

App.js

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function countActiveUsers(users) {
  console.log('ν™œμ„± μ‚¬μš©μž 수λ₯Ό μ„ΈλŠ”μ€‘...');
  return users.filter(user => user.active).length;
}

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id κ°€ νŒŒλΌλ―Έν„°λ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μ›μ†Œλ§Œ μΆ”μΆœν•΄μ„œ μƒˆλ‘œμš΄ 배열을 λ§Œλ“¬
    // = user.id κ°€ id 인 것을 μ œκ±°ν•¨
    setUsers(users.filter(user => user.id !== id));
  };
  const onToggle = id => {
    setUsers(
      users.map(user =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  const count = countActiveUsers(users);
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
      <div>ν™œμ„±μ‚¬μš©μž 수 : {count}</div>
    </>
  );
}

export default App;

countActiveUsers ν•¨μˆ˜μ—μ„œ μ½˜μ†”μ— λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜λ„λ‘ ν•œ μ΄μœ λŠ”, 이 ν•¨μˆ˜κ°€ ν˜ΈμΆœλ λ•Œλ§ˆλ‹€ μš°λ¦¬κ°€ μ•Œμˆ˜μžˆκ²Œ ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

κ΅¬ν˜„μ„ 마치면 λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚ ν…λ°μš”.

λ‹€λ₯Έ 계정λͺ…을 λˆŒλŸ¬μ„œ μ΄ˆλ‘μƒ‰μœΌλ‘œ λ§Œλ“€λ©΄ ν™œμ„± μ‚¬μš©μž 수 λ˜ν•œ μ—…λ°μ΄νŠΈ 될 κ²ƒμž…λ‹ˆλ‹€.

그런데, μ—¬κΈ°μ„œ λ°œμƒν•˜λŠ” μ„±λŠ₯적 λ¬Έμ œκ°€ ν•œκ°€μ§€ μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ, input 의 값을 λ°”κΏ€λ•Œμ—λ„ countActiveUsers ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€λŠ” 것 μž…λ‹ˆλ‹€.

ν™œμ„± μ‚¬μš©μž 수λ₯Ό μ„ΈλŠ”κ±΄, users 에 λ³€ν™”κ°€ μžˆμ„λ•Œλ§Œ μ„Έμ•Όλ˜λŠ”κ±΄λ°, input 값이 λ°”λ€” λ•Œμ—λ„ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§ λ˜λ―€λ‘œ μ΄λ ‡κ²Œ λΆˆν•„μš”ν• λ•Œμ—λ„ ν˜ΈμΆœν•˜μ—¬μ„œ μžμ›μ΄ λ‚­λΉ„λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μƒν™©μ—λŠ” useMemo λΌλŠ” Hook ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯을 μ΅œμ ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Memo λŠ” "memoized" λ₯Ό μ˜λ―Έν•˜λŠ”λ°, μ΄λŠ”, 이전에 계산 ν•œ 값을 μž¬μ‚¬μš©ν•œλ‹€λŠ” 의미λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

ν•œλ²ˆ μ‚¬μš©ν•΄λ³ΌκΉŒμš”?

App.js

import React, { useRef, useState, useMemo } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function countActiveUsers(users) {
  console.log('ν™œμ„± μ‚¬μš©μž 수λ₯Ό μ„ΈλŠ”μ€‘...');
  return users.filter(user => user.active).length;
}

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id κ°€ νŒŒλΌλ―Έν„°λ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μ›μ†Œλ§Œ μΆ”μΆœν•΄μ„œ μƒˆλ‘œμš΄ 배열을 λ§Œλ“¬
    // = user.id κ°€ id 인 것을 μ œκ±°ν•¨
    setUsers(users.filter(user => user.id !== id));
  };
  const onToggle = id => {
    setUsers(
      users.map(user =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  const count = useMemo(() => countActiveUsers(users), [users]);
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
      <div>ν™œμ„±μ‚¬μš©μž 수 : {count}</div>
    </>
  );
}

export default App;

useMemo μ˜ 첫번째 νŒŒλΌλ―Έν„°μ—λŠ” μ–΄λ–»κ²Œ μ—°μ‚°ν• μ§€ μ •μ˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ„£μ–΄μ£Όλ©΄ 되고 λ‘λ²ˆμ§Έ νŒŒλΌλ―Έν„°μ—λŠ” deps 배열을 λ„£μ–΄μ£Όλ©΄ λ˜λŠ”λ°, 이 λ°°μ—΄ μ•ˆμ— 넣은 λ‚΄μš©μ΄ λ°”λ€Œλ©΄, μš°λ¦¬κ°€ λ“±λ‘ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ 값을 μ—°μ‚°ν•΄μ£Όκ³ , λ§Œμ•½μ— λ‚΄μš©μ΄ λ°”λ€Œμ§€ μ•Šμ•˜λ‹€λ©΄ 이전에 μ—°μ‚°ν•œ 값을 μž¬μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

ν•œλ²ˆ 계정λͺ…듀을 클릭도 해보고, input 을 μˆ˜μ •λ„ ν•΄λ³΄μ„Έμš”.

그럼 μ΅œμ ν™”μ™€ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ ˆμ•½ν•˜κΈ° μœ„ν•œ λ°©μ•ˆμœΌλ‘œ useMemoλ₯Ό μ•„λ¬΄κ³³μ—λ‚˜ μ‚¬μš©ν•  수 μžˆμ§€ μ•Šμ„κΉŒ?

닡은 nej

μ΅œμ ν™”λ₯Ό ν•΄μ£ΌλŠ” λŒ€μ‹ μ— μ–΄λŠμ •λ„μ˜ λΉ„μš©μ΄ μš”κ΅¬λ¨.

κ·Έ λΉ„μš©μ΄λΌν•˜λ©΄ 이전 props값을 κΈ°μ–΅ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것과 비ꡐλ₯Ό ν•˜λŠ” λ™μž‘μ„ ν•΄μ•Ό ν•œλ‹€λŠ” 것!

 

 

useCallback 을 μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ μž¬μ‚¬μš©ν•˜κΈ°

useCallback μ€ μš°λ¦¬κ°€ μ§€λ‚œ μ‹œκ°„μ— λ°°μ› λ˜ useMemo μ™€ λΉ„μŠ·ν•œ Hook μž…λ‹ˆλ‹€.

useMemo λŠ” νŠΉμ • 결과값을 μž¬μ‚¬μš© ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 반면, useCallback μ€ νŠΉμ • ν•¨μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“€μ§€ μ•Šκ³  μž¬μ‚¬μš©ν•˜κ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

이전에 App.js μ—μ„œ κ΅¬ν˜„ν–ˆμ—ˆλ˜ onCreate, onRemove, onToggle ν•¨μˆ˜λ₯Ό ν™•μΈν•΄λ΄…μ‹œλ‹€.

const onCreate = () => {
  const user = {
    id: nextId.current,
    username,
    email
  };
  setUsers(users.concat(user));

  setInputs({
    username: '',
    email: ''
  });
  nextId.current += 1;
};

const onRemove = id => {
  // user.id κ°€ νŒŒλΌλ―Έν„°λ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μ›μ†Œλ§Œ μΆ”μΆœν•΄μ„œ μƒˆλ‘œμš΄ 배열을 λ§Œλ“¬
  // = user.id κ°€ id 인 것을 μ œκ±°ν•¨
  setUsers(users.filter(user => user.id !== id));
};
const onToggle = id => {
  setUsers(
    users.map(user =>
      user.id === id ? { ...user, active: !user.active } : user
    )
  );
};

이 ν•¨μˆ˜λ“€μ€ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§ 될 λ•Œ λ§ˆλ‹€ μƒˆλ‘œ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것 μžμ²΄λŠ” 사싀 λ©”λͺ¨λ¦¬λ„, CPU 도 λ¦¬μ†ŒμŠ€λ₯Ό 많이 μ°¨μ§€ ν•˜λŠ” μž‘μ—…μ€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν•¨μˆ˜λ₯Ό μƒˆλ‘œ μ„ μ–Έν•œλ‹€κ³  ν•΄μ„œ κ·Έ 자체 만으둜 큰 λΆ€ν•˜κ°€ 생길일은 μ—†μ§€λ§Œ, ν•œλ²ˆ λ§Œλ“  ν•¨μˆ˜λ₯Ό ν•„μš”ν• λ•Œλ§Œ μƒˆλ‘œ λ§Œλ“€κ³  μž¬μ‚¬μš©ν•˜λŠ” 것은 μ—¬μ „νžˆ μ€‘μš”ν•©λ‹ˆλ‹€.

κ·Έ μ΄μœ λŠ”, μš°λ¦¬κ°€ λ‚˜μ€‘μ— μ»΄ν¬λ„ŒνŠΈμ—μ„œ props κ°€ λ°”λ€Œμ§€ μ•Šμ•˜μœΌλ©΄ Virtual DOM 에 μƒˆλ‘œ λ Œλ”λ§ν•˜λŠ” 것 μ‘°μ°¨ ν•˜μ§€ μ•Šκ³  μ»΄ν¬λ„ŒνŠΈμ˜ 결과물을 μž¬μ‚¬μš© ν•˜λŠ” μ΅œμ ν™” μž‘μ—…μ„ ν• κ±΄λ°μš”, 이 μž‘μ—…μ„ ν•˜λ €λ©΄, ν•¨μˆ˜λ₯Ό μž¬μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ ν•„μˆ˜μž…λ‹ˆλ‹€.

useCallback 은 μ΄λŸ°μ‹μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

App.js

import React, { useRef, useState, useMemo, useCallback } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function countActiveUsers(users) {
  console.log('ν™œμ„± μ‚¬μš©μž 수λ₯Ό μ„ΈλŠ”μ€‘...');
  return users.filter(user => user.active).length;
}

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = useCallback(
    e => {
      const { name, value } = e.target;
      setInputs({
        ...inputs,
        [name]: value
      });
    },
    [inputs]
  );
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);

  const nextId = useRef(4);
  const onCreate = useCallback(() => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  }, [users, username, email]);

  const onRemove = useCallback(
    id => {
      // user.id κ°€ νŒŒλΌλ―Έν„°λ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μ›μ†Œλ§Œ μΆ”μΆœν•΄μ„œ μƒˆλ‘œμš΄ 배열을 λ§Œλ“¬
      // = user.id κ°€ id 인 것을 μ œκ±°ν•¨
      setUsers(users.filter(user => user.id !== id));
    },
    [users]
  );
  const onToggle = useCallback(
    id => {
      setUsers(
        users.map(user =>
          user.id === id ? { ...user, active: !user.active } : user
        )
      );
    },
    [users]
  );
  const count = useMemo(() => countActiveUsers(users), [users]);
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
      <div>ν™œμ„±μ‚¬μš©μž 수 : {count}</div>
    </>
  );
}

export default App;

주의 ν•˜μ‹€ 점은, ν•¨μˆ˜ μ•ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μƒνƒœ ν˜Ήμ€ props κ°€ μžˆλ‹€λ©΄ κΌ­, deps λ°°μ—΄μ•ˆμ— ν¬ν•¨μ‹œμΌœμ•Ό λœλ‹€λŠ” 것 μž…λ‹ˆλ‹€. λ§Œμ•½μ— deps λ°°μ—΄ μ•ˆμ— ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•˜λŠ” 값을 λ„£μ§€ μ•Šκ²Œ λœλ‹€λ©΄, ν•¨μˆ˜ λ‚΄μ—μ„œ ν•΄λ‹Ή 값듀을 μ°Έμ‘°ν• λ•Œ κ°€μž₯ μ΅œμ‹  값을 μ°Έμ‘° ν•  것이라고 보μž₯ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. props 둜 λ°›μ•„μ˜¨ ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄, 이 λ˜ν•œ deps μ— λ„£μ–΄μ£Όμ–΄μ•Ό ν•΄μš”.

사싀, useCallback μ€ useMemo λ₯Ό 기반으둜 λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, ν•¨μˆ˜λ₯Ό μœ„ν•΄μ„œ μ‚¬μš© ν•  λ•Œ λ”μš± νŽΈν•˜κ²Œ ν•΄μ€€ 것 λΏμ΄μ§€μš”. μ΄λŸ°μ‹μœΌλ‘œλ„ ν‘œν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const onToggle = useMemo(
  () => () => {
    /* ... */
  },
  [users]
);

useCallback μ„ μ‚¬μš© ν•¨μœΌλ‘œμ¨, λ°”λ‘œ μ΄λ€„λ‚Όμˆ˜ μžˆλŠ” λˆˆμ— λ„λŠ” μ΅œμ ν™”λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ‹€μŒ μ˜μƒμ—μ„œ, μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ μ΅œμ ν™” μž‘μ—…μ„ ν•΄μ£Όμ–΄μ•Όλ§Œ μ„±λŠ₯이 μ΅œμ ν™”λ˜λŠ”λ°μš”, κ·Έ 전에, μ–΄λ–€ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ React DevTools λΌλŠ” 것을 μ†Œκ°œλ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μš°μ„ , ꡬ글에 React DevTools λ₯Ό κ²€μƒ‰ν•΄μ„œ 크둬 μ›ΉμŠ€ν† μ–΄μ— λ“€μ–΄κ°„λ’€, 크둬 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ„ μ„€μΉ˜ν•΄μ£Όμ„Έμš”. λ§ν¬

μ„€μΉ˜λ₯Ό ν•˜κ³  λ‚˜λ©΄ λ‹€μŒκ³Ό 같이 React 탭이 개발자 도ꡬ에 λœΉλ‹ˆλ‹€. ν†±λ‹ˆλ°”ν€΄ μ•„μ΄μ½˜μ„ λˆ„λ₯΄κ³ , 'Highlight Updates' λ₯Ό μ²΄ν¬ν•΄μ£Όμ„Έμš”.

이 속성을 ν‚€λ©΄ λ‹€μŒκ³Ό 같이 λ¦¬λ Œλ”λ§ λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμ— μ‚¬κ°ν˜• ν˜•νƒœλ‘œ ν•˜μ΄λΌμ΄νŠΈλ˜μ–΄ λ³΄μ—¬μ§€κ²Œ λ©λ‹ˆλ‹€.

μ§€κΈˆ 보면, input 이 λ°”λ€” λ•Œμ—λ„ UserList μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λ Œλ”λ§μ΄ 되고 μžˆμ§€μš”?

λ‹€μŒ μ˜μƒμ—μ„œλŠ” 이 λ¦¬λ Œλ”λ§μ„ 막아보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

Summary 1.

React -> usually we work with Functional Component which returns JSX syntax

Props-> we can give props to each component 

Whenever we change the state of component, the componenet will be re-evaluated -> the component function executes again

React just brings the latest screen shot and compare it to previous one and if there is some differeces then React deliver it to React DOM because we are using React DOM to render the files.

When we re-evaluate, we run the codes again at the same time functions also + output JSX syntax also.

So to prevent unneccessory re-execution of code, we can use 'React.memo'

but some case that we set the relative value with using '=' then it can't be controlled by 'React.memo', then we can use 'useCallback'

 

Then every time if the App functions runs again whenever the state changes, doesn't this mean that we will re-initialize our code? and re-execute 'useState' over and over again?

 

 

 

 

Sources

https://react.vlpt.us/basic/17-useMemo.html

 

17. useMemo λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•œ κ°’ μž¬μ‚¬μš©ν•˜κΈ° · GitBook

17. useMemo λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•œ κ°’ μž¬μ‚¬μš©ν•˜κΈ° μ΄λ²ˆμ—λŠ” μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•˜μ—¬ μ—°μ‚°λœ 값을 useMemoλΌλŠ” Hook 을 μ‚¬μš©ν•˜μ—¬ μž¬μ‚¬μš©ν•˜λŠ” 방법을 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. App μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ‹€μŒκ³Ό 같이 co

react.vlpt.us

https://academind.com/tutorials/reference-vs-primitive-values

 

Reference vs Primitive Values

Learn why most people copy objects and arrays in JavaScript incorrectly. And why you won't make that mistake!

academind.com

https://velog.io/@ggong/useState-Hook%EA%B3%BC-%ED%81%B4%EB%A1%9C%EC%A0%80

 

useState Hookκ³Ό ν΄λ‘œμ €

전에 기술 면접을 λ³΄λ©΄μ„œ "React hookμ—μ„œ ν΄λ‘œμ €κ°€ μ–΄λ–»κ²Œ μ“°μ΄λŠ”μ§€ μ„€λͺ…ν•΄λ³΄μ„Έμš”" λΌλŠ” μ§ˆλ¬Έμ„ 받은 적이 μžˆμ—ˆλ‹€. λ‚˜λ¦„ λ¦¬μ•‘νŠΈλ₯Ό 였래 썼닀고 μƒκ°ν–ˆλŠ”λ°, ν΄λ‘œμ €μ— λŒ€ν•΄μ„œλ„ 방금 μ„€λͺ…ν–ˆλŠ”λ°..

velog.io

https://yeoulcoding.tistory.com/149#recentEntries

 

[React] ν΄λ‘œμ €μ™€ useState Hooks

Overview React HooksλŠ” React Functional Component(ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ)μ—μ„œ μƒνƒœκ΄€λ¦¬ 및 μ»΄ν¬λ„ŒνŠΈ 생λͺ…μ£ΌκΈ° API(Lifecycle API) λ“± 클래슀 μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μ§€μ›ν–ˆλ˜ κΈ°λŠ₯듀을 μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. ν•¨μˆ˜ν˜•

yeoulcoding.me