2/6

๐Ÿ“ ํ•  ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 19์ผ์ฐจ

 

โœ… ํ•œ ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 19์ผ์ฐจ

์˜ค๋Š˜์˜ ๊ณผ์ œ๋Š” ์ฒดํฌ๋ฐ•์Šค ์ „์ฒด์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

 

  1. ์ „์ฒด์„ ํƒ ์ฒดํฌ์‹œ ๋ชจ๋“  ์ž์‹ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ฒดํ‚น๋ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  ์ž์‹ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ฒดํ‚น์‹œ ์ „์ฒด ์„ ํƒ ๋ฐ•์Šค๊ฐ€ ์ฒดํ‚น๋ฉ๋‹ˆ๋‹ค.
  3. ์ž์‹ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์ฒดํ‚น๋˜์ง€ ์•Š์€๊ฒŒ ์žˆ๋‹ค๋ฉด, ์ „์ฒด ์ฒดํฌ๋ฐ•์Šค์˜ ์ฒดํฌ๋„ ํ’€๋ฆฝ๋‹ˆ๋‹ค.

์œ„์˜ ์„ธ ๊ฐœ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋๋‹ค

์ข€ ๋ณต์žกํ•ด์„œ ๊ตฌ๊ธ€๋ง์„ ์ฐธ๊ณ ํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค

 

 

 

 

 

 

 

2/7

๐Ÿ“ ํ•  ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 20์ผ์ฐจ

 

โœ… ํ•œ ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 20์ผ์ฐจ

์˜ค๋Š˜์˜ ๊ณผ์ œ๋Š” `useCustomMutation` ํ›…๊ณผ `useCustomQuery` ํ›…์œผ๋กœ todolist ๊ตฌํ˜„ํ•˜๊ธฐ

 

  1. ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋žœ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ํˆฌ๋‘๋ฆฌ์ŠคํŠธ์— ์ƒˆ๋กœ์šด todo ๋ฅผ **์ถ”๊ฐ€**ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํˆฌ๋‘๋ฆฌ์ŠคํŠธ์˜ todo๋ฅผ **์‚ญ์ œ**ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค `refetch`๋ฅผ ํ•˜์—ฌ **์ˆ˜์ •์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ ๋ฐ˜์˜**๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋„ค๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค

useCustomQuery ๋Š” ๋”ฐ๋กœ ์‹ ๊ฒฝ ์“ธ ๊ฒŒ ์—†์–ด์„œ ์–ด๋ ต์ง„ ์•Š์•˜๋Š”๋ฐ useCustomMutation ๋Š” ์ˆ˜์ •, ์‚ญ์ œ, ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ๋Š” ํ›…์ด๋ผ์„œ ๋“ค์–ด์˜ฌ input ์„ ๊ด€๋ฆฌํ•ด์คฌ์–ด์•ผ ํ–ˆ๋‹ค

๋‹ค๋ฅธ ํŒ€์›ํ•œํ…Œ ๋ฌผ์–ด๋ด์„œ ํ•ด๊ฒฐํ–ˆ๋Š”๋ฐ ๊ณผ์ œ์˜ ์˜๋„๋Œ€๋กœ ํ’€์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์•„ ์กฐ๊ธˆ ์ฐ์ฐํ–ˆ๋‹ค

interface IUseCustomMutationReturn {
  addLoading: boolean;
  setAddLoading: Dispatch<SetStateAction<boolean>>;
  mutate: (input: string) => Promise<any>;
}

const useCustomMutation = (
  mutationFn: (input: string) => Promise<any>
): IUseCustomMutationReturn => {
  const [addLoading, setAddLoading] = useState(false);
  const mutate = (input: string) => {
    if (mutationFn === postTodos) {
      setAddLoading(true);
      return postTodos(input);
    } else return deleteTodos(input);
  };
  return { addLoading, setAddLoading, mutate };
};

 

 

 

 

 

 

 

2/8

๐Ÿ“ ํ•  ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 20์ผ์ฐจ - ์ˆ˜์ •

 

โœ… ํ•œ ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 20์ผ์ฐจ - ์ˆ˜์ •

๊ณผ์ œ๋ฅผ ํ™•์ธํ•ด์ฃผ๋Š” ํŒ€์›๋ถ„์ด ์–ด์ œ ํ‘ผ ๊ณผ์ œ์— ๋Œ€ํ•ด ์ฐœ์ฐœํ–ˆ๋˜ ๋ถ€๋ถ„์€ ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ ์ฐ์–ด์ฃผ์…จ๋‹ค

๋‹ค๋ฅธ ํŒ€์›์˜ ๊ณผ์ œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ•˜๋‹ค๋ณด๋‹ˆ ๊ทธ ๋ถ€๋ถ„๋„ ์ง€์ ์„ ๋ฐ›์•˜๋‹ค

 

const useCustomMutation = (mutationFn: (input: string) => Promise<any>) => {
  const [data, setData] = useState<any>();
  const [isLoading, setIsLoading] = useState(false);

  // then X async await O
  const mutate = async (input: string) => {
    setIsLoading(true);
    const res = await mutationFn(input);
    setData(res);
    setIsLoading(false);
    return res;
  };
  return { data, isLoading, mutate };
};

๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ mutation ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ๊ธฐ์กด์˜ isLoading ๋ฅผ ์“ฐ์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ์„ true ๋กœ ๋ฐ”๊ฟจ๋‹ค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด false ๋กœ ๋ฐ”๊ฟ”์„œ ํ•ด๊ฒฐํ–ˆ๊ณ  then ์ด ์•„๋‹Œ async await ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•ด๊ฒฐํ•ด์คฌ๋‹ค

 

 

 

 

 

 

 

2/9

๐Ÿ“ ํ•  ์ผ

  • ๊ทธ๋ฃน์Šคํ„ฐ๋”” ์›Œํฌ์ƒต ๋ฐœํ‘œ ์ž๋ฃŒ ์ •๋ฆฌํ•˜๊ธฐ

 

โœ… ํ•œ ์ผ

  • ๊ทธ๋ฃน์Šคํ„ฐ๋”” ์›Œํฌ์ƒต ๋ฐœํ‘œ ์ž๋ฃŒ ์ •๋ฆฌํ•˜๊ธฐ

์˜ค๋Š˜์€ ๊ทธ๋ฃน์Šคํ„ฐ๋”” ์›Œํฌ์ƒต ๋ฐœํ‘œ ์ž๋ฃŒ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๋ฏธ๋‹ˆํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์Œ์ฃผ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์–ด์„œ ํšŒ์˜๋ฅผ ํ–ˆ๋‹ค

๋ฏธ๋‹ˆํ”„๋กœ์ ํŠธ๋Š” ํŠน๋ณ„ํ•œ ๊ฑด ์—†๊ณ  ํŒจ์บ ์˜ ๋ฐฑ์—”๋“œ ํŒ€๊ณผ ๊ฐ™์ด ํ˜‘์—…์„ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‹ค

์ฒ˜์Œ์œผ๋กœ ๋ฐฑ์—”๋“œํŒ€๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜์–ด์„œ ๋‘๊ทผ๋‘๊ทผ ์„ค๋ œ๋‹ค

๋ฐฑ์—”๋“œํŒ€์€ ์ž๋ฐ” ์Šคํ”„๋ง ์–ธ์–ด๋ฅผ ๋ฐฐ์› ๋‹ค๊ณ  ํ–ˆ๋‹ค

์ž๋ฐ”๋ฅผ ์ž˜์€ ๋ชจ๋ฅด์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๊ฐ€๋” ์ •๋‹ต์„ ๋ณด๋А๋ผ ์ฝ”๋“œ๋ฅผ ๋ณธ ์ ์ด ์žˆ์—ˆ๋‹ค

ํ™•์‹คํžˆ js ๋ณด๋‹ค๋Š” ๋‚˜์€ ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฐฑ์—”๋“œ๋‹ˆ๊นŒ ๋ง‰์—ฐํžˆ ์–ด๋ ต๊ฒ ์ง€๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค

์ด๋ฒˆ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๋Œ€๋กœ ๋œ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์„ค๋ Œ ๋งˆ์Œ์ด ์ปธ๋‹ค

์–ด์ œ๋Š” ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ ์•ˆ๋‚ด๋ฅผ ์คŒ์œผ๋กœ ๋“ฃ๊ณ  ํ”„๋ก ํŠธ์—”๋“œ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ๊ฐ„๋‹จํžˆ ์ดˆ๊ธฐ์„ธํŒ… ํšŒ์˜๋ฅผ ํ–ˆ๋‹ค

์–ด๋–ค css ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ณ , ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฑด์ง€ ๋“ฑ๋“ฑ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •ํ–ˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜์€ ๋ฐฑ์—”๋“œํŒ€๊ณผ์˜ ๋งŒ๋‚จ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ๊ฐ€์กŒ๋‹ค

ํ™•์‹คํžˆ ์„œ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•˜๋Š”์ง€ ๋‘๋ฃจ๋ญ‰์ˆ ํ•˜๊ฒŒ ์•Œ๋‹ค๋ณด๋‹ˆ๊นŒ ์กฐ๊ธˆ ์กฐ์‹ฌ์Šค๋Ÿฌ์šด ๋ฉด๋„ ์žˆ๊ณ  ์ง„ํ–‰์ด ์›ํ™œํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค

๊ทธ๋ž˜๋„ ๋ฐฑ์—” ํ”„์—” ๊ฐ ์กฐ์žฅ์ด ์กฐ์œจ์„ ์ž˜ ํ•ด์ฃผ์…”์„œ ๋„ˆ๋ฌด ํŽธํ•˜๊ฒŒ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ ์ฃผ์ œ๋Š” ๊ธˆ์œต์ƒํ’ˆ ์‡ผํ•‘๋ชฐ์ด์—ˆ๋Š”๋ฐ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๋„ ์•„๋‹ˆ๋ผ ๋ฐฑ์—”๋“œ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์„œ ๊ณต๊ณต ์˜คํ”ˆ api ๋ฅผ ํ™œ์šฉํ•˜์—ฌ db ์— ์ €์žฅํ•˜์—ฌ api ๋ฅผ ์ œ์ž‘ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ํšŒ์› ์ •๋ณด๋Š” db ์— ์ €์žฅํ•˜์—ฌ jwt ๋ฐฉ์‹์œผ๋กœ ํ† ํฐ์„ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค

 

 

 

 

 

 

 

2/10

๐Ÿ“ ํ•  ์ผ

  • ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ : ํ”ผ๊ทธ๋งˆ ์ž‘์—…

 

โœ… ํ•œ ์ผ

  • ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ : ํ”ผ๊ทธ๋งˆ ์ž‘์—…

์–ด์ œ์˜ ํšŒ์˜ ์ดํ›„ ์ฐธ๊ณ ํ•  ๋””์ž์ธ ๋ ˆํผ๋Ÿฐ์Šค๋„ ์ฐพ๊ณ  ์–ด๋–ค ์ฃผ์ œ๋กœ ์ง„ํ–‰ํ• ์ง€, ๋ ˆ์ด์•„์›ƒ์€ ์–ด๋–ป๊ฒŒ ์žก์„์ง€ ์–ด๋А์ •๋„ ๊ฐ€๋‹ฅ์ด ์žกํ˜€์„œ ํ”ผ๊ทธ๋งˆ๋กœ ui ๋””์ž์ธ ์ž‘์—…์„ ํ–ˆ๋‹ค

์˜ค๋žœ๋งŒ์— ํ”ผ๊ทธ๋งˆ๋ฅผ ์“ฐ๋ ค๋‹ˆ ์กฐ๊ธˆ ํ—ค๋งธ์ง€๋งŒ ๊ทธ๋ฆฌ ์–ด๋ ค์šด ๊ธฐ๋Šฅ์€ ์—†์–ด์„œ ์“ฐ๋‹ค๋ณด๋‹ˆ ๋‚˜๋ฆ„ ์ ์‘์„ ํ–ˆ๋‹ค

๋””์ž์ธ ์ž‘์—…์€ ์ฃผ๋ง๊นŒ์ง€ ๋งˆ์น˜๊ธฐ๋กœ ํ–ˆ๋‹ค

 

 

 

 

 

 

 

2/12

๐Ÿ“ ํ•  ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 21์ผ์ฐจ, 22์ผ์ฐจ

 

โœ… ํ•œ ์ผ

  • ๋ฆฌ์•กํŠธ ๊ณผ์ œ 21์ผ์ฐจ, 22์ผ์ฐจ

๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋А๋ผ ๋ฐ€๋ฆฐ 21, 22 ์ผ์ฐจ๋ฅผ ํ•œ ๋ฒˆ์— ํ’€์—ˆ๋‹ค

 

 

21์ผ์ฐจ๋Š” react-query๋กœ youtube ๊ฒ€์ƒ‰๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ์˜€๋‹ค

 

  1. `react-query` ๋ฅผ ์‚ฌ์šฉํ•ด์„œ youtube ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ
  2. **์ด๋ฏธ ๊ฒ€์ƒ‰ํ–ˆ๋˜ `keyword` ์— ๋Œ€ํ•ด์„œ๋Š”, ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋žœ๋”๋ง ํ•˜๊ธฐ (๋„คํŠธ์›Œํฌ ์š”์ฒญ ์•„๋ผ๊ธฐ)**
  3. ๋งŒ์•ฝ ๋„คํŠธ์›Œํฌ ์š”์ฒญ **ํ• ๋‹น๋Ÿ‰์„ ์ดˆ๊ณผ**ํ•ด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ ๋ชฉ์—…๋ฐ์ดํ„ฐ๋ฅผ ๋žœ๋”๋งํ•˜๊ธฐ (์˜ˆ์™ธ์ƒํ™ฉ ๋Œ€๋น„ํ•˜๊ธฐ)
  4. ๋นˆ ๋ฌธ์ž์—ด `""` ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด, ๋ชฉ์—…๋ฐ์ดํ„ฐ๋ฅผ ๋žœ๋”๋ง ํ•˜๊ธฐ

์œ„์˜ 4๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ์˜€๋‹ค

 

  const { data, isLoading } = useQuery<ISearchedResult>(
    ["keyword", keyword],
    () => search(keyword)
  );

์œ„์˜ ์ฝ”๋“œ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์คฌ๋Š”๋ฐ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ด์„œ ์ด๊ฒŒ ๋งž๋‚˜ ์‹ถ์„ ์ •๋„์˜€๋‹ค

์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ ๊ณผ์ œ๋ฅผ ํ™•์ธํ•ด์ฃผ์‹œ๋Š” ๋ถ„์ด ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ์…จ๋‹ค

์บ์‹ฑ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ–ˆ๋‹ค

๋ฐ”๋€Œ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ํ‚ค๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ํ•ด๋‹น ํ‚ค๊ฐ’์„ ์บ์‹ฑํ•˜๊ณ  ๋™์ผํ•œ ํ‚ค๊ฐ’์ผ ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋ญ”๊ฐ€ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ์—ˆ๋‚˜๋ณด๋‹ค ์ˆ˜์ •ํ•ด์•ผ๊ฒ ๋‹ค

 

 

 

22์ผ์ฐจ๋Š” Redux toolkit ์„ ์ด์šฉํ•ด์„œ todolist ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค

 

  1. todo list ๊ฐ€ ๋žœ๋”๋ง ๋ผ์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. todo ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”
  3. todo ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”

์œ„ ์„ธ๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋๋‹ค

 

์ตœ๊ทผ recoil ๋งŒ ์ผ๋‹ค๊ณ  redux ๋Š” ์ฃ„๋‹ค ๊นŒ๋จน์–ด์„œ ๋ฆฌ์•กํŠธ ์ˆ˜์—… ๋•Œ ๋ฐฐ์› ๋˜ redux ์ˆ˜์—… ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๋‹ค

 

store.ts

interface TodoState {
  todos: string[];
}

const initialState: TodoState = {
  todos: [],
};

export const todoSlice = createSlice({
  name: "todo",
  initialState,
  reducers: {
    createTodo: (state, action: PayloadAction<string>) => {
      state.todos.push(action.payload);
    },
    deleteTodo: (state, action: PayloadAction<number>) => {
      state.todos.splice(action.payload, 1);
    },
  },
});

export const { createTodo, deleteTodo } = todoSlice.actions;

export default configureStore({
  reducer: {
    todo: todoSlice.reducer,
  },
});

 

app.tsx

 const todo = useSelector((state: any) => state.todo.todos);
  const dispatch = useDispatch();
  const [value, setValue] = useState("");

  const onSubmit = (event: FormEvent<HTMLFormElement>) => {
    event.preventDefault();
    if (value !== "") {
      dispatch(createTodo(value));
      setValue("");
    }
  };

  const onChange = (event: ChangeEvent<HTMLInputElement>) => {
    setValue(event.target.value);
  };

  const onBtnClick = (id: number) => {
    dispatch(deleteTodo(id));
  };

  return (
    <>
      <h1>To Do List</h1>
      <form onSubmit={onSubmit}>
        <input value={value} type="text" onChange={onChange} />
        <button type="submit">Add</button>
      </form>
      <ul>
        {todo.map((todo: string, index: number) => (
          <ToDo key={index} onBtnClick={onBtnClick} text={todo} id={index} />
        ))}
      </ul>
    </>
  );

 

 

 

 

+ Recent posts