node.js/React.js

[React] Redux 간단 개념 정리

IT공부블로그 2021. 5. 3. 10:43
728x90
반응형

액션 타입


상태를 변화시키는 액션의 타입을 지정

const INCREMENT = 'counter/INCREMENT';

 

액션 객체


상태를 변화시키는 액션객체를 생성

type 값이 필수

{ type: CHANGE_COLOR, color }

 

액션함수


액션객체를 만들기 위한 함수

 

export const changeColor = color => ({ type: CHANGE_COLOR, color });

리듀서


상태를 변화시키는 함수

현재상태와 액션객체를 파라미터로 전달받음

리턴값으로 변경된 상태값을 전달

인풋값과 아웃풋은 항상 동일해야한다

 

export default function counter(state = initialState, action){
    switch(action.type){
        case CHANGE_COLOR:
            return {
                ...state,
                color: action.color
            };
        case INCREMENT:
            return {
                ...state,
                number: state.number + 1,
            };
        case DECREMENT:
            return {
                ...state,
                number: state.number - 1,
            };
        default:
            return state;
    }
}

 

스토어


현재상태와 리듀서 및 내장함수를 포함하고있음

한 어플리케이션에 하나의 스토어만 있는게 좋음 1개 이상 존재 시 리덕스 개발자도구 사용할수없음?

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import { createStore } from 'redux';
import rootReducer from './store/modules';
import { Provider } from 'react-redux';

const devTools = 
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__();
const store = createStore(rootReducer, devTools);
console.log(store.getState());

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>, 
    
    document.getElementById('root')
);
registerServiceWorker();

 

디스패치


상태를 변화시키는 액션 발생시키는 함수

// 액션을 디스패치하는 함수를 만들어서 props로 넣어줍니다.
const mapDispatchToProps = dispatch => ({
    changeColor: color => dispatch(changeColor(color)),
});

 

구독


스토어에서 상태가 변경될때마다 값을 받을수있도록 함수를 전달

react-redux 설치 시 자동으록 구독됨

 

 

컨테이너 컴포넌트


리덕스 스토어와 연결된 컴포넌트

import React, { Component } from 'react';
import { connect } from 'react-redux';
import Palette from '../components/Palette';
import { changeColor } from '../store/modules/counter';

class PaletteContainer extends Component {
    
    handleSelect = color => {
        console.log('handleSelect props: ', this.props);
        console.log('color: ', color);
        const { changeColor } = this.props;
        changeColor(color);
    }

    render(){
        console.log('props: ', this.props);
        const { color } = this.props;
        return <Palette onSelect={this.handleSelect} selected={color}/>;
    }
}


// 컴포넌트에 내려줄 스토어의 state값을 정의
const mapStateToProps = state => ({
    color: state.counter.color,
});

// 액션을 디스패치하는 함수를 만들어서 props로 넣어줍니다.
const mapDispatchToProps = dispatch => ({
    changeColor: color => dispatch(changeColor(color)),
});

export default connect(
    mapStateToProps,
    mapDispatchToProps
)(PaletteContainer);

 

connect 함수에 넘겨주는 파라미터


  • mapStateToProps컴포넌트에서 사용할 state값을 컴포넌트의 props로 내려주는 함수
// 컴포넌트에 내려줄 스토어의 state값을 정의
const mapStateToProps = state => ({
    color: state.counter.color,
});

 

스토어에 가지고있는 전체 상태값이

{

   color: 'red',

   count: 0

}

이라면

 

위처럼 color만 받아와서 컴포넌트에 전달해줄수있다

 

  • mapDispatchToProps
    • 액션을 디스패치하는 함수를 만들어서 props로 내려주는 함수
// 액션을 디스패치하는 함수를 만들어서 props로 넣어줍니다.
const mapDispatchToProps = dispatch => ({
    changeColor: color => dispatch(changeColor(color)),
});

props  changeColor라는 이름의 컬러값을 받아 액션객체를 만들어 디스패치하는 함수를 해당 컴포넌트에 내려줌

 

 

비동기 처리


리덕스에서 네트워크 비동기 처리 같은부분은 액션생성함수 or 미들웨어로 처리

 

 

React-Redux 라이브러리 함수


connect : 컴포넌트를 리덕스 스토어와 연결해주는 함수, HOC 컴포넌트, 클래스 컴포넌트에서만 사용 가능

 

Provider : 리액트 프로젝트를 스토어와 연결하기 위한 컴포넌트

728x90
반응형