리덕스(Redux)란?

앱레벨의 상태를 관리하는 라이브러리 (app-level-state management)

Redux를 써보자

이를 사용하기 위해 우선 예시 컴포넌트를 하나 만들자

import { Table } from 'react-bootstrap'

function Cart() {
    return (
        <div>
            <Table striped bordered hover>
                <thead>
                    <tr>
                        <th>#</th>
                        <th>상품명</th>
                        <th>수량</th>
                        <th>변경하기</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1</td>
                        <td>상품1</td>
                        <td>3</td>
                        <td>버튼</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>상품1</td>
                        <td>3</td>
                        <td>버튼</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>상품1</td>
                        <td>3</td>
                        <td>버튼</td>
                    </tr>
                </tbody>
            </Table>
        </div>
    )
}

export default Cart

//App.js
import Cart from './pages/Cart.js'

function App () {
    return (
      <Routes>
         <Route path="/cart" element={<Cart/>} />
      </Routes>
    )
}


Redux의 작동방식

  1. Redux를 설치하면 하나의 redux store.js를 만든다
  2. 그리고 이곳에 모든 state를 저장해준다.
  3. 이후 부터 state를 불러오고싶다면? props로 전달할 필요없이 redux.js 에 접근하여 state를 가져오면된다.

Redux 사용전 참고해야할 사항으로 React 18버전 이상부터 정상적으로 사용이 가능하다

Redux 사용준비

  1. 우선 Redux를 설치하자
npm install @reduxjs/toolkit react-redux
  1. 상태를 저장해줄 js 파일을 만들자
// /src에 store.js 를 만들고

import { configureStore } from "@reduxjs/toolkit";


export default configureStore({
    reducer: {
        
    }
})
  1. Redux를 사용할 최상단 페이지에 Import 해주자
import { Provider } from 'react-redux';
import store from './store.js';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
     <Provider store={store}>
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </Provider >
  </React.StrictMode>
);

Redux store에 값을 넣고 사용해보자

  1. 우선 상태를 생성하기 위해선 아래와 같이 추가해야한다.
// store.js

import { configureStore, createSlice } from "@reduxjs/toolkit";

// cart에 사용할 state를 만들어보자 (Redux는 이를 Slice라고한다.)
let user = createSlice({ //useState()와 비슷한 역할을 한다
    name: 'user', 
    initialState : 'kim',
}) // { user : 'kim' } 라는 오브젝트를 출력한다

let stock = createSlice({
    name: 'stock', 
    initialState : [10, 11, 12]
})

export default configureStore({
    reducer: {
        user : user.reducer,
        stock : stock.reducer
    }
})
  1. 이후 이를 사용할 컴포넌트 위치에 import 해주면 된다.
import { useSelector } from 'react-redux'

function App() {
    ...
    let a = useSelector((state)=> { return state })
    ...
	return (
    //...본문...
    )
}

참고 사항

useSelector((state)=> { return state })
useSelector((state)=> { return state.name })
useSelector((state)=> state.name )

예제

아래의 임시데이터를 redux를 사용해 cart.js라는 컴포넌트에 테이블로 구성해보자

[
  {id : 0, name : 'White and Black', count : 2},
  {id : 2, name : 'Grey Yordan', count : 1}
] 

풀이

// store.js
let items = createSlice({ 
    name: 'items',
    initialState: [
        {id : 0, name : 'White and Black', count : 2},
        {id : 2, name : 'Grey Yordan', count : 1}
      ] 
})

export default configureStore({
    reducer: {
        items : items.reducer,
    }
})

//Cart.js
import { useSelector } from 'react-redux'
function Cart() {

    let a = useSelector((state) => state.items)
    console.log(a)import { useSelector } from 'react-redux'
    return (
        <div>
            <Table striped bordered hover>
                <thead>
                    <tr>
                        <th>#</th>
                        <th>상품명</th>
                        <th>수량</th>
                        <th>변경하기</th>
                    </tr>
                </thead>
                <tbody>
                    {
                        a.map((item) => {
                            return (
                                <tr>
                                    <td>{item.id}</td>
                                    <td>{item.name}</td>
                                    <td>{item.count}</td>
                                    <td>버튼</td>
                                </tr>
                            )
                        })
                    }
                </tbody>
            </Table>
        </div>
    )
}