프론트엔드 공부/react
redux todolist
maggieH
2021. 8. 10. 10:33
//reducer.js
const initialState = {
todos: [],
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case "ADD_TODO":
return {
...state,
todos: [...state.todos, action.payload],
};
case "DELETE_TODO":
return {
...state,
todos: state.todos.filter((todo) => todo.id !== action.payload),
};
default:
return state;
}
};
export default reducer;
//index.js
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import { Provider } from "react-redux";
import reducer from "./reducer";
import { createStore } from "redux";
const store = createStore(reducer);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
//App.js
import React, { Route, BrowserRouter, Switch } from "react-router-dom";
import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
const Todos = () => {
const dispatch = useDispatch();
const todos = useSelector((state) => state.todos);
const handleClick = (id) =>
dispatch({
type: "DELETE_TODO",
payload: id,
});
if (!todos || !todos.length) {
return <p>No Todos</p>;
}
return (
<ul>
{todos.map((todo) => (
<li onClick={() => handleClick(todo.id)}>{todo.label}</li>
))}
</ul>
);
};
const TodoInput = () => {
const dispatch = useDispatch();
const [newTodo, setNewTodo] = useState();
const handleChange = (event) => setNewTodo(event.target.value);
const handleClick = () =>
dispatch({
type: "ADD_TODO",
payload: {
label: newTodo,
id: Math.ceil(Math.random() * 100),
},
});
return (
<>
<input value={newTodo} onChange={handleChange} type="text" />
<button onClick={handleClick}>ADD TODO</button>
</>
);
};
function App() {
return (
<div className="App">
<header className="App-Header">Todos</header>
<Todos />
<TodoInput />
</div>
);
}
export default App;