JS' 공부흔적

[React Redux] React에서 Redux를 사용해보자(2) 본문

Redux

[React Redux] React에서 Redux를 사용해보자(2)

이준수 2022. 1. 22. 15:41

이 글은 아래 글의 후속편이니 아래 글부터 보고 오는 것을 추천한다.

 

[React Redux] React에서 Redux를 사용해보자(1)

이 글은 Redux의 기본 개념에 대해 알고 있다고 가정하고 진행한다. 개념을 잘 모른다면 아래 포스팅을 참고하면 좋을 듯! [Redux] Vanilla Redux의 기본 개념 Redux는 Javascript의 상태 관리 라이브러리이

2junsu.tistory.com

이제 추가 기능을 구현했으니 삭제 기능을 구현해보자.

삭제 기능에서 해야할 것은 특정 할 일에 붙어있는 삭제 버튼을 누르면 해당 할 일을 삭제하는 것이다. 따라서 특정 할 일에 대한 id가 필요하다. 그 후 할 일들이 저장된 배열을 돌면서 해당 id를 가지는 할 일을 제외한 나머지를 새로운 배열에 넣은 후 리턴해주면 되는 것이다. 아래는 Redux 코드이다.

//할 일 삭제는 해당 할 일의 id를 이용하여 찾아낸 후 삭제한다.
const deleteTodo = (id) => {
  return { type: DELETE, id }
}

const reducer = (state = [], action) => {
  switch (action.type) {
   
   ...

    //filter함수를 사용하여 받은 id의 할 일을 제외하고 나머지를 리턴 -> 받은 id의 할 일만 빠진다.
    case DELETE:
      return state.filter((e) => e.id !== action.id)
    default:
      return state
  }
}

이를 적용할때는 id를 가지고 삭제 기능을 수행해야 하므로 useDispatch를 사용한다. 이를 사용하여 Action Creator인 deleteTodo를 호출하여 reducer에 접근하면 된다.

 

지난번 코드 중 화면에 할 일을 표시하는 부분을 잠깐 보자면 아래와 같은데

const todoList = useSelector((state) => state)

...

<h3>할 일</h3>
        <ul>
          {todoList.map((e) => (
            <Todo key={e.id} {...e} />
          ))}
        </ul>

useSelector를 사용하여 store에 저장된 값(할 일이 저장된 배열)을 불러온 후, map 함수를 사용하여 해당 배열을 돌면서 <Todo /> 컴포넌트로 배열의 원소 자체를 props로 넘겨줬다. 따라서 <Todo /> 컴포넌트에서는 우리가 addTodo를 사용하여 할 일 배열에 저장했던 text와 id를 사용할 수 있다.  따라서 Todo.js에서는 props로 받은 id와 deleteTodo를 사용하여 '삭제' 기능을 구현할 수 있다.

import React from 'react'
import { useDispatch } from 'react-redux'
import { ActionCreators } from './redux/store'

const Todo = ({ text, id }) => {
  const dispatch = useDispatch()
  const onClick = () => {
    dispatch(ActionCreators.deleteTodo(id))
  }

  return (
    <li>
      {text} <button onClick={onClick}>DEL</button>
    </li>
  )
}

export default Todo

이전 글에 이어서 코드는 모두 작성했다! 그러나 이렇게 실행하면 오류가 날 것이다. React Redux를 사용하기 위해서는 Redux에서 생성한 store와 React 앱을 연동해야 한다. index.js에 아래와 같이 Provider로 감싸주면 된다.

import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'
import reportWebVitals from './reportWebVitals'
import { Provider } from 'react-redux'
import store from './redux/store'

ReactDOM.render(
  <Provider store={store}>
    <React.StrictMode>
      <App />
    </React.StrictMode>
  </Provider>,
  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()

React와 store를 연동하기까지 했으면 잘 실행될 것이다!

 

 

728x90
반응형