Small Grey Outline Pointer Redux :: useDispatch / useSelector
본문 바로가기
Dev./React

Redux :: useDispatch / useSelector

by sso. 2022. 10. 5.

 

https://nnuoyos.tistory.com/302

 

저번 포스팅에 이어서

 

 

react redux 공식 문서에 나와있는 대로 사용해준다

 

 

dispatch 함수의 액션은 객체 형태로 되어 있다

dispatch({type: , payload: })

반드시 타입이라는 key가 있어야 하고

액션 안에는 payload 가 있는데 이건 옵션처럼 사용할 수 있다

 

useDispatch를 통해 액션을 던져준 것이다

 

App.js

import { useState } from 'react';
import './App.css';
import { useDispatch } from 'react-redux';

function App() {
  const [counter, setCounter] = useState(0);
  const dispatch = useDispatch()
  const increase = () => {
    dispatch({type: "INCREMENT"})
  setCounter(counter+1);
  };
  return (
    <div>
      <h1>{counter}</h1>
      <button onClick={increase}>증가</button>
    </div>
  );
}

export default App;

 

 

reducer.js

let initialState = {
    count : 0,
}
function reducer(state=initialState, action){
    console.log("액션 확인!", action)
}

export default reducer;

 

 

 

지정해놓은 타입이 나온다

 

 

 

let initialState = {
    count : 0,
}
function reducer(state=initialState, action){
    console.log("액션 확인!", action);
    if(action.type == "INCREMENT"){
        return {...state, count: state.count + 1}
    }
    return {...state}
}

export default reducer;

 

액션 타입이 INCREMENT 이면 객체를 리턴한다

 

리듀서는 스토어를 바꾸는 역할을 하는데 규칙을 바꾼다 (리턴 값으로 바꿔주게 된다)

리듀서는 항상 스테이트 값을 바꿔주게 된다

 

return {...state, count: state.count + 1}

state가 여러개 있을 수도 있고, 내가 모르는 스테이트들은 그대로 유지하되,

count+1 값만 count 스테이트에 변경한다는 뜻

 

스프레드 연산(...)으로 기존의 객체 내용을 복사하고, 새로운 객체에 전달하는 형식으로 사용해야 한다

다른 컴포넌트들에게 값을 전달

 

스토어는 리턴 값을 무조건 받아야하기 때문에 if 에 해당하지 않더라도 리턴값으로 ...state 를 반환해야 한다

리듀서가 행동지침을 들고 있기 때문!

 

회사마다 사용하는 리듀서의 행동지침이 다르기 때문에 

if / switch 등등으로 사용할 수 있다

 

/* switch문으로 행동지침을 작성한다면 */
switch(action.type){
    case "INCREMENT": 
        return {...state, count: state.count + 1}
    default: return {...state}
}

 

 


 

 

 

App.js

/* import { useState } from 'react'; */
import './App.css';
import { useDispatch, useSelector } from 'react-redux';

function App() {
/*   const [counter, setCounter] = useState(0); */
  const dispatch = useDispatch()
  const count = useSelector((state) => state.count);
  const increase = () => {
    dispatch({type: "INCREMENT"})
  /* setCounter(counter+1); */
  };
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={increase}>증가</button>
    </div>
  );
}

export default App;

리덕스를 사용할 것이기 때문에 기존에 사용한 useState는 지워준다

useSelector 는 함수를 매개변수로 받아온다

 

 

 

이제 useState를 사용하지 않고도 실행이 가능하다

 

 

 


 

 

 

새 컴포넌트를 만들어준다

Box 에서도 숫자를 보여주도록 하기

 

 

 

스테이트 값을 가져오고 싶으면 useSelctor 를 사용한다

 

 

Box.js

import React from 'react'
import { useSelector } from 'react-redux'

const Box = () => {
    let count = useSelector((state) => state.count)
    return (
    <div>This is Box{count}</div>
    )
}

export default Box

 

 

 

 

 

이제 다시 Box 내부에 새로운 컴포넌트를 만들어보자

 

 

GrandSonBox.js

import React from 'react'
import { useSelector } from 'react-redux'

const GrandSonBox = () => {
    let count = useSelector((state)=>state.count)
  return (
    <div>GrandSonBox{count}</div>
  )
}

export default GrandSonBox

 

 

Box.js

import React from 'react'
import { useSelector } from 'react-redux'
import GrandSonBox from './GrandSonBox'

const Box = () => {
    let count = useSelector((state) => state.count)
    return (
    <div>
        This is Box{count}
        <GrandSonBox/>
    </div>
    )
}

export default Box

 

 

 

 

이렇게 되면 props로 하나씩 던져주지 않아도 사용 가능하다

 

 

 


 

 

감소되는 버튼도 만들기

 

 

App.js

/* import { useState } from 'react'; */
import './App.css';
import { useDispatch, useSelector } from 'react-redux';
import Box from "./component/Box"

function App() {
/*   const [counter, setCounter] = useState(0); */
  const dispatch = useDispatch()

  const count = useSelector((state) => state.count);

  const increase = () => {
    dispatch({type: "INCREMENT"})
  }
  
  const decrease = () => {
    dispatch({type: "DECREMENT"})
  }

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={increase}>증가</button>
      <button onClick={decrease}>감소</button>
      <Box/>
    </div>
  );
  }  
export default App

 

 

reducer.js

let initialState = {
    count : 0,
}
function reducer(state=initialState, action){
    console.log("액션 확인!", action);
    /* if(action.type == "INCREMENT"){
        return {...state, count: state.count + 1}
    }
    return {...state} */

    /* switch문으로 행동지침을 작성한다면 */
    switch(action.type){
        case "INCREMENT": 
            return {...state, count: state.count + 1}
        case "DECREMENT": 
            return {...state, count: state.count - 1}
        default: return {...state}
    }
}

export default reducer;

 

 

 

 

 

 

 

728x90

'Dev. > React' 카테고리의 다른 글

Redux  (0) 2022.09.30
React :: 배포하기  (0) 2022.09.20
React :: shopping site 만들기 05  (0) 2022.09.20
React :: shopping site 만들기 04  (0) 2022.09.19
React :: shopping site 만들기 03  (1) 2022.09.16

댓글