컴포넌트가 복잡해지면 props를 전송하기가 복잡해지는 상황이 생긴다.
그럴 때 redux를 설치해서 이용한다.
redux는 깊은 하위 컴포넌트들도 props 여러번 전송없이 state를 직접 가져다 쓸 수 있게 해준다.
yarn add redux react-redux
redux state 데이터 처리는 index.js에서 해준다.
데이터가 복잡하다면 데이터를 생성하는 파일을 따로 생성하여 처리한다.
index.js
import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'
import reportWebVitals from './reportWebVitals'
import { HashRouter } from 'react-router-dom'
import { Provider } from 'react-redux'
ReactDOM.render(
  <React.StrictMode>
    <HashRouter>
      <Provider>
        <App />
      </Provider>
    </HashRouter>
  </React.StrictMode>,
  document.getElementById('root')
)
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals()
Provider로 감싼 컴포넌트 혹은 html들은 같은 state를 공유 할 수 있다.
let store = createStore(() => {
  return [
    { id: 0, name: '에어맥스 2021', quan: 2 },
    { id: 1, name: '와플 트레이너 2', quan: 1 },
    { id: 2, name: '에어맥스 97', quan: 1 },
    { id: 3, name: '에어 줌 페가수스 38 플라이이즈', quan: 1 },
    { id: 4, name: '메트콘 7 X', quan: 1 },
    { id: 5, name: '줌 프릭 3', quan: 1 },
  ]
})
   ...
   <Provider store={store}>
     <App />
   </Provider>
   ...
원하는 컴포넌트에서 store에 있는 state를 쓰기 위해
맨 하단에 있는
export default 컴포넌트명 을
export default connect(함수명)(컴포넌트명) 으로 변경해주었다.
상단에 import { connect } from 'react-redux' 해준다.
redux store 데이터를 가져와서 props로 변환해주는 함수를 만든다.
그리고 store 데이터를 props로 등록한다.
function 함수명(state) {
  return {
    state: state,
  }
}
function Cart(props) {
  return (
    <div>
      <Table responsive>
        <thead>
          <tr>
            <th>#</th>
            <th>상품명</th>
            <th>수량</th>
            <th>변경</th>
          </tr>
        </thead>
        <tbody>
          {props.state.map((item, i) => {
            return (
              <tr key={i}>
                <td>{item.id + 1}</td>
                <td>{item.name}</td>
                <td>{item.quan}</td>
                <td></td>
              </tr>
            )
          })}
        </tbody>
      </Table>
    </div>
  )
}
