스토어, 리듀서, 액션까지 준비가 끝났으니 이제 투두리스트를 추가하고 삭제하는 기능을 만들어 볼거다.
useSelector
는 Redux-store 에 저장된 state 값을 반환한다.
import { useSelector } from 'react-redux';
const todos = useSelector(state => state);
text
와 id
가 추가되는 방식이다.// -store.ts
export interface ToDo {
text: string;
id: number;
}
export interface ToDoState extends Array<ToDo> {}
const initialState: ToDoState = [];
const toDos = createSlice({
name: "toDosReducer",
initialState,
reducers: {
add: (state, action) => {
state.push({ text: action.payload, id: Date.now() });
},
remove: (state, action) => {
return state.filter(toDo => toDo.id !== action.payload);
},
},
});
Home
컴포넌트에서 useSelector
를 사용해 불러왔다.connect
방법을 먼저 알았는데, useSelector
방식을 더 많이 사용하고 내가 보기에도 간결해보여서 이 방법으로 공부했다.function Home() {
const [text, setText] = useState("");
// 투두리스트 배열만 추출하여 currentState에 저장
const currentState = useSelector((state: ToDoState) => state);
const toDoList = currentState.map((toDo: ToDo) => toDo);
function handleChange(e: any) {
setText(e.target.value);
}
function handleSubmit(e: any) {
e.preventDefault();
dispatch(add(text));
setText("");
}
console.log(toDoList);
로 콘솔을 확인해보면Action 를 실행해서 Store 에 변경된 State 값을 저장하기 위해서 useDispatch 훅을 사용해 액션을 실행시켜야 한다.
즉, Dispatch 실행 -> Action 함수 실행 -> state 변경&저장
remove: (state, action) => {
return state.filter(toDo => toDo.id !== action.payload);
},
import { useDispatch } from 'react-redux'
const dispatch = useDispatch();
// - Home.tsx
function Home() {
const dispatch = useDispatch();
const btnOnClick = (e: any) => {
const targetId = parseInt(e.target.parentNode.id);
dispatch(remove(targetId));
};
.
.
.
return (
.
.
.
<ul>
{currentState.map((toDo: ToDo) => (
<li key={toDo.id} id={toDo.id.toString()}>
{toDo.text} <button onClick={btnOnClick}>X</button>
</li>
))}
</ul>
x 버튼
을 클릭할 경우 li
의 id
값을 찾아 li
를 삭제된다.dispatch(remove(targetId));
의 remove
는 store.ts
에서 만들어놓은 action
이다.