안녕하세요!

FE 개발자 유진주입니다.

Web/React

[처음 만난 리덕스] 6. Redux와 UI

ypearl 2023. 12. 25. 05:23

Redux와 UI 관계

= 관계가 없다!

 

Redux는 독자적인 자바스크립트 라이브러리로,

사용자에게 보이는 UI가 없이도 사용 가능하다.

(따라서, 본래 React외에 NGULAR나 Vue와도 함꼐 사용가능하나

애초에 React와 궁합이 잘 맞도록 설계되었기에 React와 함께 사용하는 경우가 대부분이다.)

 

 

Redux와 UI 연동

1. Redux Store 생성

2. Store가 UI 업데이트(재렌더링)를 구독(subscription) 목록에 추가

3. UI 업데이트 과정

    1) 현재 Redux Store의 데이터(state)를 가져옴

    2) 가져온 데이터 중 UI에서 필요로 하는 데이터만 추출

    3) 추출한 데이터를 사용해서 UI 업데이트

4. 필요한 경우 초기 UI 렌더링

5. UI 입력이 발생한 경우 Action을 Dispatch해서 UI 업데이트

 

Redux와 UI 연동

 

 

→ Redux는 UI의 종류와 상관없이 동일한 방식으로 작동!

 

 

[실습] 신호등 애플리케이션 만들기

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>처음 만난 리덕스 - 신호등</title>
</head>
<body>
    <div style="display: flex; gap: 16px">
        <div
            id="red-light"
            style="width: 56px; height: 56px; border-radius: 100%"
        ></div>
        <div
            id="orange-light"
            style="width: 56px; height: 56px; border-radius: 100%"
        ></div>
        <div
            id="green-light"
            style="width: 56px; height: 56px; border-radius: 100%"
        ></div>
    </div>

    <div style="margin-top: 16px">
        <button id="turn-on-red-button">빨간불 켜기</button>
        <button id="turn-on-orange-button">주황불 켜기</button>
        <button id="turn-on-green-button">초록불 켜기</button>
    </div>

    <script>
        // Action Types
        var ACTION_TYPE_TURN_ON_RED = "TURN_ON_RED";
        var ACTION_TYPE_TURN_ON_ORANGE = "TURN_ON_ORANGE";
        var ACTION_TYPE_TURN_ON_GREEN = "TURN_ON_GREEN";

        // Action Creators
        function turnOnRedActionCreator(text){
            return {
                type:ACTION_TYPE_TURN_ON_RED,
            };
        }
       
        function turnOnOrangeActionCreator(text){
            return {
                type:ACTION_TYPE_TURN_ON_ORANGE,
            };
        }

        function turnOnGreenActionCreator(text){
            return {
                type:ACTION_TYPE_TURN_ON_GREEN,
            };
        }

        var initialState = {
            red: false,
            orange: false,
            green: false,
        };

        // Reducer
        function lightsReducer(state = initialState, action){
            switch (action.type){
                case ACTION_TYPE_TURN_ON_RED:
                    return {
                        ...initialState,
                        red: true,
                    };
                case ACTION_TYPE_TURN_ON_ORANGE:
                    return {
                        ...initialState,
                        orange: true,
                    };
                case ACTION_TYPE_TURN_ON_GREEN:
                    return {
                        ...initialState,
                        green: true,
                    };
                default:
                    return state;
            }
        }

        // Create Redux Store
        var store = Redux.createStore(lightsReducer);

        var redLightElem = document.getElementById("red-light");
        var orangeLightElem = document.getElementById("orange-light");
        var greenLightElem = document.getElementById("green-light");

        // UI update function
        function render() {
            if (store.getState().red){
                redLightElem.style.backgroundColor="red";
            }else {
                redLightElem.style.backgroundColor="gray";
            }
           
            if (store.getState().orange){
                orangeLightElem.style.backgroundColor="orange";
            }else {
                orangeLightElem.style.backgroundColor="gray";
            }
            if (store.getState().green){
                greenLightElem.style.backgroundColor="green";
            }else {
                greenLightElem.style.backgroundColor="gray";
            }
        }

        // Initial rendering
        render();

        // UI update subscribe Redux Store
        store.subscribe(render);

        // UI event(click) listeners for dispatching Redux Action
        document
            .getElementById("turn-on-red-button")
            .addEventListener("click", function(){
                store.dispatch(turnOnRedActionCreator());
            });
           
        document
            .getElementById("turn-on-orange-button")
            .addEventListener("click", function(){
                store.dispatch(turnOnOrangeActionCreator());
            });

        document
            .getElementById("turn-on-green-button")
            .addEventListener("click", function(){
                store.dispatch(turnOnGreenActionCreator());
            });

    </script>
</body>
</html>

 

 

 

실행 결과