ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • React - React Redux 사용해보기
    React 2023. 6. 9. 19:30

    리액트에서는 컴포던트 간에 state를 공유하려면 props로 전달해 주어야 사용할 수 있습니다.

    따라서 상위 컴포넌트에 있는 state를 하위컴포넌트에서 사용하려면 props로 전달해 줘야 합니다.

    이때 연결되어 있는 하위 컴포넌트들이 많아지면 props로 계속 전달해 줘야 하기 때문에

    state의 관리가 어렵고 코드가 복잡해질 수 있습니다.

     

    React Redux는 state를 외부 파일에서 관리하고, props 없이 state를 공유하고 관리할 수 있도록 해줍니다.

    Redux는 리액트뿐만 아니라 다른 곳에서도 사용할 수 있지만 여기서는 리액트에서 사용하기 위해

    React Redux를 연습해 보겠습니다.

    | React Redux 사용

    먼저 React Redux를 설치해 보겠습니다.

    npm install @reduxjs/toolkit react-redux

    state를 관리할 파일인 store.js를 만들어 주고 

    // store.js
    import { configureStore } from "@reduxjs/toolkit";
    
    export default configureStore({
      reducer: {},
    });

    이런 식으로 코드를 넣어주면 되는데 state를 관리하기 위한 기본 세팅이라 생각하면 됩니다.

     

    그리고 사용하려고 하는 앱의 최상위 컴포넌트에 redux의 Provider를 사용하여 감싸주면 됩니다.

    create-react-app으로 파일을 만들었으면 index.js 파일로 들어간 다음에

    // index.js
    import { Provider } from "react-redux";
    import store from "./store";
    
    const root = ReactDOM.createRoot(document.getElementById("root"));
    root.render(
      <Provider store={store}>
        <App />
      </Provider>
    );

    이런 식으로 App컴포넌트를 감싸주면 모든 하위 컴포넌트들과 store.js에 있는 state를 공유할 수 있습니다.

     

    그럼 이제 state를 저장하려면 store.js에 리덕의 createSlice를 사용하여 state를 저장해 주고

    store.js에 configureStore을 이런 식으로 바꿔주면 됩니다.

    // store.js
    import { configureStore } from "@reduxjs/toolkit";
    import { createSlice } from "@reduxjs/toolkit";
    
    export const counterSlice = createSlice({
      name: "number",
      initialState: {
        value: 10,
      },
    });
    
    export default configureStore({
      reducer: {
        counter: counterSlice.reducer,
      },
    });

     

    이제 저장이 완료되었고 외부 리액트 컴포넌트에서 사용하려면

    React Redux의 useSelector를 가져온 다음 이런 식으로 사용하면

    화면에 내가 store에 저장해 놓았던 값인 10이 화면에 출력이 될 겁니다.

    import "./App.css";
    import { useSelector } from "react-redux";
    
    function App() {
      const number = useSelector((state) => state.counter.value);
    
      return (
        <div className="App">
          {number}
        </div>
      );
    }
    
    export default App;

     

    이제 하위 컴포넌트들을 만들고 그 안에 버튼을 만든 다음에

    버튼을 클릭하면 state값이 바뀌도록 만들어보겠습니다.

    먼저 컴포넌트들을 다음과 같이 만들어 보겠습니다.

    function App() {
      const number = useSelector((state) => state.counter.value);
    
      return (
        <div className="App">
          <h1>결과: {number}</h1>
          <First></First>
        </div>
      );
    }
    const First = () => {
      return (
        <div>
          <h1>first</h1>
          <Second />
        </div>
      );
    };
    const Second = () => {
      return (
        <div>
          <h1>second</h1>
          <button>숫자변경</button>
        </div>
      );
    };

     

    그리고 state를 변경하고 싶으면 store.js에서 변경하는 함수를 작성해 주면 됩니다.

    import { configureStore } from "@reduxjs/toolkit";
    import { createSlice } from "@reduxjs/toolkit";
    
    export const counterSlice = createSlice({
      name: "number",
      initialState: {
        value: 10,
      },
      reducers: {
        increment: (state) => {
          state.value += 1;
        },
      },
    });
    
    export const { increment } = counterSlice.actions;
    
    export default configureStore({
      reducer: {
        counter: counterSlice.reducer,
      },
    });

    이런 식으로 createsSlice에 reducers를 만들고 함수를 작성해 주고, 

    export const { increment } = counterSlice.actions; 이런 식으로 밑에서 export 해주면 됩니다.

    여러 개의 함수도 작성할 수 있습니다.

     

    이제 이 함수를 사용하려면 사용하려는 컴포넌트에

    import { useSelector, useDispatch } from "react-redux";
    import { increment } from "./store";
    
    const Second = () => {
      const dispatch = useDispatch();
      return (
        <div>
          <h1>second</h1>
          <button onClick={() => dispatch(increment())}>숫자변경</button>
        </div>
      );
    };

    이런 식으로 useDispatch를 사용하여 state값을 변경할 수 있습니다.

    이제 버튼을 클릭하면 숫자를 변경할 수 있습니다.

    'React' 카테고리의 다른 글

    React - useCallback() 알아보기  (0) 2023.06.16
    React - useMemo() 알아보기  (0) 2023.06.12
    [React] 리액트에서 페이지네이션 연습  (0) 2023.06.05
    [React] 객체 state 다루기  (0) 2023.05.31
    [React] useState() 알아보기  (0) 2023.05.17
Designed by Tistory.