react-tada

๐ŸŽ‰react-tada for state management in React

MIT License

Downloads
33
Stars
3

๐ŸŽ‰react-tada

visit website or npm i react-tada

  • react-tada is a library for state management in React.
  • It has a small bundle size.
  • It optimizes rendering using selector functions.
  • It uses a simple tada creator interface that requires no complex explanations.
  • react-tada๋Š” ๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ์ž‘์€ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ์„ค๋ช…์ด ํ•„์š” ์—†๋Š” ๊ฐ„๋‹จํ•œ tada ์ƒ์„ฑ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
npm i react-tada

First create a Tada!

Tada is a hook. Without needing a complicated explanation, you can easily create a Tada. Tada๋Š” hook์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์„ค๋ช… ํ•„์š” ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ Tada๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// jsx
import { tada } from 'react-tada;

const useCountTada = tada({ count: 0 });
// tsx
import { tada } from 'react-tada';

type State {
  count: number;
}

export const useCountTada = tada<State>({ count: 0 });

Then use it in your component and you're done!

You can update the state as simply as setState in useState without needing to create or select a separate set function. However, the state should be updated immutably. ๋ณ„๋„์˜ set ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ ํƒํ•˜์ง€ ์•Š์•„๋„ useState์˜ setState์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ƒํƒœ๋Š” ๋ถˆ๋ณ€์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const useCount = useCountTada.useTada;

function Counter() {
  const [count, setCount] = useCount((state) => state.count);
  const inc = () => {
    setCount((prev) => ({
      ...prev,
      count: prev.count + 1,
    }));
  };

  return (
    <>
      <h2>{count}</h2>
      <button onClick={inc}>+</button>
    </>
  );
}

Separate states using Provider!

You can also use a Provider. The Component within the CountProvider will share separate, distinct count values! Provider๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. CountProvider ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ Component ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ„๋ฆฌ๋œ, ์„œ๋กœ ๋‹ค๋ฅธ count ๊ฐ’์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค!

const CountProvider = useCountTada.TadaProvider;

const App = () => (
  <>
    <CountProvider>
      <Component /> // initial value
      <CountProvider initialState={{ count: 10 }}>
        <Component /> // count: 10
        <CountProvider initialState={{ count: 20 }}>
          <Component /> // count: 20
        </CountProvider>
      </CountProvider>
    </CountProvider>
  </>
);

In this way, you can separate states even in the sub-tree. ์ด์ฒ˜๋Ÿผ ํ•˜์œ„ ํŠธ๋ฆฌ์—์„œ๋„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Example: Simple Counter App

First, create the useCountTada hook using the Tada constructor interface. ๋จผ์ €, tada ์ƒ์„ฑ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ useCountTada ํ›…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

> tada.ts

import { tada } from 'react-tada';

interface CountState {
  count: number;
}

export const useCountTada = tada<CountState>({ count: 0 });

Generate the count state and setCount to update the state. Additionally, add renderCount to check the number of times the component is rendered. count ์ƒํƒœ์™€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  setCount๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด renderCount๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

>  Counter.tsx

const useCount = useCountTada.useTada;

const Counter = () => {
  const [count, setCount] = useCount((state) => state.count);
  const renderCount = useRef(1);

  useEffect(() => {
    renderCount.current += 1;
  });

  return (
    <>
      <div>
        <h2>Counter Component : {count}</h2>
        <button
          onClick={() => {
            setCount((prev) => ({ ...prev, count: prev.count + 1 }));
          }}
        >
          +
        </button>
        <p>Render Count : {renderCount.current}</p>
      </div>
    </>
  );
};

export default Counter;

Finally, create the TadaProvider using the useCountTada hook, then generate the sub-tree structures where you want to separate the state. ๋งˆ์ง€๋ง‰์œผ๋กœ useCountTada ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ TadaProvider๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์€ ํ•˜์œ„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

> CounterPage.tsx

const CountProvider = useCountTada.TadaProvider;

const CounterPage = () => {
  return (
    <>
      <Counter /> // count : 0
      <Counter /> // count : 0
      <CountProvider initialState={{ count: 10 }}>
        <Counter /> // count : 10
        <Counter /> // count : 10
        <CountProvider initialState={{ count: 20 }}>
          <Counter /> // count : 20
        </CountProvider>
      </CountProvider>
    </>
  );
};

export default CounterPage;

By using TadaProvider in this way, you can separate states and prevent specific tree state changes from affecting rendering and other impacts. ์ด์ฒ˜๋Ÿผ TadaProvider๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ํŠธ๋ฆฌ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.