TIL

React_useDispatch, useSelector

minnjeong 2023. 4. 29. 16:25

 

 

๐Ÿ“Œ ๋ฆฌ๋•์Šค์˜ ํ๋ฆ„

 

 

 

UI : ์ปดํฌ๋„ŒํŠธ (App.jsx)

 

  • UI์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ฆญ ์ด๋ฒคํŠธ)
  • ์ค‘์•™ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์†Œ(Store)์— ์žˆ๋Š” State ๊ฐ’์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค ๋ผ๋Š” ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค.
  • Dispatch๊ฐ€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค. action ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  store์— ๋ฐฉ๋ฌธํ•œ๋‹ค.
  • ์ค‘์•™ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์†Œ์— action์„ ์š”์ฒญํ•˜๋Š”, action์„ ๋˜์ ธ์ฃผ๋Š” ๋†ˆ์ด Dispatch๋‹ค.
  • action์€ type๊ณผ payload๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • store๋Š” action๊ฐ์ฒด์— ์žˆ๋Š” type์— ๋”ฐ๋ผ state๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.

 

 

 

 

 

๐Ÿ“Œ ๋ฆฌ๋“€์„œ์—๊ฒŒ ๋ณด๋‚ผ ๋ช…๋ น ๋งŒ๋“ค๊ธฐ

 

๋ฆฌ๋“€์„œ์—์„œ ๋‚ด๊ฐ€ ์–ด๋–ค Action์„ ํ•˜๊ธธ ์›ํ•œ๋‹ค ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ํ–‰๋™์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค. = ์•ก์…˜ ๊ฐ์ฒด

 

์•ก์…˜ ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ Type์ด๋ผ๋Š” key๋ฅผ ๊ฐ€์ง„๋‹ค. โœ๏ธ

์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌ๋“€์„œ์—๊ฒŒ ๋ณด๋ƒˆ์„ ๋•Œ ๋ฆฌ๋“€์„œ๋Š” ๊ฐ์ฒด ์•ˆ์—์„œ type์ด๋ผ๋Š” key๋ฅผ ๋ณด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 

๐Ÿ“Œ ๋ช…๋ น(์•ก์…˜ ๊ฐ์ฒด) ๋ณด๋‚ด๊ธฐ

 

์•ก์…˜๊ฐ์ฒด๋ฅผ ๋ฆฌ๋“€์„œ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ useDispatch๋ผ๋Š” ํ›…์„ ์‚ฌ์šฉํ•œ๋‹ค.

react-redux์—์„œ importํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌ๋“€์„œ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ›…์ด๋‹ค.

 

// src/App.js


import React from "react";
import { useDispatch } from "react-redux"; // import ํ•ด์ฃผ์„ธ์š”.

const App = () => {
  const dispatch = useDispatch(); // dispatch ์ƒ์„ฑ
  return (
    <div>
      <button>+ 1</button> {/* ๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”. */}
    </div>
  );
};

export default App;

 

๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ +1 ์ด ๋˜๋Š” ์•ก์…˜๊ฐ์ฒด๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด

 

// src/App.js

import React from "react";
import { useDispatch } from "react-redux"; // import ํ•ด์ฃผ์„ธ์š”.

const App = () => {
  const dispatch = useDispatch(); // dispatch ์ƒ์„ฑ
  return (
    <div>
      <button
		// ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€
        onClick={() => {
		// ๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ dispatch๊ฐ€ ์‹คํ–‰๋˜๊ณ , ()์•ˆ์— ์žˆ๋Š” ์•ก์…˜๊ฐ์ฒด๊ฐ€ ๋ฆฌ๋“€์„œ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
          dispatch({ type: "PLUS_ONE" }); 
        }}
      >
		+ 1
      </button>
    </div>
  );
};

export default App;

 

 

๐Ÿ“Œ useSelector๋กœ ๋ณ€๊ฒฝ๋œ stater๊ฐ’ ํ™•์ธํ•˜๊ธฐ

 

// src/App.js

import React from "react";
import { useDispatch, useSelector } from "react-redux";

const App = () => {
  const dispatch = useDispatch();

	// ๐Ÿ‘‡ ์ฝ”๋“œ ์ถ”๊ฐ€
  const number = useSelector((state) => state.counter.number); 

  console.log(number); // ์ฝ˜์†” ์ถ”๊ฐ€
  return (
    <div>
	{/* ๐Ÿ‘‡ ์ฝ”๋“œ ์ถ”๊ฐ€ */}
      {number}
      <button
        onClick={() => {
          dispatch({ type: "PLUS_ONE" });
        }}
      >
        + 1
      </button>
    </div>
  );
};

export default App;

 

 

 

๐Ÿ“Œ ์ •๋ฆฌ

 

  • ์•ก์…˜๊ฐ์ฒด๋ž€, ๋ฐ˜๋“œ์‹œ type์ด๋ž€ key๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. ๋˜ํ•œ ๋ฆฌ๋“€์„œ๋กœ ๋ณด๋‚ผ “๋ช…๋ น"์ด๋‹ค.
  • ๋””์ŠคํŒจ์น˜๋ž€, ์•ก์…˜๊ฐ์ฒด๋ฅผ ๋ฆฌ๋“€์„œ๋กœ ๋ณด๋‚ด๋Š” “์ „๋‹ฌ์ž” ํ•จ์ˆ˜์ด๋‹ค.
  • ๋ฆฌ๋“€์„œ๋ž€, ๋””์ŠคํŒจ์น˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜๊ฐ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ์กฐ๊ฑด์ด ์ผ์น˜ํ–ˆ์„ ๋•Œ ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” “๋ณ€ํ™”๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”" ํ•จ์ˆ˜์ด๋‹ค.
  • ๋””์ŠคํŒจ์น˜(dispatch)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” useDispatch() ๋ผ๋Š” ํ›…์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ๋””์ŠคํŒจ์น˜๋Š” ์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
    • ์šฐ์„ , ๋””์ŠคํŒจ์น˜๋Š” ์•ก์…˜์„ ๋ฐœ์ƒ ์‹œํ‚ค๋Š” ๊ฒƒ ์ •๋„๋กœ ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • dispatch ๋ผ๋Š” ํ•จ์ˆ˜์—๋Š” ์•ก์…˜์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.. dispatch(action) ์ด๋Ÿฐ์‹์œผ๋กœ ๋ง์ด์ฃ .
  • ์•ก์…˜๊ฐ์ฒด type์˜ value๋Š” ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค. (JS์—์„œ ์ƒ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฃฐ์ด ์žˆ์Œ)