4.usestore-ts

usesotre-ts

  • React ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

import { Store, Action, useStore } from 'usestore-ts';

@Store()
class CounterStore {
  count = 0;

  @Action()
  increase() {
    this.count += 1;
  }

  @Action()
  reset() {
    this.count = 0;
  }
}

const counterStore = new CounterStore();

export default function Counter() {
  const [{ count }, store] = useStore(counterStore);

  return (
    <div>
      <p>
        Count:
        {' '}
        {count}
      </p>
      <p>
        <button type="button" onClick={() => store.increase()}>
          Increase
        </button>
        <button type="button" onClick={() => store.reset()}>
          Reset
        </button>
      </p>
    </div>
  )
}
  • ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์Šคํ† ์–ด ํด๋ž˜์Šค์˜ ํ•„์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋ฅผ usestore-ts์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

useSyncExternalStore์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” React Hook์ด๋‹ค. useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot?)

import { useSyncExternalStore } from 'react';
import { todosStore } from './todoStore.js';

function TodosApp() {
  const todos = useSyncExternalStore(todosStore.subscribe, todosStore.getSnapshot);
  // ...
}

์ €์žฅ์†Œ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋‘ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

  1. ํ•จ์ˆ˜ subscribe๋Š” ์Šคํ† ์–ด๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

  2. ํ•จ์ˆ˜ getSnapshot๋Š” ์ €์žฅ์†Œ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ์ฝ์–ด์•ผ ํ•œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • subscribe: ๋‹จ์ผ ์ฝœ๋ฐฑ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„ ์Šคํ† ์–ด์— ๊ตฌ๋…ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์Šคํ† ์–ด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ œ๊ณต๋œ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค. ๊ตฌ๋… ํ•จ์ˆ˜๋Š” ๊ตฌ๋…์„ ์ •๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

  • getSnapshot: ์ปดํฌ๋„ŒํŠธ์— ํ•„์š”ํ•œ ์Šคํ† ์–ด ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ €์žฅ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ getSnapshot์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ์ €์žฅ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋ฐ˜ํ™˜๋œ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ(Object.is์— ์˜ํ•ด ๋น„๊ต๋จ), React๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค.

  • getServerSnapshot(optional): ์Šคํ† ์–ด์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ดˆ๊ธฐ ์Šค๋ƒ…์ƒท์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์„œ๋ฒ„ ๋ Œ๋”๋ง ์ค‘๊ณผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„ ๋ Œ๋”๋ง ์ฝ˜ํ…์ธ ์˜ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ์ค‘์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ์„œ๋ฒ„ ์Šค๋ƒ…์ƒท์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋™์ผํ•ด์•ผ ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ง๋ ฌํ™”๋˜์–ด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ด ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Returns

  • ๋ Œ๋”๋ง ๋กœ์ง์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ† ์–ด์˜ ํ˜„์žฌ ์Šค๋ƒ…์ƒท์ด๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

  • getSnapshot์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ์Šคํ† ์–ด ์Šค๋ƒ…์ƒท์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ ์Šคํ† ์–ด์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒˆ ์Šค๋ƒ…์ƒท์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์บ์‹œ๋œ ๋งˆ์ง€๋ง‰ ์Šค๋ƒ…์ƒท์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๊ตฌ๋… ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด React๋Š” ์ƒˆ๋กœ ์ „๋‹ฌ๋œ ๊ตฌ๋… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ† ์–ด๋ฅผ ๋‹ค์‹œ ๊ตฌ๋…ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ๊ตฌ๋…์„ ์„ ์–ธํ•˜๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated