개발자를 향해...
[초보자를 위한 리덕스 101] #3.4 Deleting To Do ~ #3.6 Conclusions 본문
[초보자를 위한 리덕스 101] #3.4 Deleting To Do ~ #3.6 Conclusions
eugeneHwang1124 2021. 3. 10. 20:18본 글은 노마드코더 님의 [초보자를 위한 리덕스 101]을 수강하며 작성하였습니다.
#3.4 Deleting To Do
이제 ToDO.js에서 코드를 작성해보자.
import React from "react";
import { connect } from "react-redux";
import { actionCreators } from "../store";
function ToDo({ text, onBtnClick }) {
return (
<li>
{text} <button onClick={onBtnClick}>DEL</button>
</li>
);
}
export default connect(null, mapDispatchToProps)(ToDo);
삭제하는 버튼을 작성한다. home에서 이렇게 작성한 것을 Todo.map(toDo=>로 매칭시킨다.
<ul>
{toDos.map(toDo => (
<ToDo {...toDo} key={toDo.id} />
))}
</ul>
키 값을 주어 에러를 방지했다.
우리는 리스트를 삭제하기 위해 id를 부여했었다. ToDo를 지우기 위해 id가 필요하다. 이제 store.js로 가서 아래 부분을 바꾸어준다.
const deleteToDo = id => {
return {
type: DELETE,
id
};
};
const deleteToDo = id => {
return {
type: DELETE,
id: parseInt(id)
};
};
dispatch에 접근하기 위해 dispatch만 신경쓴다. state에 대해서는 신경쓰지 않는다. 따라서 ㅅToDo에서 mapdispatchToProps()를 통해 전달해야한다.
function mapDispatchToProps(dispatch, ownProps) {
return {
onBtnClick: () => dispatch(actionCreators.deleteToDo(ownProps.id))
};
}
버튼을 누르면 state로 올라간 text를 가져와야한다. addToDo()를 호출한다. 그러나 여기서는 이미 ownProps에 id를 가지고 있기 때문에 코드를 위와같이 작성했다.
#3.5 Detail Screen
Detail.js를 routes에 생성하고 코드를 작성해보자.
ToDo에 링크를 걸어 Detail로 이동하도록 해본다.
<ToDo.js>
import React from "react";
import { connect } from "react-redux";
import { actionCreators } from "../store";
import { Link } from "react-router-dom";
function ToDo({ text, onBtnClick, id }) {
return (
<li>
<Link to={`/${id}`}>
{text} <button onClick={onBtnClick}>DEL</button>
</Link>
</li>
);
}
function mapDispatchToProps(dispatch, ownProps) {
return {
onBtnClick: () => dispatch(actionCreators.deleteToDo(ownProps.id))
};
}
export default connect(null, mapDispatchToProps)(ToDo);
이제 클릭하면 해당 디테일 부분으로 이동하는 것을 잘 볼 수 있다.
Detail.js에서
import React from "react";
import {useParams} from "react-router-dom"
function Detail({ toDo }) {
const id=useParams();
console.log(id);
return <h1>Detail</h1>;
}
export default Detail;
여기서 문제는 우리가 이렇게 mapStateToProps로 저장할 수 있지만 state로부터 가져온 id를 이용해서 저장할 수 있다.
하지만 ownProps로 저장하는 방법도 있다.
import React from "react";
import { connect } from "react-redux";
function Detail({ toDo }) {
return (
<>
<h1>{toDo?.text}</h1>
<h5>Created at: {toDo?.id}</h5>
</>
);
}
function mapStateToProps(state, ownProps) {
const {
match: {
params: { id }
}
} = ownProps;
return { toDo: state.find(toDo => toDo.id === parseInt(id)) };
}
export default connect(mapStateToProps)(Detail);
find 메소드는 testing 함수를 만족하는 첫번째 요소를 반환한다. 여기서는 id와 같은 id를 가지는 toDo를 반환한다.
'웹 자바스크립트 공부 > ReactJS + node.js' 카테고리의 다른 글
[실전형 리액트 Hooks] #0.0 Instruction to Hooks ~ #1.3 useTabs (0) | 2021.03.19 |
---|---|
[초보자를 위한 리덕스 101] #4.0 Redux Toolkit ~ #4.5 Conclusions (0) | 2021.03.10 |
[초보자를 위한 리덕스 101] #3.2 mapStateToProps ~ #3.3 mapDispatchToProps (0) | 2021.03.09 |
[초보자를 위한 리덕스 101] #2.2 Delete To Do ~ #2.4 Conclusions (0) | 2021.03.09 |
[초보자를 위한 리덕스 101] #2.0 Vanilla ToDo ~ #2.1 State Mutation (0) | 2021.03.09 |